sql - 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;
谁能帮我解决这个问题
解决方案
单引号用于字符串文字;双引号用于标识符。
从有效的静态 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 - 使用单个匹配表;如果没有或不止一个,那么您对标量变量的查询将失败。根据您对表名的数字部分所做的操作,您可能希望使用游标并遍历所有提取的值。这是一个单独的问题。
推荐阅读
- maven-3 - maven:使用 junit 4 执行集成测试,覆盖父 pom 中的设置
- java - 如何在协议 netConf 和 Nso cisco 中使用 camunda
- r - 如何更改每个数据点的图例?
- ios-simulator - 如何从命令行将 ios 模拟器旋转为横向
- sql-server - SQL Server 2014 - 监听 SQL Server 代理作业与存储过程“等待延迟” - 每秒 - 选项?可能的开销问题?
- spring-boot - Docker-compose 在运行数小时后崩溃
- android - 如何为低于 23 的 API 级别在图层列表中设置可绘制 (PNG) 宽度和高度?
- oauth-2.0 - 在 Spring Boot 和 OAUTH2 SalesForce 会话期间刷新令牌
- sparql - Marklogic Triple store 是否支持 Ontology 中的 SWRL?
- azure - 使用 Azure 认知搜索从 Docx 文件中检索相关数据