Я пытался найти способы динамического изменения имени таблицы в запросе, но пока не нашел работающего.Запрос содержит повторяющийся код (около 150 строк кода внутри каждого оператора case), поэтому я пытаюсь найти лучший способ сделать это.
Моя текущая процедура выглядит следующим образом:
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 предложили следующий формат, но он выдает сообщение об ошибке «Table 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;