我对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,这只是为了练习。
2条答案
按热度按时间8i9zcol21#
在Oracle Apex中,如果使用SQL Workshop,则一次只能运行一个命令。
如果您尝试运行由多个语句组成的整个脚本,那么它将被完整地传递到数据库的SQL引擎,然后将失败,因为它期望单个命令而不是多个命令(并且终止第一个语句的
;
不是预期的语法,因此操作没有正确结束,并引发错误声明)。相反,您应该做的是突出显示要运行的语句,然后单击Run按钮。
This answer给出一个例子:
或者,您可以将多个SQL语句 Package 在单个PL/SQL块中(如@PaulW的回答所述),以便正在评估的单个语句是整个PL/SQL块,其中每个单独的SQL语句将按顺序进行评估。
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引擎将把这些子块解释为该编程语言中的语句结尾:PL/SQL将在内部将每个SQL单独提交给SQL引擎,* 不带 * 分号,因为分号只对PL/SQL本身有意义。