我是Oracle新手,遇到了这个问题。
我创建了一个这样的程序:
CREATE OR REPLACE PROCEDURE getArt
as
begin
select ar.artTitle, ar.artContent, ar.DateCreated, ar.artCategory, ac.accName
from hng_art ar
join HNG_ACCOUNTS ac
on ar.accNo = ac.accNo
order by ar.artNo desc
end getArt;
我尝试独立运行SELECT语句并且它有效。但是,当我把它放在一个程序中。我没有工作; 以下是错误:
“GETART”的错误
ERROR at line 4: PL/SQL: SQL Statement ignored
ERROR at line 4: PL/SQL: ORA-00933: SQL command not properly ended
ERROR at line 5: PLS-00103: Encountered the symbol "end-of-file" when expecting one of the following: ;
谢谢
答案 0 :(得分:4)
有几个错误。
目前,编译器反对在select
语句后丢失分号这一事实。 PL / SQL中的每个语句都需要以分号结束。
修复后,您将收到错误,因为存储过程不能简单地执行select
语句。它必须对结果做些什么。如果您知道您的查询将始终只返回一行,您可以声明一些局部变量并执行select into
来填充这些变量。但是,我猜测您的查询可能会返回超过1行。您可以在过程中编写for
循环,遍历结果,并对行执行某些操作。或者,您可以声明您的过程具有类型为OUT
的{{1}}参数,为您的查询打开游标,并将该游标返回给调用者。如果您使用的是12.1或更高版本,Oracle会引入一些语法糖,以便过程可以返回结果而不声明这样的SYS_REFCURSOR
参数,但我猜测这可能是不是你所处的情况。
从语法上讲,你可以做类似
的事情OUT
虽然这是合法的,但并不是特别惯用。如果您的代码只是执行CREATE OR REPLACE PROCEDURE getArt( p_rc OUT sys_refcursor )
as
begin
open p_rc
for
select ar.artTitle, ar.artContent, ar.DateCreated, ar.artCategory, ac.accName
from hng_art ar
join HNG_ACCOUNTS ac
on ar.accNo = ac.accNo
order by ar.artNo desc;
end getArt;
语句,那么创建视图而不是存储过程通常会更有意义。如果在返回结果之前对结果执行大量PL / SQL处理,则可能需要使用流水线表函数。