在函数中,我试图检查变量是否在列表中(该列表来自EXECUTE IMMEDIATE
),但没有成功,我找不到正确的语法为此。
我也在PL/SQL - Use “List” Variable in Where In Clause上尝试过这个解决方案, How to pass varchar with single quotes to Stored Proc in Oracle [duplicate]和 How to add values to a VARRAY using a loop ,但没有成功。
我创建了如下所示的表类型,但我不知道这是否是正确的方法。
CREATE OR REPLACE TYPE DS_FUNCESP.TP_BI_LIST AS TABLE OF VARCHAR2(4000)
我尝试过的:
CREATE OR REPLACE FUNCTION DS_FUNCESP.FNBIGB_CheckDataMissing2
(pOwn IN VARCHAR2, pTab IN VARCHAR2, pCol IN VARCHAR2) RETURN NUMBER IS
v_str VARCHAR2(2000);
BEGIN
v_Results := DS_FUNCESP.TP_BI_LIST();
v_Qtd := 1;
v_str := ' SELECT ''TEST1'' AS NM_COLUMN FROM DUAL UNION ALL
SELECT ''TEST2'' AS NM_COLUMN FROM DUAL UNION ALL
SELECT ''TEST3'' AS NM_COLUMN FROM DUAL';
EXECUTE IMMEDIATE v_str into v_Results;
-- I tried to show the TABLE TYPE to check if I was in the right way
DBMS_OUTPUT.PUT_LINE('Total rows: '||v_Results.COUNT);
-- Check if variable is in a table/array/list (which one is the right one?)
IF pCol IN (v_Results) THEN dbms_output.put_line('YES'); ELSE dbms_output.put_line('NO');
END IF;
EXCEPTION WHEN OTHERS THEN
RETURN 0;
END FNBIGB_CheckDataMissing2;
上面的代码不起作用,它给出了错误:
PLS-00383: type mismatch found at 'PCOL' inside an IN or NOT IN clause
我该怎么做?最好的方法是什么?
最佳答案
使用MEMBER OF
运算符:
CREATE FUNCTION DS_FUNCESP.FNBIGB_CheckDataMissing2 (
pOwn IN VARCHAR2,
pTab IN VARCHAR2,
pCol IN VARCHAR2
) RETURN NUMBER
IS
v_str VARCHAR2(2000);
v_results DS_FUNCESP.TP_BI_LIST;
BEGIN
v_str := ' SELECT ''TEST1'' AS NM_COLUMN FROM DUAL UNION ALL
SELECT ''TEST2'' AS NM_COLUMN FROM DUAL UNION ALL
SELECT ''TEST3'' AS NM_COLUMN FROM DUAL';
EXECUTE IMMEDIATE v_str BULK COLLECT INTO v_Results;
DBMS_OUTPUT.PUT_LINE('Total rows: '||v_Results.COUNT);
IF pCol MEMBER OF v_Results THEN
dbms_output.put_line('YES');
ELSE
dbms_output.put_line('NO');
END IF;
RETURN 1;
END;
/
(此外,将 v_Columas
更正为 v_Results
并将 EXECUTE IMMEDIATE ... INTO
更正为 EXECUTE IMMEDIATE ... BULK COLLECT INTO
,声明变量并添加 RETURN
语句。)
关于sql - PL/SQL 检查变量是否在立即执行的列表中,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/61826840/