Oracle PL/SQL Developer:从包过程中返回 %RowType
Posted
技术标签:
【中文标题】Oracle PL/SQL Developer:从包过程中返回 %RowType【英文标题】:Oracle PL/SQL Developer: Return %RowType from Package Procedure 【发布时间】:2017-01-10 16:48:48 【问题描述】:我对 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:值太多。这是返回相同数据类型的多个值的正确方法,还是有更好的方法。提前致谢。
【问题讨论】:
btwtable%rowtype
定义了与表定义匹配的 PL/SQL 记录,即每列都有一个字段的单个记录。看起来您实际上想要一个 abc_table.object_id%type
数组(或者只是某种可重用的整数表),而不是 abc_table%rowtype
的记录。
正是@William Robertson。我的第一种方法是有一个 abc_table.object_id%type; 数组。不是 abc_table%rowtype 的记录。这就是我使用@Matthew McPeak 方法的原因,我相信它会创建一种 NUMBER 类型的数组:TYPE id_table_type IS TABLE OF NUMBER;
【参考方案1】:
您可以创建自定义表类型并将过程的输出参数设置为该类型。
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;
/
【讨论】:
【参考方案2】:与 GurV 的回答类似(因为他比我快 30 秒...),您也可以使用 PL/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;
使用它:
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_list 中的值,即 dbms_output.put_line(p_obj_id_list)? 是的,就像您使用对象类型一样,就像 GurV 的回答一样。我会更新我的答案。以上是关于Oracle PL/SQL Developer:从包过程中返回 %RowType的主要内容,如果未能解决你的问题,请参考以下文章
Oracle 使用 PL/SQL Developer 生成 AWR 报告
Oracle 使用 PL/SQL Developer 生成 AWR 报告
pl/sql developer中文乱码,为啥呢?怎么解决?Oracle问题
pl/sql developer中文乱码,为啥呢?怎么解决?Oracle问题