简体   繁体   English

Oracle PL / SQL Developer:从打包过程返回%RowType

[英]Oracle PL/SQL Developer: Return %RowType from Package Procedure

i'm kind of new to Oracle Pl\\SQL. 我是Oracle Pl \\ SQL的新手。 I was just trying to create a simple Package with a procedure that returns a set of object id's; 我只是试图用一个返回一组对象ID的过程创建一个简单的Package; the code is as follows: 代码如下:

--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;

I get Error: PL/SQL: ORA-00913: too many values. 我收到错误:PL / SQL:ORA-00913:值太多。 Is this the correct way for returning multiple values of same data type, or is there a better approach. 这是返回相同数据类型的多个值的正确方法,还是有更好的方法? Thanks in advance. 提前致谢。

You can create a custom table type and set the out parameter of the procedure to that type. 您可以创建自定义表类型,并将过程的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;
/

Then you can call it like so: 然后,您可以这样称呼它:

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;
/

Similar to GurV's answer (since he beat me by like 30 seconds...), you can use a PL/SQL object type as well. 与GurV的答案类似(因为他被击败了我30秒...),您也可以使用PL / SQL对象类型。 You do not need the CREATE TYPE statement if you don't need to reference the type in SQL. 如果不需要在SQL中引用类型,则不需要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;

To use it: 要使用它:

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;

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM