Oracle PL / SQL Developer:从Package Procedure返回%RowType

时间:2017-01-10 16:48:48

标签: oracle plsql

我是Oracle Pl \ SQL的新手。我只是尝试创建一个简单的包,其中包含一个返回一组对象id的过程;代码如下:

--Package Spec
CREATE OR REPLACE PACKAGE TEST IS
--GET OBJECT ID'S FROM CONTROL TABLE
   PROCEDURE get_object_id_control(p_obj_id OUT abc_table%ROWTYPE);
END;

--Package Body
PROCEDURE get_object_id_control(p_obj_id OUT abc_table%ROWTYPE) AS
  BEGIN
    SELECT object_id
      INTO p_obj_id
      FROM abc_table
     WHERE fec_proc IS NULL;     
  END;

我得到错误:PL / SQL:ORA-00913:值太多了。这是返回相同数据类型的多个值的正确方法,还是有更好的方法。提前谢谢。

2 个答案:

答案 0 :(得分:1)

您可以创建自定义表类型,并将过程的out参数设置为该类型。

CREATE TABLE ABC_TABLE(ID varchar2(100));

create or replace type abc_tab is table of varchar2(100);
/

CREATE OR REPLACE PACKAGE TEST IS
   PROCEDURE get_object_id_control(p_obj_id OUT abc_tab);
END;
/

CREATE OR REPLACE PACKAGE BODY TEST IS
  PROCEDURE get_object_id_control(p_obj_id OUT abc_tab) AS
  BEGIN
    SELECT id
      bulk collect INTO p_obj_id
      FROM abc_table;   
  END;
END;
/

然后你可以这样称呼它:

declare
  v abc_tab;
begin
  TEST.get_object_id_control(p_obj_id => v);
  for i in v.first..v.last loop
    dbms_output.put_line(v(i));
  end loop;
end;
/

答案 1 :(得分:0)

类似于GurV的答案(因为他打了我30秒......),你也可以使用PL / SQL对象类型。如果您不需要在SQL中引用该类型,则不需要listDatesNotAvailable.Where(d => d.Date >= DateTime.Today) 语句。

CREATE TYPE

使用它:

--Package Spec
CREATE OR REPLACE PACKAGE TEST AS
  TYPE id_table_type IS TABLE OF NUMBER;
--GET OBJECT ID'S FROM CONTROL TABLE
   PROCEDURE get_object_id_control(p_obj_id_list OUT id_table_type);
END;

--Package Body
CREATE OR REPLACE PACKAGE BODY TEST AS
   PROCEDURE get_object_id_control(p_obj_id_list OUT id_table_type) AS
  BEGIN
    SELECT object_id 
      BULK COLLECT INTO p_obj_id_list
      FROM abc_table
     WHERE fec_proc IS NULL;
  END;
END;