使用 regexp_substr 时 SQL 获取缺少的表达式

Posted

技术标签:

【中文标题】使用 regexp_substr 时 SQL 获取缺少的表达式【英文标题】:SQL Getting missing expression when using regexp_substr 【发布时间】:2016-09-30 09:58:54 【问题描述】:

我的过程是:

create or replace PROCEDURE SP_TBL_COMPARE_TEST3(
    SRC_COLS     IN VARCHAR2,
    TGT_COLS     IN VARCHAR2)
IS
  CNT1     NUMBER(5);
  SQL_TEXT2 VARCHAR(4000);

BEGIN
  SQL_TEXT2:= 'select count(*) from (select regexp_substr('||src_cols||','||'[^,]+'||', +1, level) from dual connect by regexp_substr('||src_cols||','||'[^,]+'||', +1, level) is not null )'; 
  EXECUTE IMMEDIATE SQL_TEXT2 into CNT4;
END

我正在尝试获取 src cols 的输入并分离以计算它们,但我收到了无效标识符错误。但是输入中的列是可用的,并且是准确的

正在连接到数据库 sp_test。 ORA-00936: 缺少表达式 ORA-06512:在“SP_TEST.SP_TBL_COMPARE_TEST3”,第 19 行 ORA-06512:在 第 13 行 进程退出。与数据库 sp_test 断开连接

谁能告诉我怎么了?

【问题讨论】:

如果您计算列表元素,您可以简化:select regexp_count('1,2,3,4', ',')+1 from dual;。当然要确保数据不包含分隔符。 【参考方案1】:

您在动态 SQL 中缺少一些引号;这应该工作:

create or replace PROCEDURE SP_TBL_COMPARE_TEST3(
    SRC_COLS     IN VARCHAR2,
    TGT_COLS     IN VARCHAR2)
IS
  CNT1     NUMBER(5);
  SQL_TEXT2 VARCHAR(4000);

BEGIN
  SQL_TEXT2:= 'select count(*) from (select regexp_substr('''||src_cols||''','||'''[^,]+'||''', +1, level) from dual connect by regexp_substr('''||src_cols||''','||'''[^,]+'||''', +1, level) is not null )'; 
  dbms_output.put_line(SQL_TEXT2);
  EXECUTE IMMEDIATE SQL_TEXT2 into CNT1;
END;

此外,请注意您从不使用过程的第二个参数。

【讨论】:

以上是关于使用 regexp_substr 时 SQL 获取缺少的表达式的主要内容,如果未能解决你的问题,请参考以下文章

尝试使用 REGEXP_SUBSTR 时出现错误 (PLS-00201)

Oracle SQL 正则表达式 (regexp_substr)

Oracle SQL 正则表达式 RegExp_SubStr End Of Line (chr(10) 在搜索文本中返回 null

HIVE SQL 中的 REGEXP_SUBSTR 等效项?

SQL Clob 在 Clob 中使用连接搜索多个字符串,可能是 REGEXP_SUBSTR

SQL REGEX + 使用 REGEXP_SUBSTR() 电话号码第 5 位为“5”的所有联系人的电话号码