首页 > 解决方案 > ORA-00904: "\d+$": 无效标识符

问题描述

在 PL/SQL 中执行以下查询时,我收到 ORA-00904: "\d+$": invalid identifier 错误。

EXECUTE IMMEDIATE " select regexp_substr(table_name, "\d+$") result from user_tables where regexp_like(table_name, "\d+$") " into splitstring;

我也尝试使用单引号,但我仍然面临同样的错误。

EXECUTE IMMEDIATE ' select regexp_substr(table_name, "\d+$") result from user_tables where regexp_like(table_name, "\d+$") ' into splitstring;

谁能帮我解决这个问题

标签: sqloracleplsql

解决方案


单引号用于字符串文字;双引号用于标识符。

从有效的静态 SQL 语句开始:

select regexp_substr(table_name, '\d+$') result
from user_tables
where regexp_like(table_name, '\d+$')

然后要使其动态化,您必须将整个语句变成一个字符串;您可以通过将现有引号加倍来转义它们 - 请注意,这是两个单引号字符,而不是一个双引号字符:

EXECUTE IMMEDIATE 'select regexp_substr(table_name, ''\d+$'') result
  from user_tables
  where regexp_like(table_name, ''\d+$'')'
into splitstring;

或使用替代报价机制

EXECUTE IMMEDIATE q'^select regexp_substr(table_name, '\d+$') result
  from user_tables
  where regexp_like(table_name, '\d+$')^'
into splitstring;

你在这里不需要动态 SQL,你可以这样做:

select regexp_substr(table_name, '\d+$') result
into splitstring
from user_tables
where regexp_like(table_name, '\d+$');

db<>fiddle - 使用单个匹配表;如果没有或不止一个,那么您对标量变量的查询将失败。根据您对表名的数字部分所做的操作,您可能希望使用游标并遍历所有提取的值。这是一个单独的问题。


推荐阅读