【发布时间】:2019-11-05 12:45:04
【问题描述】:
我一直在尝试寻找在查询中动态更改表名的方法,但到目前为止还没有找到可行的方法。该查询有重复的代码(每个 case 语句中大约有 150 行代码),所以我试图找到一种更好的方法。
我当前的程序如下所示:
CREATE OR REPLACE PROCEDURE PROC_MY_TEST (P_INPUTVAR NUMBER,
P_OUT OUT SYS_REFCURSOR)
AS
BEGIN
CASE P_INPUTVAR
WHEN 1
THEN
OPEN P_OUT FOR
WITH CTE
AS (SELECT COL_M, COL_N
FROM TBL_TEST
WHERE COL_G = 'mycondition1')
SELECT COL_M, COL_N
FROM TABLE_A a LEFT JOIN CTE m ON a.col1 = b.col1
WHERE a.col2 = 'xyz' AND b.col4 = 'abc';
WHEN 2
THEN
OPEN P_OUT FOR
WITH CTE
AS (SELECT COL_M, COL_N
FROM TBL_TEST
WHERE COL_G = 'mycondition1')
SELECT COL_M, COL_N
FROM TABLE_B a LEFT JOIN CTE m ON a.col1 = b.col1
WHERE a.col2 = 'xyz' AND b.col4 = 'abc';
WHEN 3
THEN
OPEN P_OUT FOR
WITH CTE
AS (SELECT COL_M, COL_N
FROM TBL_TEST
WHERE COL_G = 'mycondition1')
SELECT COL_M, COL_N
FROM TABLE_C a LEFT JOIN CTE m ON a.col1 = b.col1
WHERE a.col2 = 'xyz' AND b.col4 = 'abc';
WHEN 4
THEN
OPEN P_OUT FOR
WITH CTE
AS (SELECT COL_M, COL_N
FROM TBL_TEST
WHERE COL_G = 'mycondition1')
SELECT COL_M, COL_N
FROM TABLE_D a LEFT JOIN CTE m ON a.col1 = b.col1
WHERE a.col2 = 'xyz' AND b.col4 = 'abc';
END CASE;
END;
一些 SQL 解决方案建议使用以下格式,但它给出了“表 L_Temp 不存在”的错误消息:
CREATE OR REPLACE PROCEDURE PROC_MY_TEST (P_INPUTVAR NUMBER,
P_OUT OUT SYS_REFCURSOR)
AS
L_Temp VARCHAR2 (200);
BEGIN
L_Temp :=
CASE P_INPUTVAR
WHEN 1 THEN 'TABLE_A'
WHEN 2 THEN 'TABLE_B'
WHEN 3 THEN 'TABLE_C'
WHEN 4 THEN 'TABLE_D'
ELSE NULL
END;
OPEN P_OUT FOR
WITH CTE
AS (SELECT COL_M, COL_N
FROM TBL_TEST
WHERE COL_G = 'mycondition1')
SELECT COL_M, COL_N
FROM L_Temp a LEFT JOIN CTE m ON a.col1 = b.col1
WHERE a.col2 = 'xyz' AND b.col4 = 'abc';
END;
当所有目标表都包含相似的列名时,我们是否可以动态更改表名?
*已编辑 * 为其他更新语句示例添加了代码:
CREATE OR REPLACE PROCEDURE PROC_MY_TEST (P_INPUTVAR NUMBER,
P_OUT OUT SYS_REFCURSOR)
AS
L_Temp VARCHAR2 (200);
L_Total NUMBER;
BEGIN
L_Temp :=
CASE P_INPUTVAR
WHEN 1 THEN 'TABLE_A'
WHEN 2 THEN 'TABLE_B'
WHEN 3 THEN 'TABLE_C'
WHEN 4 THEN 'TABLE_D'
ELSE NULL
END;
OPEN P_OUT FOR
WITH CTE
AS (SELECT COL_M, COL_N
FROM TBL_TEST
WHERE COL_G = 'mycondition1')
SELECT COL_M, COL_N
FROM L_Temp a LEFT JOIN CTE m ON a.col1 = b.col1
WHERE a.col2 = 'xyz' AND b.col4 = 'abc';
SELECT TOTAL INTO L_Total FROM L_Temp;
UPDATE TBL_TEST2
SET a.TOTAL = l_Total
WHERE a.col2 = 'xyz';
END;
【问题讨论】:
标签: sql oracle stored-procedures plsql dynamic-sql