oracle sqlplus挂起并显示开始END

zwghvu4y  于 2023-04-29  发布在  Oracle
关注(0)|答案(2)|浏览(170)

请考虑以下sqlplus脚本:

select * from dual;

select * from dual;

declare
   foo number(10);
begin
   select 'abc' from dual;

end;

如果我运行它:

sqlplus user/password@DB @myscript.sql

我得到这个输出:

D
-
X

D
-
X

  7

而sqlplus挂起。...等待用户输入一些奇怪的原因。如果我按回车键,它会打印8。..9 ... 10等
看起来包含简单SQL的脚本很好,但如果我放进一个声明。.开始.. end sequence它不快乐。.
我错过了什么?

3wabscal

3wabscal1#

PL/SQL块需要一个结束斜杠/字符,它告诉SQL*Plus现在应该运行这段代码。

SQL> select * From dual;

D
-
X

SQL> declare
  2    foo number(10);
  3  begin
  4    select 1 into foo from dual;
  5  end;
  6
  7
  8  /                --> this

PL/SQL procedure successfully completed.

SQL>
l5tcr1uw

l5tcr1uw2#

在SQL中,;(在语句之后)或/(在换行符上)用于终止语句。
在PL/SQL中,;(在语句之后)用于终止语句,/(在换行符上)用于终止PL/SQL块。您缺少块终止符;这意味着数据库不知道代码已经完成并准备执行,这就是为什么它挂起,因为它在等待你告诉它代码块已经完成。
在换行符处输入/后,PL/SQL块将被执行。此时,您将得到一个异常,因为您正在使用SELECT ... FROM ...,并且缺少一个INTO子句,这在PL/SQL中是必需的。
它应该是:

select * from dual;

select * from dual;

declare
   foo VARCHAR2(10);                 -- Wrong data type
begin
   select 'abc' INTO foo from dual;  -- Missing INTO clause
   DBMS_OUTPUT.PUT_LINE(foo);        -- Optionally, do something with the variable.
end;
/

相关问题