Oracle数据库数据恢复、性能优化

找回密码
注册
搜索
热搜: 活动 交友 discuz
发新帖

3

积分

0

好友

1

主题
1#
发表于 2014-5-19 21:26:03 | 查看: 3200| 回复: 1
遇到一个奇怪的现象,我在运行PLSQL包时,各个子过程都有commit,当前3个子过程运行结束,第4个子过程正在运行时,打开一个窗口去select第1个子过程insert的表,没有数据,要等整个程序执行完了才有数据。这是什么原因呢?(第1个子过程中,是先将表设为nologging,然后执行DML并Commit,再将表设为logging)。

主过程代码:

  1. PROCEDURE Main_P(x_errbuf  OUT VARCHAR2,
  2.                    x_retcode OUT NUMBER,
  3.                    p_object  IN PLS_INTEGER DEFAULT 0,
  4.                    p_mode    IN PLS_INTEGER DEFAULT 1) IS
  5.     e_sql_block_err EXCEPTION;
  6.     l_debug_flag VARCHAR2(100) := '0';
  7.   BEGIN
  8.     KLAR_Fact_Load_P(x_errbuf, x_retcode, 0);
  9.   
  10.     IF p_object = 0 THEN
  11.       KLAR_Business_Unit_Dim_Load_P(x_errbuf, x_retcode, p_mode);
  12.    
  13.       KLAR_Customer_Dim_Load_P(x_errbuf, x_retcode, p_mode);
  14.    
  15.       KLAR_Sales_Rigion_Dim_Load_P(x_errbuf, x_retcode, p_mode);
  16.    
  17.       KLAR_Fact_Load_P(x_errbuf, x_retcode, p_mode);
  18.    
  19.     ELSE
  20.       NULL;
  21.     END IF;
  22.   EXCEPTION
  23.     WHEN e_sub_proc_err THEN
  24.       -- e_sub_proc_err is an exit for exceptions of sub-procedures only.
  25.       NULL;
  26.     WHEN e_sql_block_err THEN
  27.       output_line(log, 'Main_P e_sql_block_err:');
  28.       output_line(log, x_errbuf);
  29.       x_errbuf  := 'Main_P e_sql_block_err- ' || x_errbuf;
  30.       x_retcode := c_error;
  31.     WHEN OTHERS THEN
  32.       output_line(log,
  33.                   'Main_P Error at ' || l_debug_flag || ': ' || CHR(10) ||
  34.                   SQLERRM);
  35.       x_errbuf  := 'Main_P Error at ' || l_debug_flag || ': ' || SQLERRM;
  36.       x_retcode := c_error;
  37.   END Main_P;
复制代码
第1个子过程的代码:

  1.   PROCEDURE KLAR_Business_Unit_Dim_Load_P(x_errbuf  OUT NOCOPY VARCHAR2,
  2.                                           x_retcode OUT NOCOPY NUMBER,
  3.                                           p_mode    IN PLS_INTEGER) IS
  4.     l_debug_flag VARCHAR2(100) := '0';
  5.   BEGIN
  6.     -- Disable idx
  7.     l_debug_flag := 'Disable idx 1';
  8.     EXECUTE IMMEDIATE 'ALTER INDEX KLCUX.KLAR_BUSINESS_UNIT_DIM_N1 UNUSABLE';
  9.   
  10.     -- Load data
  11.     l_debug_flag := 'Load data 1';
  12.     MERGE INTO KLCUX.KLAR_BUSINESS_UNIT_DIM t
  13.     USING (SELECT hou.organization_id org_id,
  14.                   hou.name            operation_unit,
  15.                   ffv.flex_value      company_code,
  16.                   ffvt.description    company_name
  17.              FROM HR_ALL_ORGANIZATION_UNITS hou
  18.              JOIN HR_ORGANIZATION_INFORMATION hoi
  19.                ON hoi.organization_id = hou.organization_id
  20.               AND hoi.org_information_context = 'Operating Unit Information'
  21.              JOIN XLE_ENTITY_PROFILES xep
  22.                ON xep.legal_entity_id = hoi.org_information2
  23.              JOIN FND_FLEX_VALUES ffv
  24.                ON ffv.flex_value = xep.legal_entity_identifier
  25.               AND ffv.enabled_flag = 'Y'
  26.              JOIN FND_FLEX_VALUES_TL ffvt
  27.                ON ffvt.flex_value_id = ffv.flex_value_id
  28.               AND ffvt.language = 'ZHS'
  29.              JOIN FND_FLEX_VALUE_SETS ffvs
  30.                ON ffvs.flex_value_set_id = ffv.flex_value_set_id
  31.               AND ffvs.flex_value_set_name = 'KL_COA_CO') s
  32.     ON (t.org_id = s.org_id)
  33.     WHEN MATCHED THEN
  34.       UPDATE
  35.          SET t.operation_unit = s.operation_unit,
  36.              t.company_code   = s.company_code,
  37.              t.company_name   = s.company_name
  38.     WHEN NOT MATCHED THEN
  39.       INSERT
  40.         (t.skid, t.org_id, t.operation_unit, t.company_code, t.company_name)
  41.       VALUES
  42.         (KLCUX.KLAR_BUSINESS_UNIT_DIM_S.nextval,
  43.          s.org_id,
  44.          s.operation_unit,
  45.          s.company_code,
  46.          s.company_name);
  47.     COMMIT;
  48.   
  49.     -- Rebuilt and enable idx
  50.     l_debug_flag := 'Rebuilt idx 1';
  51.     EXECUTE IMMEDIATE 'ALTER INDEX KLCUX.KLAR_BUSINESS_UNIT_DIM_PK REBUILD';
  52.     l_debug_flag := 'Rebuilt idx 2';
  53.     EXECUTE IMMEDIATE 'ALTER INDEX KLCUX.KLAR_BUSINESS_UNIT_DIM_N1 REBUILD';
  54.   
  55.   EXCEPTION
  56.     WHEN OTHERS THEN
  57.       output_line(log,
  58.                   'KLAR_Business_Unit_Dim_Load_P Error at ' || l_debug_flag || ': ' ||
  59.                   CHR(10) || SQLERRM);
  60.       x_errbuf  := 'KLAR_Business_Unit_Dim_Load_P Error at ' || l_debug_flag || ': ' ||
  61.                    SQLERRM;
  62.       x_retcode := c_error;
  63.       RAISE e_sub_proc_err;
  64.   END KLAR_Business_Unit_Dim_Load_P;
复制代码
2#
发表于 2014-5-19 21:29:41
当第4个子过程的DML对象(KLAR_FACT)占用空间在增长时,在新窗口中SELECT第1个子过程的DML对象,没有数据。

  1. select bytes/1024/1024 as "Size(MB)" from dba_Segments where Segment_Name='KLAR_FACT';

  2. select * from KLCUX.KLAR_BUSINESS_UNIT_DIM;
复制代码

回复 只看该作者 道具 举报

您需要登录后才可以回帖 登录 | 注册

QQ|手机版|Archiver|Oracle数据库数据恢复、性能优化

GMT+8, 2024-12-21 03:42 , Processed in 0.077297 second(s), 21 queries .

Powered by Discuz! X2.5

© 2001-2012 Comsenz Inc.

回顶部
TEL/電話+86 13764045638
Email service@parnassusdata.com
QQ 47079569