引用在 plsql 中未正确终止

Posted

技术标签:

【中文标题】引用在 plsql 中未正确终止【英文标题】:Quote not properly terminated in plsql 【发布时间】:2020-02-04 14:33:11 【问题描述】:

我正在学习 plsql 'EXECUTE IMMEDIATE'。因此,对于普通查询,使用它传递的声明为:

query:='SELECT * FROM TABLE_NAME';
execute immediate query;

但我想在查询字符串中传递光标值。但我对如何以正确的方式给出逗号感到困惑。我尝试过这样:

declare
query long;
cursor cur is
select a_name from ot.a;
begin
for i in cur
query='select * from ot.city  b where '||i.a_name||'=''kathmandu'';
EXECUTE IMMEDIATW query;
loop
dbms_output.put_line(i.a_name);
end loop;
end;
/

但它给了我这样的错误:

Error at line 1
ORA-01756: quoted string not properly terminated

使用引号的正确方法是什么?我知道我在引号中犯了错误,但是正确的方法是什么?

【问题讨论】:

kathmandu 之后需要 三个 单引号。前两个转换为单引号(在 SQL 查询的文本中需要)。第三个单引号实际上终止了您的查询(构成查询的引号字符串)。 你能举个例子吗?它还没有工作 执行即时查询; ?它是否正确?应该是 EXECUTE 立即查询; @Randomguy - “不工作”?以什么方式?我假设您现在遇到了另一个错误?那么,您有不同的问题吗? 【参考方案1】:

首先,如果是SELECT查询,则需要EXECUTE IMMEDIATE中的INTO子句。

其次,您的FOR loop 不正确。 它应该如下(execute immediate 应该在循环内)

for i in cur
Loop
..
..
End loop

对于缺少的单引号,使用以下查询:

query='select * from ot.city b where '
       || i.a_name 
       || '=''kathmandu''' ; --Only last single quote was missing.

你的逻辑一点都不清楚。为什么需要使用EXECUTE IMMEDIATE 执行查询。循环中没有使用返回的数据。

如果不是您需要的,请编辑答案或评论。

干杯!!

【讨论】:

【参考方案2】:

我认为这条线应该是这样的

query='select * from ot.city b where '||i.a_name||'='' || kathmandu || ''';

只是行尾少了一个撇号

【讨论】:

@Randomguy 抱歉,我在我的数据库上构建了一个错误的测试用例。这应该可以工作 select 'select * from ot.city b where '|| i.a_name ||' =''' ||加德满都|| '''' 来自 dual 但仅当 kathmandu 是表的名称时。如果这是一个字符串值,那么您应该说以下 select 'select * from ot.city b where '|| i.a_name ||' = ''kathmandu''' from dual 主要思想是 2 个撇号将在字符串中添加 1 个撇号 您在带引号的字符串中添加了连接运算符。 OP 的尝试虽然不正确,但比您的尝试要好。由于这个原因被否决了。【参考方案3】:

而不是

query='select * from ot.city  b where '||i.a_name||'=''kathmandu'';

放这个

query='select * from ot.city b where ' || i.a_name || '=''kathmandu'';';

【讨论】:

execute immediate 中的查询字符串不应以分号 (;) 结束。出于这个原因投反对票,但最好删除你的答案,因为它是 100% 错误的。

以上是关于引用在 plsql 中未正确终止的主要内容,如果未能解决你的问题,请参考以下文章

引用的字符串未正确终止

ORA-01756: 引用的字符串未正确终止

执行 oracle 更改查询时出现错误:ORA-01756:引用的字符串未正确终止

PHP中未终止的实体引用

SQL 引用的字符串未正确终止错误 - Oracle

PHP中未终止的实体引用