Oracle PL/SQL开发人员:从包过程返回%RowType
我对Oracle Pl\SQL有点陌生。我只是尝试创建一个简单的包,其中包含一个返回一组对象id的过程;代码如下: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
--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是数字表;