考虑以下 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 序列,它就不开心了..
我错过了什么?
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>
在 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;
/