【问题标题】:PL/SQL Check if a variable is in a list from Execute ImmediatePL/SQL 检查变量是否在立即执行的列表中
【发布时间】:2020-05-15 19:22:58
【问题描述】:

在一个函数中,我试图检查一个变量是否在一个列表中(这个列表来自EXECUTE IMMEDIATE),但是没有成功,我找不到正确的语法。

我还在PL/SQL - Use “List” Variable in Where In ClauseHow to pass varchar with single quotes to Stored Proc in Oracle [duplicate]How to add values to a VARRAY using a loop 上尝试了这种解决方案,但没有成功。

我创建了如下的 TABLE TYPE,但我不知道这样做是否正确。

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:在 IN 或 NOT IN 子句内的“PCOL”处发现类型不匹配

我该怎么做?最好的方法是什么?

【问题讨论】:

  • DBMS_OUTPUT.PUT_LINE('Total rows: '||v_Colunas.COUNT);如果注释异常处理之前的语句,这不会出错吗
  • v_Colunas的定义是什么?
  • @WoAiNii 对不起,这是 v_Results。我已经更新了帖子。该变量不存在。

标签: sql oracle plsql


【解决方案1】:

使用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 语句。)

db<>fiddle

【讨论】:

  • 它有效,它不知道使用EXECUTE IMMEDIATE ... BULK COLLECT INTOMEMBER OF。真的谢谢你!
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2018-02-25
  • 1970-01-01
  • 2017-02-14
  • 2023-03-31
  • 1970-01-01
相关资源
最近更新 更多