首页 > 解决方案 > 带有选择的 PL SQL 过程

问题描述

我想执行根据他/她所在的州返回作者的名字、姓氏和头衔的程序。但是上面的代码返回给我 PLS-00103 错误“文件结尾”。

CREATE OR REPLACE PROCEDURE proc1 (stattt OUT SYS_REFCURSOR) AS 
BEGIN
SELECT a.au_fname, a.au_lname, t.title
FROM authors a, titleauthor ta, titles t 
WHERE ta.au_id = a.au_id
AND t.title_id = ta.title_id
AND state =  stattt
/

我也尝试使用

into proc1

但它仍然不起作用。这是来自我转换为 SQL Oracle 的 MS SQL 的示例数据库 Pubs。

标签: sqloracleplsql

解决方案


一些反对意见:

  • 你已经知道那END是缺失的
  • 除此之外, PL/SQLINTO中的语句需要SELECT(即您必须将结果放在某处)。通常,您为此目的声明局部变量。您选择返回参考光标 - 好的
  • stattt是 ref cursor,设置为该过程的 out 参数;我认为您不能将其用作该 WHERE 子句中的参数。

这是一个基于 Scott 模式的示例(因为我没有您的表),它显示了如何做到这一点。我将返回在某个部门工作的所有员工(在本例中为 10 名):

SQL> CREATE OR REPLACE PROCEDURE p_test (par_deptno   IN     NUMBER,
  2                                      par_rc          OUT SYS_REFCURSOR)
  3  IS
  4  BEGIN
  5     OPEN par_rc FOR
  6        SELECT empno, ename, sal
  7          FROM emp
  8         WHERE deptno = par_deptno;
  9  END;
 10  /

Procedure created.

SQL> var l_rc refcursor
SQL>
SQL> exec p_test(10, :l_rc);

PL/SQL procedure successfully completed.

SQL> print l_rc

     EMPNO ENAME             SAL
---------- ---------- ----------
      7782 CLARK            2450
      7839 KING            10000
      7934 MILLER           1300

SQL>

推荐阅读