【问题标题】:Procedure with Implicit cursor is compiling but not printing带有隐式游标的过程正在编译但未打印
【发布时间】:2019-04-02 02:30:09
【问题描述】:

我目前卡在这个 pl/sql 问题上,我正在尝试将适用于某个职位(3 个不同的表)的申请人的所有信息收集到一个存储过程中。

不幸的是,我对 oracle 和 pl/sql 非常陌生,所以我认为我的连接可能很草率,而且我的 dbms_output.put_line 的主要问题是没有打印出我需要的数据。我认为它可能位于代码块中的错误位置,或者我的 join 语句一直存在问题。

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;

【问题讨论】:

    标签: loops plsql cursor


    【解决方案1】:

    知道程序正在编译是令人惊讶的。您在隐式游标查询中使用 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;
    /
    

    【讨论】:

      猜你喜欢
      • 2020-07-14
      • 2017-03-04
      • 2016-02-22
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2020-05-14
      • 1970-01-01
      相关资源
      最近更新 更多