Процедура PL SQL с выбором - PullRequest
0 голосов
/ 06 декабря 2018

Я хочу выполнить процедуру, которая возвращает мне имя, фамилию и название автора в зависимости от того, из какого он государства.Но приведенный выше код возвращает мне ошибку 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

, но она все еще не работает.Это из примера базы данных Pubs из MS SQL, который я преобразовал в SQL Oracle.

Ответы [ 2 ]

0 голосов
/ 06 декабря 2018

Несколько возражений:

  • вы уже знаете, что END отсутствует
  • , кроме этого, INTO требуется для оператора SELECT в PL / SQL(т.е. вы должны поместить результат куда-нибудь ).Обычно вы объявляете локальные переменные для этой цели.Вы выбрали возврат курсора ref - OK
  • stattt - курсор ref, установленный как параметр out для этой процедуры;Я не думаю, что вы можете использовать его в качестве параметра в этом предложении WHERE.

Вот пример, основанный на схеме Скотта (поскольку у меня нет ваших таблиц), который показывает, как это сделать.Я возвращаю всех сотрудников, которые работают в каком-то отделе (в нашем примере 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>
0 голосов
/ 06 декабря 2018

Выполните CREATE PROCEDURE синтаксис и соглашение, согласно которому каждое начало имеет end , и закройте BEGIN с END:

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;
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...