在 PL/SQL 中使用记录表

Posted

技术标签:

【中文标题】在 PL/SQL 中使用记录表【英文标题】:Using Tables of Records in PL/SQL 【发布时间】:2009-10-22 12:18:27 【问题描述】:

我在我的 PL/SQL 包中声明了以下类型:

TYPE t_simple_object IS RECORD (
   wert   NUMBER,
   gs     NUMBER,
   vl     NUMBER);

TYPE t_obj_table IS TABLE OF t_simple_object
  INDEX BY BINARY_INTEGER;

然后我声明一个变量:

obj t_obj_table;

但是,当我想使用该变量时,我无法对其进行初始化或扩展:

obj := t_obj_table ();

给出以下错误:

PLS-00222: no function with name 'T_OBJ_TABLE' exists in this scope

如果我不初始化它,我不能扩展它来添加一些日期

obj.EXTEND();

给出另一个错误:

PLS-00306: wrong number or types of arguments in call to 'EXTEND'

我怎样才能做到这一点?

【问题讨论】:

【参考方案1】:

您不扩展由“某物”索引的表,您可以直接使用它...

DECLARE
   TYPE t_simple_object IS RECORD 
      ( wert   NUMBER
      , gs     NUMBER
      , vl     NUMBER
      ); 

   TYPE t_obj_table IS TABLE OF t_simple_object
   INDEX BY BINARY_INTEGER; 

   my_rec t_simple_object;
   obj t_obj_table; 
BEGIN
   my_rec.wert := 1;
   my_rec.gs := 1;
   my_rec.vl := 1;
   obj(1) := my_rec;
END;
/

要使用 EXTEND 语法,这个例子应该这样做......

DECLARE
   TYPE t_simple_object IS RECORD 
      ( wert   NUMBER
      , gs     NUMBER
      , vl     NUMBER
      ); 

   TYPE t_obj_table IS TABLE OF t_simple_object; 

   my_rec t_simple_object;
   obj t_obj_table := t_obj_table(); 
BEGIN
   obj.EXTEND;
   my_rec.wert := 1;
   my_rec.gs := 1;
   my_rec.vl := 1;
   obj(1) := my_rec;
END;
/

另见this link (Ask Tom)

【讨论】:

【参考方案2】:

如果您不想使用关联数组(也称为索引表),请忽略“INDEX BY BINARY_INTEGER”子句。然后你的代码就可以正常工作了:

declare 
    TYPE t_simple_object IS RECORD (
       wert   NUMBER,
       gs     NUMBER,
       vl     NUMBER);
    TYPE t_obj_table IS TABLE OF t_simple_object;
    obj t_obj_table;
begin  
    obj := t_obj_table ();
    obj.EXTEND();
end;

【讨论】:

【参考方案3】:

您不能扩展关联数组。 只需为其赋值

declare
  TYPE t_simple_object IS RECORD (
    wert   NUMBER,
    gs     NUMBER,
    vl     NUMBER);

  TYPE t_obj_table IS TABLE OF t_simple_object INDEX BY BINARY_INTEGER;

  simple_object t_simple_object;
begin
  simple_object.wert := 1;
  simple_object.gs := 2;
  simple_object.vl := 3;
  obj(1) := simple_object;
end;
/

【讨论】:

【参考方案4】:

或者只使用一条记录(或关联记录数组)

create or replace package p_test is

  type t_rec is record (
    empname varchar2(50),
    empaddr varchar2(50));

  function p_test_ret_record return t_rec;

end p_test;


create or replace package body p_test is

  function p_test_ret_record return t_rec is
     l_rec t_rec;
  begin
     l_rec.empname := 'P1';
     l_rec.empaddr := 'P2';     
     return l_rec;
  end;

end p_test;

declare
  -- Non-scalar parameters require additional processing 
  result p_test.t_rec;
begin
  -- Call the function
  result := p_test.p_test_ret_record;
  dbms_output.put_line('Name: ' || result.empname || ' Addr: ' || result.empaddr);
end;

【讨论】:

以上是关于在 PL/SQL 中使用记录表的主要内容,如果未能解决你的问题,请参考以下文章

如何在 SQL 中检索 PL/SQL 记录类型? [复制]

PL/SQL 在过程中返回记录

如何使用 Form Builder 和 PL/SQL 插入记录?

PL/SQL 代码不向表中插入记录

如何用 pl/sql 中的记录项初始化数组?

在 PL/SQL 中附加来自每个循环迭代的多条记录