放入程序时,Oracle Statement不起作用

时间:2014-11-08 06:25:31

标签: sql oracle plsql ora-00933 pls-00103

我是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:     ; 

谢谢

1 个答案:

答案 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处理,则可能需要使用流水线表函数。