oracle 如何创建一个包含一个具有两个参数的存储过程并从表中选择数据的包?

093gszye  于 2023-08-04  发布在  Oracle
关注(0)|答案(1)|浏览(92)

我似乎无法运行一个包含存储过程的包,该存储过程包含两个参数,并根据这些参数输出一个表。目标是创建一个存储过程,该存储过程接受输入new_date和new_entity,并从表中返回与这些值匹配的数据。

CREATE OR REPLACE PACKAGE test1 IS
    PROCEDURE stored_proc (new_date IN VARCHAR2, new_entity IN VARCHAR2, output OUT SYS_REFCURSOR);
END;

CREATE OR REPLACE PACKAGE BODY test1 IS
    PROCEDURE stored_proc (new_date IN VARCHAR2, new_entity IN VARCHAR2, output OUT SYS_REFCURSOR) IS
       BEGIN
             OPEN output FOR select * FROM atlas_report_dates
             WHERE report_date =  TO_DATE(new_date,'mm/dd/yyyy') AND entity = new_entity;
       END;
    END;

BEGIN
    test1.stored_proc('6/12/2023', 'MLFS');
END;

字符串
我收到错误ORA-06550、PLS-00306、ORA-06550

irlmq6kh

irlmq6kh1#

您的过程很好(您只需要确保在END;语句后的新行上使用/终止符终止PL/SQL块)。
用于调用过程的匿名块不正确,因为过程有三个参数,而您只提供了两个参数。您需要为OUT参数提供游标参数。

CREATE TABLE atlas_report_dates (report_date, entity) AS
SELECT DATE '2023-06-12', 'MLFS' FROM DUAL;

CREATE OR REPLACE PACKAGE test1 IS
  PROCEDURE stored_proc (new_date IN VARCHAR2, new_entity IN VARCHAR2, output OUT SYS_REFCURSOR);
END;
/

CREATE OR REPLACE PACKAGE BODY test1 IS
  PROCEDURE stored_proc (new_date IN VARCHAR2, new_entity IN VARCHAR2, output OUT SYS_REFCURSOR) IS
  BEGIN
    OPEN output FOR select * FROM atlas_report_dates
    WHERE report_date =  TO_DATE(new_date,'mm/dd/yyyy') AND entity = new_entity;
  END;
END;
/

字符串
然后:

DECLARE
  v_cur SYS_REFCURSOR;
BEGIN
  test1.stored_proc('6/12/2023', 'MLFS', v_cur);
END;
/


工作(但不做任何事情,因为你没有告诉它如何处理光标)。
更好的方法是使用列数据类型并将日期作为日期(而不是字符串)传递:

CREATE OR REPLACE PACKAGE test1 IS
  PROCEDURE stored_proc (
    new_date   IN  ATLAS_REPORT_DATES.REPORT_DATE%TYPE,
    new_entity IN  ATLAS_REPORT_DATES.ENTITY%TYPE,
    output     OUT SYS_REFCURSOR
  );
END;
/

CREATE OR REPLACE PACKAGE BODY test1 IS
  PROCEDURE stored_proc (
    new_date   IN  ATLAS_REPORT_DATES.REPORT_DATE%TYPE,
    new_entity IN  ATLAS_REPORT_DATES.ENTITY%TYPE,
    output     OUT SYS_REFCURSOR
  )
  IS
  BEGIN
    OPEN output FOR
      SELECT *
      FROM   atlas_report_dates
      WHERE  report_date = new_date
      AND    entity      = new_entity;
  END;
END;
/


然后你可以调用它使用:

DECLARE
  v_cur SYS_REFCURSOR;
  v_row ATLAS_REPORT_DATES%ROWTYPE;
BEGIN
  test1.stored_proc(DATE '2023-06-12', 'MLFS', v_cur);

  LOOP
    FETCH v_cur INTO v_row;
    EXIT WHEN v_cur%NOTFOUND;
    DBMS_OUTPUT.PUT_LINE(v_row.report_date || ', ' || v_row.entity);
  END LOOP;
END;
/


示例表的输出为:

2023-06-12 00:00:00, MLFS


fiddle

相关问题