我想执行一个程序,该程序根据作者所在的州来向我返回名字,姓氏和标题。 但是上面的代码向我返回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。
答案 0 :(得分:1)
一些反对意见:
END
丢失了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;