我想创建一个向现有表添加新行的过程。但是使用当前的过程,我正在重写整个表。当前程序的代码是
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
。我想更新已经更新的那个。建议我使用正确的方法来处理所需的程序。谢谢
答案 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;