PL/SQl sqldeveloper 想在 plsql 中输出多行
PL/SQl sqldeveloper want to output multiple rows in plsql
我有一个过程和匿名块,我在其中输入两个日期,它会在票证 table 中搜索在这两个日期内已解决的票证并输出 em。但我似乎无法弄清楚如何在 pl/sql.
中输出多行
ORA-01422: exact fetch returns more than requested number of rows
ORA-06512: at "SYSTEM.JOBS_DONE", line 9
ORA-06512: at line 8
01422. 00000 - "exact fetch returns more than requested number of rows"
*Cause: The number specified in exact fetch is less than the rows returned.
*Action: Rewrite the query or change number of rows requested
CREATE OR REPLACE PROCEDURE jobs_done(
month_start IN tickets.date_reported%TYPE,
month_end IN tickets.date_resolved%TYPE,
userid OUT tickets.user_id%TYPE,
supportstaffid OUT tickets.support_staff_id%TYPE,
resolution OUT tickets.resolution_details%TYPE)
AS
BEGIN
SELECT user_id, support_staff_id, resolution_details
INTO userid, supportstaffid, resolution
FROM tickets
WHERE date_resolved >= month_start AND date_resolved <= month_end;
dbms_output.put_line('userid, supportstaffid, resolution');
dbms_output.put_line(userid || supportstaffid || resolution);
END jobs_done;
/
SET serveroutput ON
DECLARE
month_start tickets.date_reported%TYPE := &Enter_date_start;
month_end tickets.date_resolved%TYPE := &Enter_date_end;
userid tickets.user_id%TYPE;
supportstaffid tickets.support_staff_id%TYPE;
resolution tickets.resolution_details%TYPE;
BEGIN
jobs_done(month_start, month_end, userid, supportstaffid, resolution);
END;
/
根据新信息:您的查询 returns 条记录。使用这种类型的 select 你只能获取一行。尝试使用光标。例如结构如下:
declare
cursor c1 is <select your thing from table>;
begin
for r1 in c1
loop
dbms_output.put_line (r1.firstcolumn|| r2.anothercolumn );
end loop;
end;
问题是这样不行。如果您的目标是查看输出,则必须迭代结果列表。你写的内容对 PL/SQL 块没有意义。
您必须创建一个游标来保存结果并迭代到其中。
CREATE OR REPLACE PROCEDURE jobs_done(
month_start IN tickets.DATE_REPORTED%TYPE,
month_end IN tickets.DATE_RESOLVED%TYPE,
userid OUT TICKETS.USER_ID%type,
supportstaffid OUT tickets.support_staff_id%type,
resolution OUT tickets.resolution_details%type)
AS
Begin
DECLARE
CURSOR V_CURS IS
select user_id, support_staff_id, resolution_details
where DATE_RESOLVED >= month_start AND DATE_RESOLVED <= month_end;
BEGIN
DBMS_OUTPUT.PUT_LINE('userid, supportstaffid, resolution');
FOR V_CURS_RES IN V_CURS LOOP
DBMS_OUTPUT.PUT_LINE(V_CURS_RES.userid || V_CURS_RES.supportstaffid || V_CURS_RES.resolution);
END LOOP;
END;
END jobs_done;
set serveroutput on
DECLARE
month_start tickets.DATE_REPORTED%TYPE := &Enter_date_start;
month_end tickets.DATE_RESOLVED%TYPE := &Enter_date_end;
userid TICKETS.USER_ID%type;
supportstaffid tickets.support_staff_id%type;
resolution tickets.resolution_details%type;
BEGIN
jobs_done(month_start, month_end, userid, supportstaffid, resolution);
End;
Try this. Returning refcursor is the best way for this kind of resultset.
CREATE OR REPLACE PROCEDURE jobs_done(
month_start IN tickets.DATE_REPORTED%TYPE,
month_end IN tickets.DATE_RESOLVED%TYPE,
cur_out OUT sys_refcursor
)
AS
OPEN cur_out FOR
select user_id, support_staff_id, resolution_details
from tickets where DATE_RESOLVED >= month_start AND DATE_RESOLVED <= month_end;
END jobs_done;
------------------------execute-----------------------------------------
var ls refcursor;
EXEC jobs_done(input1,input2,:ls);
print ls;
------------------------------------------------------------------------
我有一个过程和匿名块,我在其中输入两个日期,它会在票证 table 中搜索在这两个日期内已解决的票证并输出 em。但我似乎无法弄清楚如何在 pl/sql.
中输出多行ORA-01422: exact fetch returns more than requested number of rows
ORA-06512: at "SYSTEM.JOBS_DONE", line 9
ORA-06512: at line 8
01422. 00000 - "exact fetch returns more than requested number of rows"
*Cause: The number specified in exact fetch is less than the rows returned.
*Action: Rewrite the query or change number of rows requested
CREATE OR REPLACE PROCEDURE jobs_done(
month_start IN tickets.date_reported%TYPE,
month_end IN tickets.date_resolved%TYPE,
userid OUT tickets.user_id%TYPE,
supportstaffid OUT tickets.support_staff_id%TYPE,
resolution OUT tickets.resolution_details%TYPE)
AS
BEGIN
SELECT user_id, support_staff_id, resolution_details
INTO userid, supportstaffid, resolution
FROM tickets
WHERE date_resolved >= month_start AND date_resolved <= month_end;
dbms_output.put_line('userid, supportstaffid, resolution');
dbms_output.put_line(userid || supportstaffid || resolution);
END jobs_done;
/
SET serveroutput ON
DECLARE
month_start tickets.date_reported%TYPE := &Enter_date_start;
month_end tickets.date_resolved%TYPE := &Enter_date_end;
userid tickets.user_id%TYPE;
supportstaffid tickets.support_staff_id%TYPE;
resolution tickets.resolution_details%TYPE;
BEGIN
jobs_done(month_start, month_end, userid, supportstaffid, resolution);
END;
/
根据新信息:您的查询 returns 条记录。使用这种类型的 select 你只能获取一行。尝试使用光标。例如结构如下:
declare
cursor c1 is <select your thing from table>;
begin
for r1 in c1
loop
dbms_output.put_line (r1.firstcolumn|| r2.anothercolumn );
end loop;
end;
问题是这样不行。如果您的目标是查看输出,则必须迭代结果列表。你写的内容对 PL/SQL 块没有意义。 您必须创建一个游标来保存结果并迭代到其中。
CREATE OR REPLACE PROCEDURE jobs_done(
month_start IN tickets.DATE_REPORTED%TYPE,
month_end IN tickets.DATE_RESOLVED%TYPE,
userid OUT TICKETS.USER_ID%type,
supportstaffid OUT tickets.support_staff_id%type,
resolution OUT tickets.resolution_details%type)
AS
Begin
DECLARE
CURSOR V_CURS IS
select user_id, support_staff_id, resolution_details
where DATE_RESOLVED >= month_start AND DATE_RESOLVED <= month_end;
BEGIN
DBMS_OUTPUT.PUT_LINE('userid, supportstaffid, resolution');
FOR V_CURS_RES IN V_CURS LOOP
DBMS_OUTPUT.PUT_LINE(V_CURS_RES.userid || V_CURS_RES.supportstaffid || V_CURS_RES.resolution);
END LOOP;
END;
END jobs_done;
set serveroutput on
DECLARE
month_start tickets.DATE_REPORTED%TYPE := &Enter_date_start;
month_end tickets.DATE_RESOLVED%TYPE := &Enter_date_end;
userid TICKETS.USER_ID%type;
supportstaffid tickets.support_staff_id%type;
resolution tickets.resolution_details%type;
BEGIN
jobs_done(month_start, month_end, userid, supportstaffid, resolution);
End;
Try this. Returning refcursor is the best way for this kind of resultset.
CREATE OR REPLACE PROCEDURE jobs_done(
month_start IN tickets.DATE_REPORTED%TYPE,
month_end IN tickets.DATE_RESOLVED%TYPE,
cur_out OUT sys_refcursor
)
AS
OPEN cur_out FOR
select user_id, support_staff_id, resolution_details
from tickets where DATE_RESOLVED >= month_start AND DATE_RESOLVED <= month_end;
END jobs_done;
------------------------execute-----------------------------------------
var ls refcursor;
EXEC jobs_done(input1,input2,:ls);
print ls;
------------------------------------------------------------------------