【问题标题】:Quote not properly terminated in plsql引用在 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 - “不工作”?以什么方式?我假设您现在遇到了另一个错误?那么,您有不同的问题吗?

标签: oracle plsql oracle11g


【解决方案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% 错误的。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-10-08
    • 1970-01-01
    • 2015-10-14
    • 1970-01-01
    相关资源
    最近更新 更多