【问题标题】:looping through an array for the where condition pl/sql循环遍历数组以获取 where 条件 pl/sql
【发布时间】:2018-12-04 19:31:58
【问题描述】:

是否可以在 pl/sql 中循环遍历需要进入 pl/sql 语句的 WHERE 子句的多个 id。 sql 语句本身非常简单,但我需要遍历多个 id:

SELECT x_name
FROM table_x
WHERE x_id = {array of 90 id's};

如何在此处插入 90 个 id 以便 sql 对其进行迭代?我尝试使用光标 For Loop,但我被卡住了。下面的代码是错误的,但它可能表明我试图在这里实现什么

DECLARE
  TYPE x_id_array IS VARRAY(3) OF NUMBER;
  CURSOR cur_x_id (x_ondz_id NUMBER) IS
  SELECT x_name
  FROM table_x
  WHERE x_id = var_ondz_id;
  loop_total integer;
  x_id x_id_array;
  name VARCHAR;
BEGIN
  x_id_new := x_id_array(8779254, 8819930, 8819931); --3 for testing
  loop_total := x_id_new.count;
  FOR i in 1 .. loop_total LOOP
    dbms_output.put_line('x_id: ' || x_id_new(i) || '= Name: ' || x_name );
  END LOOP;
END;
/

预期的输出将是

x_id: 8779254= Name: Name_1 
x_id: 8819930= Name: Name_2
x_id: 8819931= Name: Name_3
...
... etc for all 90 id's in the array 

感谢任何帮助

【问题讨论】:

    标签: oracle for-loop plsql iteration


    【解决方案1】:

    我们可以在集合上使用TABLE 函数来获取数字/字符列表。

    SELECT *
    FROM TABLE ( sys.odcinumberlist(8779254,8819930,8819931) );
    
    8779254
    8819930
    8819931
    

    这里我使用的是Oracle内部的VARRAY,限制为32767。你可以使用自己的NESTED TABLE类型。

    create OR REPLACE TYPE yourtype AS TABLE OF NUMBER;
    

    然后选择它。

    SELECT *
    FROM TABLE ( yourtype(8779254,8819930,8819931) );
    

    所以,您的查询可以简单地写成

    SELECT x_name
    FROM table_x
    WHERE x_id IN ( SELECT * FROM 
           TABLE ( yourtype(8779254,8819930,8819931) ) );
    

    12.2 及更高版本,您甚至不需要指定TABLE

    SELECT * FROM yourtype(8779254,8819930,8819931) 有效。

    【讨论】:

    • 谢谢,这适用于我需要包含的所有 id。不过,快速提问:yourtype 表是一个临时表,在查询完成后会被删除或删除?
    • @CMorgan:不客气。如果您认为它对您有用,请考虑接受它,以便它也可以帮助他人。关于您的问题:不,yourtype 不是数据库表,它是嵌套表类型,一旦创建就永久存在。因此,创建它是一项可以独立进行的一次性操作。
    • 谢谢,这会影响服务器的存储吗,我用了以后还是放下比较好?我不确定我是否正确理解了这个嵌套表是如何工作的,我担心会有额外的表只使用一次,但会占用空间。
    • @CMorgan :您似乎无缘无故地担心。正如我已经提到的,嵌套表类型不是数据库表,尽管名称中有一个“表”。它也不存储物理数据和占用空间。这只是说明该类型在运行时将在内存中保存什么样的数据的规范。阅读this以了解有关类型的更多信息
    猜你喜欢
    • 2023-03-19
    • 1970-01-01
    • 2014-09-27
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-07-30
    相关资源
    最近更新 更多