引用在 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 中未正确终止的主要内容,如果未能解决你的问题,请参考以下文章