2010-05-06 6 views
1

Je suis en train de faire une table de temps d'exécution nommé données dynamiques et y insérant de l'index par table en utilisant la mise à jour en vrac, mais quand je suis en train de l'exécuter cette erreur est à venir:Exécuter l'insertion de l'heure à l'aide de la mise à jour en bloc, ce qui génère une erreur interne?

ERREUR à la ligne 1: ORA-06550: ligne 0, colonne 0: PLS-00801: erreur interne [74301

]

declare 

    type index_tbl_type IS table of 
     number 
    index by binary_integer; 
    num_tbl index_tbl_type; 
    TYPE ref_cur IS REF CURSOR; 
    cur_emp ref_cur; 
    begin 
     execute immediate 'create table dynamic (v_num number)';--Creating a run time tabl 

     FOR i in 1..10000 LOOP 
       execute immediate 'insert into dynamic values('||i||')';--run time insert 
     END LOOP; 
     OPEN cur_emp FOR 'select * from dynamic';--opening ref cursor 
      FETCH cur_emp bulk collect into num_tbl;--bulk inserting in index by table 
     close cur_emp; 

     FORALL i in num_tbl.FIRST..num_tbl.LAST --Bulk update 
      execute immediate 'insert into dynamic values('||num_tbl(i)||')'; 
    end; 
+1

Comme je vous l'ai demandé dans d'autres questions: Pourquoi ce wiki communautaire? Ce n'est pas une question d'opinion – APC

Répondre

2

La déclaration FORALL attend une instruction SQL - INSERT , UPDATE ou DELETE. EXECUTE IMMEDIATE est une instruction PL/SQL, c'est pourquoi votre code lance cette exception.

Ce genre de cascades n'est pas une bonne idée en production. Les tables doivent être construites à l'aide de scripts DDL et non de SQL dynamique.

Anyhoo, si vous voulez faire quelque chose dans ce genre de stylee dynamique c'est de savoir comment s'y prendre:

Étape 1: créer un type SQL, qui peut être utilisé dans les instructions SQL

SQL> create or replace type my_nums as table of number 
    2/

Type created. 

SQL> 

Etape 2: ma version de votre procédure, qui utilise le type de table SQL au lieu de celui de PL/SQL. J'ai réécrit la clause FORALL en tant qu'instruction INSERT dynamique qui utilise la collection dans une clause TABLE().

SQL> declare 
    2 
    3  num_tbl my_nums; 
    4  TYPE ref_cur IS REF CURSOR; 
    5  cur_emp ref_cur; 
    6 begin 
    7  execute immediate 'create table dynamic (v_num number)'; 
    8 
    9  FOR i in 1..10000 LOOP 
10   execute immediate 'insert into dynamic values('||i||')' 
11  END LOOP; 
12  OPEN cur_emp FOR 'select * from dynamic'; 
13  FETCH cur_emp bulk collect into num_tbl; 
14  close cur_emp; 
15 
16  execute immediate 
17   'insert into dynamic select * from table(:1)' using num_tbl; 
18 end; 
19/

PL/SQL procedure successfully completed. 

SQL> 

Étape 3: cela fonctionne

SQL> select count(*) from dynamic 
    2/

    COUNT(*) 
---------- 
    20000 

SQL> 
-1
DECLARE 

      TYPE numlist is table of number index by binary_integer; 

      var_num numlist; 

BEGIN 

      for i in 1..1000 loop 

         var_num(i):=i; 

      end loop; 

      EXECUTE IMMEDIATE 'create table exe_table(col1 number(10))'; 

      forall i in var_num.first..var_num.last 

         EXECUTE IMMEDIATE 'INSERT INTO exe_table values(:P)' USING var_num(i); 

end loop; 

Pourquoi est-ce fonctionne alors?

Questions connexes