【发布时间】:2015-08-09 18:03:36
【问题描述】:
我有一个问题,说这个
SELECT to_char(regexp_substr(q'{select * from dual minus select * from dual; select * from dual minus select * from dual;}'
, '[^;]+', 1, LEVEL)) FROM dual
CONNECT BY to_char(regexp_substr(q'{select * from dual minus select * from dual; select * from dual minus select * from dual;}', '[^;]+', 1, LEVEL)) IS NOT NULL;
它工作正常 - 拆分我的行
select * from dual 减号 select * from dual;从双重选择 * 减去 select * from dual;
一分为二
从双重减号中选择* 从双重中选择*
从双重选择 * 减去 select * from dual
在我添加一些线刹车之前一切都很好,就像这样
SELECT to_char(regexp_substr(q'{select * from dual minus select * from dual;
select * from dual minus select * from dual;}'
, '[^;]+', 1, LEVEL)) FROM dual
CONNECT BY to_char(regexp_substr(q'{select * from dual minus select * from dual;
select * from dual minus select * from dual;}', '[^;]+', 1, LEVEL)) IS NOT NULL;
这里变成了地狱:sql 将字符串中的; 视为查询的实际结束,ORA-01756 和其他东西......
如果我在; 之后添加一个随机符号,一切都很好,这样
SELECT to_char(regexp_substr(q'{select * from dual minus select * from dual;%
select * from dual minus select * from dual;}'
, '[^;]+', 1, LEVEL)) FROM dual
CONNECT BY to_char(regexp_substr(q'{select * from dual minus select * from dual;%
select * from dual minus select * from dual;}', '[^;]+', 1, LEVEL)) IS NOT NULL;
请解释此行为并提出解决方法。
UPD:在不同的 IDE(SQL 开发人员而不是 PL/SQL 开发人员)中进行了尝试。没有错误。也许这完全与编码有关...
UPD2:SQLPlus 的工作方式与 PL/SQL 开发人员在这种情况下的工作方式相同。 SQL 开发人员似乎有点“聪明”。不过,不知道为什么。
【问题讨论】:
-
第二种情况的输出是什么?d有问题?
-
@vks 是的。它没有输出,只给出一组以 ORA-01756 开头的异常,因为 oracle 将此查询视为 3 个未完成的查询。
-
不确定您从哪里获得编码。听起来这两个 IDE 解析语句的方式有所不同; PL/SQL Developer 似乎以不同的方式选择了行尾的语句分隔符。因为分隔符是客户端的东西,而不是 SQL 语句本身的一部分,所以这是意料之中的——不同的客户端处理它的方式略有不同也就不足为奇了。不同的 PL/SQL Developer 窗口的行为也可能不同。
-
您只是想解决这个特定问题,还是在寻找更通用的 SQL 语句拆分解决方案?如果要处理所有语句,则需要担心 cmets、替代引用机制字符串、plsql_declarations(并非所有分号都拆分字符串)等。
-
@JonHeller 我需要用于拆分 sql 的通用解决方案。如果有任何方法可以筛选字符串并阻止 db 解析它们 - 这也将解决您提到的所有问题。
标签: sql regex oracle exception