Plsql 当我将数据从表“table_1”移动到表“table_2”时,列大小有时不合适。oracle正在发送一个错误,如下所示

Plsql 当我将数据从表“table_1”移动到表“table_2”时,列大小有时不合适。oracle正在发送一个错误,如下所示,plsql,oracle11g,Plsql,Oracle11g,我想将数据从一个表移动到另一个表。 我为这个过程编写了一个plsql代码。 当我将数据从表“table_1”移动到表“table_2”时,列大小有时不合适。 oracle正在发送一个错误,如下所示 我已经确定了一个例外来消除这个错误。 但此异常处于静态状态。 我想让这个例外部分成为动态的。 也就是说,如果此错误发生在其他列中,我希望自动增加这些列中的列的大小。 下面是我编写的plsql代码 例如,oracle插入操作可能会在“解释”列中给出相同的错误。 我想修改“解释”列的大小。 如果发生此错误

我想将数据从一个表移动到另一个表。 我为这个过程编写了一个plsql代码。 当我将数据从表“table_1”移动到表“table_2”时,列大小有时不合适。 oracle正在发送一个错误,如下所示

我已经确定了一个例外来消除这个错误。 但此异常处于静态状态。 我想让这个例外部分成为动态的。 也就是说,如果此错误发生在其他列中,我希望自动增加这些列中的列的大小。 下面是我编写的plsql代码

例如,oracle插入操作可能会在“解释”列中给出相同的错误。 我想修改“解释”列的大小。 如果发生此错误, 我想为每一列自动执行这些操作

DECLARE
SAYAC INTEGER; 
SAYAC_2 INTEGER;
extension_already_exists  EXCEPTION;
PRAGMA EXCEPTION_INIT(extension_already_exists, -12899);
     BEGIN
     SAYAC:=0;
          FOR XX IN (SELECT 
                     FILE_NO,
                            NAME,
                            EV_ADRESI,
                            explanation
                  FROM TABLE_1 
                  WHERE NOT EXISTS (SELECT *
                  FROM TABLE_2
                  WHERE TABLE_2.FILE_NO = TABLE_1.FILE_NO )
                  )LOOP
                      BEGIN                  
                  SAYAC:=SAYAC+1;
                          EXECUTE IMMEDIATE 'INSERT INTO
                                    TABLE_2(
                                    FILE_NO,
                                    NAME,
                                    EV_ADRESI,
                                    explanation                                  
                                    ) 
                                    VALUES
                                    (
                                    :A,
                                    :B,
                                    :C,
                                    :D                                    
                                    ) ' 
                          using XX.FILE_NO,XX.NAME,XX.EV_ADRESI,xx.explanation                                                  
                                 ;                
                                  IF MOD(SAYAC,1000)=0 THEN
                                     COMMIT;                                  
                                  END IF;

                         EXCEPTION WHEN extension_already_exists THEN 
                                    dbms_output.put_line('seviye cok buyuk = '||sqlcode||' FILE_NO = '||XX.FILE_NO||','||xx.EV_ADRESI);--this error may occur in other columns
                          EXECUTE IMMEDIATE 'ALTER TABLE TABLE_2 MODIFY EV_ADRESI,explanation VARCHAR2(100)';                              --forexample xx.explanation
                                    NULL;                                                                                                        --I want to make this place dynamic
                       end;     
                  END LOOP; 
            COMMIT;
     END;
ORA-12899:值对于医院列太大。表2.EV\U ADRESI实际值:34,最大值:20
ORA-06512:在第20行,这无论如何都不会起作用。即使捕获错误并放大列,您也会错过有问题的行,因为您应该重复上一次插入失败

在我看来,您应该首先匹配列的datatpyes,然后以一种简单的方式将数据从这里移动到那里


顺便问一下,为什么要将动态SQL用于insert?这里没有任何动态。

动态SQL不仅是不必要的,PL/SQL和循环也是不必要的,这就是我简单的意思,@a_horse。应该这么说。感谢您为我这么做。这是增加列大小的业务要求吗?当源表中收到数据时,您可以首先创建与表2列相同的表1列,然后开始移动数据。这两个表属于不同的数据库。所以这两张桌子是不同的。想象一下,对于包含大量列的表中的不同列,会出现“ORA-12899:值对于列来说太大”错误。我得把这些柱子一根一根地修好。这是一个漫长的过程。我想把这种情况自动化。