使用游标或循环使用动态 SQL 自动创建表过程 - PLSQL
Automate Create tables procedure using Dynamic SQL using cursor or loop - PLSQL
语法:PL SQL
IDE:PL/SQL 开发人员
我正在尝试使用一系列区域代码为每个区域生成 4 tables。
我知道生成一个包含所有区域的 table 并截断并替换此 table 可能更有效,但是基于结构需要使用 我不允许这样做。
这 4 个区域来自特定 table
SELECT DISTINCT REGION
FROM REGION_TABLE
;
动态生成这一系列 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 部分中使用的 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;
如何将 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 子句。
语法:PL SQL IDE:PL/SQL 开发人员
我正在尝试使用一系列区域代码为每个区域生成 4 tables。
我知道生成一个包含所有区域的 table 并截断并替换此 table 可能更有效,但是基于结构需要使用 我不允许这样做。
这 4 个区域来自特定 table
SELECT DISTINCT REGION
FROM REGION_TABLE
;
动态生成这一系列 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 部分中使用的 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;
如何将 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 子句。