2013-12-19 21 views
0

我想创建一个将新行添加到已经存在的表的过程。但是使用当前的过程,我正在重写整个表。当前程序的代码是更新已经填充的表的过程

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

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

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; 
当我运行的程序
+0

,我发现了以下错误。 'PLS-00363:表达'P_TAB'不能用作分配目标' – ethan

+0

Ooops,是的,会发生;我修复了它。 – Ben

+0

当按照指示调用程序时,得到错误'Subscript beyond count' @Ben – ethan

相关问题