Процедура с неявным курсором компилируется, но не печатается - PullRequest
0 голосов
/ 02 апреля 2019

В настоящее время я застрял в этой проблеме pl / sql, я пытаюсь собрать всю информацию ЗАЯВИТЕЛЯ, который ЗАЯВЛЯЕТСЯ на определенное ПОЛОЖЕНИЕ (3 разных таблицы) в хранимую процедуру.

К сожалению, я очень новичок в oracle и pl / sql, так что я думаю, что мои соединения могут быть неаккуратными, так как моя главная проблема dbms_output.put_line - не распечатывать нужные мне данные. Я полагаю, что это может быть не в том месте в блоке кода, или возникла проблема, связанная с моими операторами соединения.

enter code here 
SET ECHO ON
SET FEEDBACK ON
SET LINESIZE 100
SET PAGESIZE 100
SET SERVEROUTPUT ON

CREATE OR REPLACE PROCEDURE APPLICANTS IS
first_name APPLICANT.FNAME%TYPE;
last_name APPLICANT.LNAME%TYPE;
position_number APPLIES.PNUMBER%TYPE;
position_title POSITION.TITLE%TYPE;
str VARCHAR(300);

CURSOR fnameCursor IS
SELECT FNAME
FROM APPLICANT;  

BEGIN
FOR fnameCursor IN (SELECT APPLICANT.LNAME, APPLIES.PNUMBER, 
POSITION.TITLE INTO last_name, position_number, position_title
                    FROM APPLICANT JOIN APPLIES ON APPLICANT.ANUMBER = 
APPLIES.ANUMBER
                    JOIN POSITION ON POSITION.PNUMBER = APPLIES.PNUMBER
                    WHERE FNAME = first_name
                    ORDER BY LNAME DESC)
LOOP

str := position_number || '' || first_name || '' || last_name || ': ' || 
position_title;
dbms_output.put_line(str);

--EXIT WHEN fnameCursor%NOTFOUND;
END LOOP;

END APPLICANTS;
/

EXECUTE APPLICANTS;

1 Ответ

2 голосов
/ 02 апреля 2019

Удивительно знать, что процедура компилируется.Вы используете предложение INTO внутри неявного запроса курсора.Кроме того, я считаю, first_name должно служить аргументом для вашей процедуры, но вы не упомянули об этом.Что еще более важно, столбцы, выбранные / псевдонимы в пределах курсора, должны ссылаться в цикле, используя переменную записи курсора fnamecursor

CREATE OR REPLACE PROCEDURE APPLICANTS(first_name APPLICANT.FNAME%TYPE)
IS
  str VARCHAR(300);
BEGIN
     FOR fnamecursor IN (
          SELECT applicant.lname as last_name,
                 applies.pnumber as position_number,
                 position.title  as position_title
          FROM applicant
          JOIN applies  ON applicant.anumber = applies.anumber
          JOIN position ON position.pnumber = applies.pnumber
          WHERE fname = first_name
          ORDER BY lname DESC
     ) LOOP
          str := fnamecursor.position_number || ' '   || first_name || ' ' || 
                       fnamecursor.last_name || ': ' || fnamecursor.position_title;
          dbms_output.put_line(str);

     END LOOP;
END applicants;
/
...