Oracle PL/SQL开发人员:从包过程返回%RowType

Oracle PL/SQL开发人员:从包过程返回%RowType,oracle,plsql,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_obj

我对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:值太多。这是返回相同数据类型的多个值的正确方法,还是有更好的方法。提前感谢。

您可以创建自定义表类型,并将过程的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;
/

与GurV的回答类似,因为他比我快了30秒…,您也可以使用PL/SQL对象类型。如果不需要在SQL中引用类型,则不需要CREATETYPE语句

--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;
要使用它:

DECLARE
  l_id_list   test.id_table_type;
BEGIN
  test.get_object_id_control (p_obj_id_list => l_id_list);

  FOR i IN l_id_list.FIRST .. l_id_list.LAST LOOP
    DBMS_OUTPUT.put_line (l_id_list (i));
  END LOOP;
END;

谢谢我尝试了较短的版本,效果很好。现在,有没有一种方法可以使用这种方法迭代并输出p_obj_id_列表中的值,即dbms_output.put_linep_obj_id_列表?是的,与使用对象类型的方法非常相似,如GurV的回答中所示。我将更新我的answer.btw表%rowtype定义一个与表定义匹配的PL/SQL记录,即每个列都有一个字段的单个记录。看起来您实际上想要一个abc_table.object_id%type数组,或者只是一个可重用的整型表,而不是abc_table%rowtype.justice@William Robertson的记录。我的第一种方法是创建一个abc_table数组;不是abc_表%rowtype的记录。这就是我使用@Matthew McPeak方法的原因,我相信它创建了一种数字类型的数组:Type id_table_Type是数字表;