更新已填充的表的过程

时间:2013-12-19 08:30:01

标签: oracle plsql

我想创建一个向现有表添加新行的过程。但是使用当前的过程,我正在重写整个表。当前程序的代码是

CREATE TYPE t_tf_row AS OBJECT (
id           NUMBER,
description  VARCHAR2(50));

CREATE TYPE t_tf_tab IS TABLE OF t_tf_row;

create or replace procedure add_n_rows(
n_rows in number)
is
  l_tab t_tf_tab := t_tf_tab();

begin
  for i in l_tab.count .. l_tab.count + n_rows
   loop
     l_tab.extend;
     l_tab(l_tab.last) := t_tf_row(i, 'Description for '|| i);

     end loop;
end;

在这里,每次我重写整个l_tab。我想更新已经更新的那个。建议我使用正确的方法来处理所需的程序。谢谢

1 个答案:

答案 0 :(得分:0)

这是因为您正在重新创建对象。您需要将对象的实例化版本作为参数传递给过程:

create or replace procedure add_n_rows(
    Pn_rows in number
  , P_tab in out t_tf_tab ) is

begin
  for i in P_tab.count .. P_tab.count + Pn_rows
   loop
     P_tab.extend;
     P_tab(l_tab.last) := t_tf_row(i, 'Description for '|| i);    
   end loop;
end;

我已将P_tab声明为OUT参数,这意味着您可以更改它。如果你不想这样做,那么删除“out”并声明一个t_tf_tab类型的局部变量,然后你可以改变它。

然后您可以单独调用它,例如:

declare
   l_tab t_tf_tab := t_tf_tab();
begin
   l_tab.extend;
   l_tab(l_tab.last) := t_tf_row(1. 'Hello');
   add_n_rows(3, l_tab);
end;