-1

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

谢谢你

4

1 回答 1

4

几个错误。

目前,编译器反对您在select语句后缺少分号这一事实。PL/SQL 中的每条语句都需要以分号结束。

一旦你解决了这个问题,你就会得到一个错误,因为存储过程不能简单地执行一条select语句。它必须与结果有关。如果您知道您的查询将始终只返回一行,则可以声明一些局部变量并执行 aselect into来填充这些变量。但是,我猜测您的查询可能返回超过 1 行。你可以在你的过程中编写一个for循环,遍历结果,并对行做一些事情。或者,您可以将您的过程声明为具有OUTtype 的参数,SYS_REFCURSOR为您的查询打开一个游标,然后将该游标返回给调用者。如果您使用的是 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 处理,那么流水线表函数可能是有意义的。

于 2014-11-08T06:59:45.643 回答