sqlplus挂起BEGIN END

问题描述 投票:0回答:2

考虑以下 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 的脚本似乎很好,但如果我放入声明 .. begin .. end 序列,它就不开心了..

我错过了什么?

oracle plsql sqlplus
2个回答
2
投票

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>

1
投票

在 SQL 中,

;
(在语句之后)或
/
(在换行符上)用于终止语句。

在 PL/SQL 中,

;
(在语句之后)用于终止语句,
/
(在换行符上)用于终止 PL/SQL 块。您缺少块终止符;这意味着数据库不知道代码已完成并准备好执行,这就是它挂起的原因,因为它在等待您告诉它代码块已完成。

一旦您在换行符上输入

/
,PL/SQL 块就会被执行。那时,您将得到一个异常,因为您正在使用
SELECT ... FROM ...
并且缺少 PL/SQL 中所需的
INTO
子句。

应该是:

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;
/
© www.soinside.com 2019 - 2024. All rights reserved.