我是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: ;
感谢
几个错误。
目前,编译器反对select
语句后面缺少分号的事实。PL/SQL中的每条语句都需要以分号结尾。
一旦修复了这个问题,就会出现错误,因为存储过程无法简单地执行select
语句。这与结果有关。如果您知道查询总是只返回一行,那么您可以声明一些局部变量并执行select into
来填充这些变量。不过,我猜您的查询可能会返回1行以上。您可以在过程中编写一个for
循环,对结果进行迭代,并对行执行某些操作。或者,您可以将过程声明为具有SYS_REFCURSOR
类型的OUT
参数,为查询打开一个游标,然后将该游标返回给调用者。如果您使用的是12.1或更高版本,Oracle引入了一些语法糖,这样过程就可以在不声明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;
虽然这是合法的,但它并不是特别地道。如果您的代码只是在执行select
语句,那么创建视图通常比创建存储过程更有意义。如果在返回结果之前要对结果进行大量的PL/SQL处理,那么管道表函数可能是有意义的。