【问题标题】:Oracle PL - SQL - "SQL command not properly ended" on an update statementOracle PL - SQL - 更新语句上的“SQL 命令未正确结束”
【发布时间】:2015-03-16 19:22:36
【问题描述】:

我有两个由“立即执行”函数启动的更新语句。一个工作正常,但另一个抛出 “SQL 命令未正确结束” 错误。

声明工作正常:

 EXECUTE IMMEDIATE 'UPDATE myTable SET column_xpto = ' ||my_var|| ' WHERE myTable.name_table = '''||nameT||'''';

声明无效:

EXECUTE IMMEDIATE 'UPDATE myTable SET column_X = ' ||my_other_var|| ' WHERE myTable.name_table = '''||nameT||'''';

变量“my_var”是 NUMBER 类型,而变量“my_other_var”是时间戳 (6),使用 CURRENT_TIMESTAMP 初始化。

desc myTable 
Name             Null     Type          
---------------- -------- ------------- 
NAME_TABLE       NOT NULL VARCHAR2(200) 
column_xpto               NUMBER              
column_X                  TIMESTAMP(6)

有谁知道为什么第二个语句会出错?

【问题讨论】:

  • 请编辑您的问题并显示 SQL after 变量替换。
  • ... SET column_x = ''' ||my_other_var|| ''' ... 为我工作。

标签: sql oracle plsql


【解决方案1】:

我会使用 bind 变量,如下所示,带有 USING 关键字。

EXECUTE IMMEDIATE 'UPDATE myTable SET column_xpto = :my_other_var WHERE myTable.name_table = :nameT' 
        USING my_other_var, nameT;

【讨论】:

  • 我试过了,它似乎也可以正常工作。但是有什么好处呢?除了没有所有逗号的最简单的sintaxe LOL
  • @AdamBrave,除了 SQL 注入漏洞之外,使用绑定变量而不是连接的另一个原因是对数值的 NULL 处理:如果使用简单连接,则会在运行时出现语法错误,而使用绑定变量,它至少可以正常运行。
【解决方案2】:

你必须像下面这样使用

EXECUTE IMMEDIATE 'UPDATE myTable SET column_X = ''' ||my_other_var|| ''' WHERE myTable.name_table = '''||nameT||'''';

因为timestamp 应该用作字符串文字。

您也可以像 Lalith 所说的那样绑定用户变量。

【讨论】:

  • 更好地使用绑定变量。
  • 为什么?有什么优势?
  • 绑定变量会将值提供给预编译的,它会将值提供给预编译的,而上面是在运行时再次重新解析语句。
猜你喜欢
  • 2016-02-04
  • 1970-01-01
  • 2012-05-29
  • 2016-10-15
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2013-01-05
  • 1970-01-01
相关资源
最近更新 更多