2016-12-16 32 views
-1

语法:PL SQL IDE:PL/SQL开发人员自动化创建使用动态SQL使用游标或循环表程序 - PLSQL

我试图生成4桌使用了一系列区域码的每个区域。

据我所知,生成一个包含所有区域的表格并截断并替换此表格可能会更有效率,但基于所需的结构,我不允许这样做。

4个地区来自特定表

SELECT DISTINCT REGION 
FROM REGION_TABLE 
; 

什么是产生这一系列动态表的最佳方法是什么?

我试图使用游标和循环,但我不确定将此游标集成到以下过程中的方法。

DECLARE 
CURSOR C_REGION IS 
     SELECT DISTINCT REGION FROM REGION_TABLE ; 
BEGIN 
    FOR L_IDX IN C_REGION 
    LOOP 
    DBMS_OUTPUT.PUTLINE(L_IDX.C_REGION); 
    END LOOP; 
END; 

使用上面的光标值,我怎么去在where子句中

-- 4 REGIONS - NORTH SOUTH EAST WEST, 

CREATE OR REPLACE PROCEDURE SALES_ORDER_TBL_PROC 
      (
      REGION IN VARCHAR2 
      , RETURNCODE OUT NUMBER 
      , ERROR_MESSAGE OUT VARCHAR2 
     ) 
      IS 
    TABLE_NAME VARCHAR2(30); 
    SQL_STR VARCHAR2; 
    REGION_VAR VARCHAR;   
BEGIN 
    TABLE_NAME := 'SALES_COUNT_'||REGION_VAR; 
    SQL_STR := 'CREATE TABLE '||TABLE_NAME|| 
      ' AS 
       (
       SELECT 
         REGION 
          , COUNT(DISTINCT MEMBER_ID) AS NUM_MBR 
         FROM INCREMENTAL_SALES_TBL 
         WHERE 1=1 
          AND REGION = '||REGION_VAR|| 
          'GROUP BY REGION)' 
       ; 

EXECUTE IMMEDIATE SQL_STR ; 

     RETURNCODE := 0; 

EXCEPTION WHEN OTHERS THEN 

     RETURNCODE := SQLCODE; 

     ERROR_MESSAGE :='ERR:Creating/Altering table '||TABLE_NAME ||'-'||SQLERRM; 
END; 
/

BEGIN 
    SALES_ORDER_TBL_PROC; 
END; 
将这些值不仅在SQL语句创建表部分使用的表名称,但作为一个参数
+1

创建表格看起来像是一次性工作。为什么你需要一个程序呢? – GurV

+0

这些是报告表。 - 公司程序只需要他们在飞行中重建。 – BGDev

+1

更好地截断和加载数据 – GurV

回答

1

把DDL放在for循环中怎么样?我还没有测试过下面的代码,但是至少应该让你朝着你的目标前进。

FOR rec IN (SELECT DISTINCT REGION FROM REGION_TABLE) LOOP 
    EXECUTE IMMEDIATE 
    'CREATE TABLE SALES_COUNT_' || UPPER(rec.region) || ' AS (
     SELECT REGION, 
       COUNT(DISTINCT MEMBER_ID) AS NUM_MBR 
     FROM INCREMENTAL_SALES_TBL 
     WHERE REGION = ''' || rec.region || ''' 
     GROUP BY REGION)'; 
END LOOP; 

我不记得,当它与EXECUTE IMMEDIATE以级联的限制是什么,但如果它不是那么工作有可能使用绑定变量和使用条款。

+0

这个过程运行得非常好,并执行一些tweeks。 – BGDev

+0

这个过程运行得非常好,并执行一个tweek。 1. where子句应该是WHERE REGION ='''|| REC.REGION |||'''谢谢 – BGDev

+0

@BGDev啊,这让我几乎每一次。很高兴你把它整理出来!谢谢你指出,我会解决它的答案。 – tilper