PL SQL过程与选择

时间:2018-12-06 09:42:08

标签: sql oracle plsql

我想执行一个程序,该程序根据作者所在的州来向我返回名字,姓氏和标题。 但是上面的代码向我返回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。

2 个答案:

答案 0 :(得分:1)

一些反对意见:

  • 您已经知道END丢失了
  • 除此之外,PL / SQL中的INTO语句还需要SELECT(即,您必须将结果放在 somewhere 中)。通常,您为此目的声明局部变量。您选择返回参考光标-确定
  • stattt是ref游标,设置为该过程的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>

答案 1 :(得分:0)

遵循 CREATE PROCEDURE语法和约定(每个开头都有一个 end ),并使用END关闭BEGIN:

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
END;
/ 
Header AS
[declaration statements
  ...]
BEGIN
  ...
[EXCEPTION
  ...]
END;