PL/SQl-sqldeveloper希望在plsql中输出多行



我有一个过程和匿名块,我在其中输入两个日期,它在tickets表中搜索在这两个日期期间解析的ticket并输出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;
/

基于新信息:您的查询返回多条记录。使用这种类型的选择,您只能获取一行。尝试使用光标。例如这样的结构:

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;

问题是它不会那样工作。如果您的objectif要查看输出,则必须对结果列表进行迭代。您所写的内容对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;
------------------------------------------------------------------------

相关内容

  • 没有找到相关文章

最新更新