Oracle 语句在放入过程中时不起作用



我是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处理,那么管道表函数可能是有意义的。

相关内容

  • 没有找到相关文章