-2

我需要创建一个 PL/SQL 匿名块,该块必须将数据从t_srcto复制,t_dest并将重复的值存储在 table 中t_err

t_src有两列填充数据并且没有主键。
t_dest为空,第 1 列是主键。当重复出现异常时,我必须将其传递并将重复记录存储在t_err. 我必须使用游标、forall 和BULK COLLECT. 到目前为止,我已经创建了以下块:

    DECLARE 
    CURSOR c_copy IS
    select column1, column2
    from t_src;
    TYPE curtype IS TABLE of c_copy%ROWTYPE;
    cursor1 curtype;
 BEGIN 
   OPEN c_copy;
   LOOP 
     FETCH c_copy BULK COLLECT INTO cursor1;
     FORALL c_count IN 1..cursor1.COUNT SAVE EXCEPTIONS
     INSERT INTO t_dest          
                VALUES curtype(c_count)              
    EXCEPTION
    WHEN DUP_VAL_ON_INDEX THEN
    INSERT INTO t_err VALUES curtype(c_count);    
  EXIT WHEN c_copy%NOTFOUND
  END LOOP;
 CLOSE c_copy;
 END
4

1 回答 1

0

TYPE curtype IS TABLE of c_copy%ROWTYPE;
上面的行导致了这个问题。

您需要为每个字段(即 column1、column2)创建表类型变量。

TYPE tab_column1 是 t_src.COLUMN1%TYPE 的表;TYPE tab_column2 是 t_src.column2%type 的表;

L_column1 tab_column1; L_column2 tab_column2;

然后使用

FeTCH c_copy BULK COLLECT INTO L_column1, L_column2;

我以前遇到过类似的问题,这是我用来修复的解决方法。

于 2015-09-19T13:30:26.520 回答