学习PL / SQL游标

时间:2016-01-06 14:17:49

标签: oracle plsql

我必须编写一个pl / sql块,它会根据我输入的job_id给出一个名称列表。我被困住了,不能真正理解我的错误。

 SET SERVEROUTPUT ON
 DECLARE 

 jobid EMPLOYEES.JOB_ID%type;

 CURSOR mycrs IS
 SELECT LAST_NAME
 FROM EMPLOYEES
 WHERE JOB_ID = jobid;

 names EMPLOYEES.LAST_NAME%TYPE;

 BEGIN

 jobid := &JOB_ID;

 OPEN mycrs;
 FETCH mycrs INTO names;
 DBMS_OUTPUT.PUT_LINE(names);
 CLOSE mycrs;


 END;

1 个答案:

答案 0 :(得分:1)

我预计您遇到的问题是您只检索给定作业ID的单个名称,而您希望列出更多名称。

如果是这样,那是因为当您按照示例过程打开游标并进行提取时,您只需获取一行。为了检索游标返回的所有行,您必须遍历游标中的所有行。

在PL / SQL中执行此操作的最简单方法可能是通过游标for循环,Oracle为您处理游标的打开,获取和关闭。它还隐式声明结果存储的变量,因此您甚至不必担心这一点。

例如:

set serveroutput on

declare 
  jobid employees.job_id%type;

  cursor mycrs is
  select last_name
  from employees
  where job_id = jobid;
begin
  jobid := &job_id; -- assuming employees.job_id has a NUMBER datatype

  for rec in mycrs
  loop
    dbms_output.put_line(rec.last_name);
  end loop;

end;
/

N.B。请注意,一般情况下,如果您循环遍历游标并执行逐行DML操作,则应重新考虑您的方法(“慢速慢”)并将其转换为单个DML语句(基于集合) - 让Oracle一次处理所有行的工作更快,而不是强迫它一次做一行。