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

【问题讨论】:

btw table%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问题

pl/sql developer和sql developer有啥区别?

PL/SQL Developer 登录 Oracle 12c(转)