【问题标题】:How can I pass comma separated value in cursor's select statement where clause如何在光标的 select 语句 where 子句中传递逗号分隔值
【发布时间】:2019-02-20 09:38:45
【问题描述】:

我有以下块,它有一个光标和一个选择查询。我想传递选择的输出,用逗号分隔成 游标的select语句,放到where子句中。 我知道下面的代码会因为 Declare 部分中的 SQL 查询而引发错误,但是我如何使用数组或集合来实现这一点。

这里,id 列是数字

代码sn-p:

declare
test varchar2(30);
SELECT LISTAGG(value, ', ') WITHIN GROUP (ORDER BY value2) into test from table3 where value2=12;
cursor c1 (select * from table where id in (test))
begin
for i in c1 loop
null;
end loop;
end;

【问题讨论】:

    标签: sql oracle plsql


    【解决方案1】:

    你为什么要这样做?

    你可以简单的写你选择为:

    Select * from table where id in (select value from table3 where value2=12)

    编辑:

    你还需要打开你的光标 c1,它才能在 AFAIK 中工作。

    【讨论】:

    • 隐式游标循环不需要OPEN 语句
    • “你为什么要这样做?”当您想在从第一个表中读取过滤器值并使用它们过滤第二个表的输出之间使用 PL/SQL 处理值列表时。
    • @MT0 但是没有理由把它变成 2 个 SQL 语句,并将回复保存在一个作用域变量中。当您可以构建整个光标并且只执行 1 次 IO 时。
    • 在这种简单的情况下,当您在获取值和过滤它们之间没有做任何事情时,那么没有理由但是如果您引入一个中间步骤,在最终查询之前处理过滤器值列表那么有理由使用 2 个 SQL 语句。这正是我在之前的评论中提出的观点。
    • 好的,但我们不要让它成为一种习惯,并推断出比 OP 所要求的更复杂的情况。
    【解决方案2】:

    您可以使用集合和MEMBER OF 运算符:

    Oracle 设置

    CREATE TYPE IntegerList  AS TABLE OF NUMBER(8,0);
    /
    
    CREATE TABLE table1 ( value, value2 ) AS
    SELECT 1, 1 FROM DUAL UNION ALL
    SELECT 3, 4 FROM DUAL UNION ALL
    SELECT 5, 3 FROM DUAL UNION ALL
    SELECT 7, 2 FROM DUAL;
    
    CREATE TABLE table2 ( id, value ) AS
    SELECT 1, 11 FROM DUAL UNION ALL
    SELECT 2, 22 FROM DUAL UNION ALL
    SELECT 3, 33 FROM DUAL UNION ALL
    SELECT 7, 77 FROM DUAL;
    

    PL/SQL

    DECLARE
      test IntegerList;
      c1 SYS_REFCURSOR;
    BEGIN
      SELECT value
      BULK COLLECT INTO test
      FROM   table1;
    
      FOR r IN ( SELECT * FROM table2 WHERE id MEMBER OF test ) LOOP
        DBMS_OUTPUT.PUT_LINE( r.id || ', ' || r.value );
      END LOOP;
    END;
    /
    

    输出

    1, 11
    3, 33
    7, 77
    

    db小提琴here

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2019-08-23
      • 1970-01-01
      • 1970-01-01
      • 2020-12-09
      • 2018-04-08
      • 1970-01-01
      • 2018-01-29
      • 1970-01-01
      相关资源
      最近更新 更多