带有隐式光标的过程正在编译但不打印
Procedure with Implicit cursor is compiling but not printing
我目前被这个 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;
知道程序正在编译,真是令人惊讶。您在隐式游标查询中使用 INTO
子句。另外,我相信 first_name
应该作为您程序的论据,但您没有提到它。
更重要的是,应该使用游标的记录变量 fnamecursor
在循环中引用游标中的列 selected/aliased
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;
/
我目前被这个 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;
知道程序正在编译,真是令人惊讶。您在隐式游标查询中使用 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;
/