首页 > 解决方案 > DBMS_WM 导出 Oracle DB 中的条件

问题描述

我的 Oracle 数据库中有一些版本化的表。
我需要根据某些条件将这些表从一个数据库导出到另一个数据库。
我使用了来自oracle-docs 的以下代码, 我需要基于 sql 在 Workspace 下导出。

/*    LT table with join condition */         
    SELECT
        H1.workspace , count(*)
        FROM  WMSYS.ALL_VERSION_HVIEW H1,
              EMPLOYEE_LT M1,
              DEPT_LT t1 
        WHERE H1.version=M1.wm_version 
        and t1.empid=M1.empid 
        and t1.deptid in (select d_id
                            from DEPT_LOC
                           where Location = 'NORWAY'
                          );

在此处输入图像描述

这是我的导出代码

execute dbms_wm.Export('EMPLOYEE','EMPLOYEE_STG','WS-27917', export_scope=>DBMS_WM.EXPORT_MODIFIED_DATA_ONLY,AUTO_COMMIT=>TRUE);
execute dbms_wm.Export('EMPLOYEE','EMPLOYEE_STG','WS-38904', export_scope=>DBMS_WM.EXPORT_MODIFIED_DATA_ONLY,AUTO_COMMIT=>TRUE);
execute dbms_wm.Export('EMPLOYEE','EMPLOYEE_STG','WS-39376', export_scope=>DBMS_WM.EXPORT_MODIFIED_DATA_ONLY,AUTO_COMMIT=>TRUE);

像上面一样,我对所有不同的工作区运行了相同的查询。这个查询的输出就像我将EMPLOYEE_STG使用我在查询中传递的工作空间创建的一样。

但实时整个员工表已创建为EMPLOYEE_STG包含所有记录的表

/*    ONLY LT table */ 
SELECT
      H1.workspace , count(*)
      FROM  WMSYS.ALL_VERSION_HVIEW H1 , 
            EMPLOYEE_LT M1
      WHERE H1.version=M1.wm_version
group by  H1.workspace                       
    ;

/*    STG table after dbms_wm.export() */     
    SELECT WM$WORKSPACE, count(*) 
    FROM EMPLOYEE_STG 
    group by WM$WORKSPACE;

在此处输入图像描述

现在我只需要那些由于上述 sql 而不是完整的 Employee 表的工作空间。但我dbms_wm.export正在创建整张桌子。

Oracle 文档中,我看到了类似where条件的以下部分,但我不确定如何使用它。如何在. _dbms_wm.export()在此处输入图像描述 在此处输入图像描述

标签: oracleoracle11goracle-sqldeveloperoracle-apexplsqldeveloper

解决方案


最后我成功地创建了一个有条件的导出表。步骤不是直接的方法。实现这一点需要引用游标和记录类型变量。

set serveroutput on
    DECLARE
      TYPE r_cursor IS REF CURSOR;
      c_object r_cursor;
      TYPE rec_emp IS RECORD
      (
        v_ws  WMSYS.ALL_VERSION_HVIEW.WORKSPACE%type,
        v_empid    EMPLOYEE_LT.empid%type
      );
      v_rec rec_emp;
      v_exporttable VARCHAR2(100):='EMPLOYEE';
      v_location  VARCHAR2(100):='NORWAY';
      v_cursor_SQL VARCHAR2(4000);
    BEGIN
    v_cursor_SQL := '
                SELECT 
                DISTINCT H1.WORKSPACE, M1.empid
                FROM  WMSYS.ALL_VERSION_HVIEW H1,
                      '||v_exporttable||'_LT M1,
                      DEPT_LT t1 
                WHERE H1.version=M1.wm_version 
                and t1.empid=M1.empid 
                and t1.deptid in (select d_id from DEPT_LOC where Location = '||v_location||')';
    -- dbms_output.put_line(v_cursor_SQL);
      OPEN c_object FOR v_cursor_SQL;
      LOOP
          FETCH c_object INTO v_rec;
          exit when c_object%NOTFOUND;
          dbms_wm.Export(v_exporttable,v_exporttable||'_STG',v_rec.v_ws,where_clause=>'empid='||v_rec.v_empid,export_scope=>DBMS_WM.EXPORT_MODIFIED_DATA_ONLY,AUTO_COMMIT=>TRUE);
      END LOOP;
      CLOSE c_object;
    END;
    /

推荐阅读