oracle 错误“操作未正确结束”当尝试使用两个更新命令

0g0grzrc  于 2023-10-16  发布在  Oracle
关注(0)|答案(2)|浏览(97)

我对SQL很陌生,为什么下面的代码给予错误“操作未正确结束”?单独的2个命令的工作,但当一起它给出了错误?

UPDATE sec0503_checking_accounts
   SET balance = balance + 5000
WHERE customer = 'name';

UPDATE sec0503_savings_accounts
    SET balance = balance -5000
WHERE customer = 'name';

我已经试过去除这些障碍,并四处寻找一些解决方案,但似乎都不起作用。当与其他命令结合使用时,这些命令中的任何一个也给予相同的错误。
请记住,我使用的是apex oracle,这只是为了练习。

8i9zcol2

8i9zcol21#

在Oracle Apex中,如果使用SQL Workshop,则一次只能运行一个命令。
如果您尝试运行由多个语句组成的整个脚本,那么它将被完整地传递到数据库的SQL引擎,然后将失败,因为它期望单个命令而不是多个命令(并且终止第一个语句的;不是预期的语法,因此操作没有正确结束,并引发错误声明)。
相反,您应该做的是突出显示要运行的语句,然后单击Run按钮。
This answer给出一个例子:

或者,您可以将多个SQL语句 Package 在单个PL/SQL块中(如@PaulW的回答所述),以便正在评估的单个语句是整个PL/SQL块,其中每个单独的SQL语句将按顺序进行评估。

vaqhlq81

vaqhlq812#

分号不是SQL语言的一部分,也不是由Oracle SQL引擎解释的(除了标记CTE函数结束的罕见情况,但这在技术上是PL/SQL边界)。它是客户端和编程语言中用于语句结束标记的常用约定。在Oracle中,它在PL/SQL语言和SQLPlus客户端界面工具中有意义。但它不是SQL本身的一部分。
最有可能的情况是,您正在使用客户端或通过一个工具提交此SQL,该工具本身并不解释SQL,而是将其作为SQL本身的一部分发送给数据库引擎。如果是这样的话,请删除附件并单独提交每个声明。如果你想在一个动作中发送两个语句,找出你的特定客户端软件是如何处理多个语句的--这会因软件而异。如果您希望 database 将两者作为一个单元来处理,则需要使用PL/SQL块,将其 Package 在BEGIN ... END中。然后,您的客户端将PL/SQL块作为一个单元提交,然后数据库中的PL/SQL引擎将把这些子块解释为该编程语言中的语句结尾:

BEGIN -- this makes the following into PL/SQL

  UPDATE sec0503_checking_accounts
     SET balance = balance + 5000
  WHERE customer = 'name';

  UPDATE sec0503_savings_accounts
     SET balance = balance -5000
  WHERE customer = 'name';
END;

PL/SQL将在内部将每个SQL单独提交给SQL引擎,* 不带 * 分号,因为分号只对PL/SQL本身有意义。

相关问题