【问题标题】:Automate Create tables procedure using Dynamic SQL using cursor or loop - PLSQL使用游标或循环使用动态 SQL 自动创建表过程 - PLSQL
【发布时间】:2016-12-16 17:20:29
【问题描述】:

语法:PL SQL IDE:PL/SQL 开发人员

我正在尝试使用一系列区域代码为每个区域生成 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;

使用上面的游标值,我如何将这些值不仅插入到 Sql 语句的 Create Table 部分中使用的表名中,而且作为 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;

【问题讨论】:

  • 创建表格似乎是一次性的工作。为什么你需要一个程序?
  • 这些是报表。 - 公司程序只需要他们即时重建。
  • 更好地截断和加载数据
  • 了解 - 但根据给定的要求,必须有 4 个唯一的表。

标签: sql for-loop plsql cursor create-table


【解决方案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 连接时的限制是什么,但如果它不起作用,那么可以使用绑定变量和 USING 子句。

【讨论】:

  • 这个过程运行得非常好,只用了几个星期就完成了。
  • 这个过程运行得很好,只用了一周时间就可以执行。 1. where 子句应该是 WHERE REGION = '''|| REC.REGION|||''' 谢谢
  • @BGDev 啊,这几乎每次都让我着迷。很高兴你把它整理好了!感谢您指出这一点,我会在答案中解决它。
猜你喜欢
  • 2019-10-11
  • 1970-01-01
  • 2020-12-28
  • 2016-04-02
  • 2021-11-22
  • 1970-01-01
  • 2020-03-21
  • 2015-01-28
相关资源
最近更新 更多