我正在尝试将分层查询的结果集保存到变量
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)为什么我遇到错误
答案 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
好运。