我必须编写一个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;
答案 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一次处理所有行的工作更快,而不是强迫它一次做一行。