pl / sql将层次查询保存到变量

时间:2018-09-14 10:55:28

标签: oracle plsql

我正在尝试将分层查询的结果集保存到变量

 CREATE OR REPLACE FUNCTION test12 
    RETURN number IS
      result number(4):=0; 
      clli_array dbms_sql.varchar2_table;
    BEGIN 
       with tmp as (select 'strforregexp' str from dual) 
       select regexp_substr(str, '\/([A-Z0-9]{11}|[A-Z0-9]{8})', 1, level) STR into :clli_array from tmp
       connect by regexp_substr(str, '\/([A-Z0-9]{11}|[A-Z0-9]{8})', 1, level) is not null;
    END test12;

但是出现错误

  

错误(9,9):PLS-00049:错误的绑定变量'CLLI_ARRAY'

所以,我有2个问题

1)我可以获取所有符合正则表达式的查询吗

2)为什么我遇到错误

1 个答案:

答案 0 :(得分:2)

正如@APC所指出的,第一个问题是CLLI_ARRAY前面有一个冒号。这使PL / SQL编译器相信CLLI_ARRAY将是SQL * Plus替代变量,并且当发现未定义这样的变量时,它将引发错误。

但是,即使您移除了结肠,您仍未走出困境。删除冒号后,您将得到

PLS-00597: expression 'CLLI_ARRAY' in the INTO list is of wrong type

这是因为CLLI_ARRAY是PL / SQL类型的集合,但是您的语句返回单个字符串。

您可能想要做的是使用BULK COLLECT使系统将查询的所有结果检索到VARCHAR2_TABLE中:

with tmp as (select 'strforregexp' str from dual)
select regexp_substr(str, '\/([A-Z0-9]{11}|[A-Z0-9]{8})', 1, level) STR
  BULK COLLECT into clli_array
  from tmp
  connect by regexp_substr(str, '\/([A-Z0-9]{11}|[A-Z0-9]{8})', 1, level) is not null

好运。