2015-11-17 2 views
2

Comment procéder pour transférer des données dans une table d'objets?Stocker les données de la table dans la table d'objets

que vous avez une table:

create table thisTable(
    column1 varchar2(20), 
    column2 varchar2(20), 
    column3 varchar2(20) 
) 
/

Et vous avez une nouvelle table d'objet:

create table oo_thisTable(
    object1 object1_t 
) 
/
create type object1_t as object (
    column1 varchar2(20), 
    column2 varchar2(20), 
    column3 varchar2(20) 
) 
/

Comment voulez-vous transférer les données de CetteTable à oo_thisTable?

declare 
    cursor c1 is 
     select * from thisTable; 
begin 
    open c1; 
    loop 
     fetch c1 into column1, column2, column3; 
     exit when c1%notfound; 
     ... 

Répondre

3

Pas besoin d'utiliser PL/SQL, vous pouvez le faire dans le plus pur SQL.

INSERT INTO oo_thistable SELECT object1_t(column1, column2, column3) FROM thistable; 

Démo

Créer le nécessaire tables de type et :

SQL> create table thisTable(
    2  column1 varchar2(20), 
    3  column2 varchar2(20), 
    4  column3 varchar2(20) 
    5 ) 
    6/

Table created. 

SQL> create type object1_t as object (
    2  column1 varchar2(20), 
    3  column2 varchar2(20), 
    4  column3 varchar2(20) 
    5 ) 
    6/

Type created. 

SQL> create table oo_thisTable(
    2  object1 object1_t 
    3 ) 
    4/

Table created. 

Insérez quelques lignes dans thistable:

SQL> INSERT INTO thistable VALUES('a','b','c'); 

1 row created. 

SQL> INSERT INTO thistable VALUES('d','e','f'); 

1 row created. 

SQL> INSERT INTO thistable VALUES('g','h','i'); 

1 row created. 

Maintenant, nous voulons insérer toutes les lignes de thistable en oo_thistable:

SQL> INSERT INTO oo_thistable SELECT object1_t(column1, column2, column3) FROM thistable; 

3 rows created. 

Valider:

SQL> SELECT * FROM oo_thistable; 

OBJECT1(COLUMN1, COLUMN2, COLUMN3) 
-------------------------------------------------------------------------------- 
OBJECT1_T('a', 'b', 'c') 
OBJECT1_T('d', 'e', 'f') 
OBJECT1_T('g', 'h', 'i') 

Vous avez toutes les lignes insérées.

2
INSERT INTO oo_thisTable (object1) SELECT object1_t(column1, column2, column3) FROM thisTable; 

Pour une meilleure lisibilité, vous pouvez utiliser mot-clé NEW pour montrer explicitement que vous invoquez constructeur de type pas seulement quelques-uns auj.

INSERT INTO oo_thisTable (object1) SELECT new object1_t(column1, column2, column3) FROM thisTable; 
2

J'ai écrit quelques étapes séquentielles pour le problème décrit. S'il vous plaît essayez ceci et laissez-moi savoir si cela aide.

SQL> set sqlbl on; 
SQL> set define off; 
SQL> set timing on; 
SQL> DROP TYPE TEST_TAB; 

Type dropped. 

Elapsed: 00:00:00.90 
SQL> 
SQL> DROP TYPE Test_oo; 

Type dropped. 

Elapsed: 00:00:00.58 
SQL> CREATE OR REPLACE type Test_oo 
    2 IS 
    3 OBJECT 
    4 (
    5 col1 NUMBER, 
    6 COL2 VARCHAR2(100 CHAR), 
    7 COL3 TIMESTAMP 
    8 ); 
    9/

Type created. 

Elapsed: 00:00:00.21 
SQL> CREATE OR REPLACE TYPE TEST_TAB IS TABLE OF TEST_OO; 
    2/

Type created. 

Elapsed: 00:00:00.20 
SQL> DROP TABLE TEST_TABLE; 

Table dropped. 

Elapsed: 00:00:00.39 
SQL> CREATE TABLE TEST_TABLE 
    2 (
    3 O_col1 NUMBER, 
    4 O_COL2 VARCHAR2(100 CHAR), 
    5 O_COL3 TIMESTAMP 
    6 ); 

Table created. 

Elapsed: 00:00:00.28 
SQL> INSERT INTO TEST_TABLE 
    2 SELECT LEVEL,LEVEL||'AV',SYSDATE+LEVEL 
    3 FROM DUAL 
    4 CONNECT BY LEVEL < 10; 

9 rows created. 

Elapsed: 00:00:00.11 
SQL> 
SQL> COMMIT; 

Commit complete. 

Elapsed: 00:00:00.10 
SQL> DECLARE 
    2 lv_obj TEST_TAB; 
    3 BEGIN 
    4 dbms_output.put_line('test'); 
    5 SELECT test_oo(T1.O_COL1,T1.O_COL2,T1.O_COL3) bulk collect 
    6 INTO lv_obj 
    7 FROM test_table t1; 
    8 FOR I IN LV_OBJ.FIRST..LV_OBJ.LAST 
    9 LOOP 
10  dbms_output.put_line(LV_OBJ(I).COL1||' '||LV_OBJ(I).COL2||' '||LV_OBJ(I).COL3); 
11 END LOOP; 
12 END; 
13/
test                    
1 1AV 18-NOV-15 02.04.29.000000 AM            
2 2AV 19-NOV-15 02.04.29.000000 AM            
3 3AV 20-NOV-15 02.04.29.000000 AM            
4 4AV 21-NOV-15 02.04.29.000000 AM            
5 5AV 22-NOV-15 02.04.29.000000 AM            
6 6AV 23-NOV-15 02.04.29.000000 AM            
7 7AV 24-NOV-15 02.04.29.000000 AM            
8 8AV 25-NOV-15 02.04.29.000000 AM            
9 9AV 26-NOV-15 02.04.29.000000 AM            

PL/SQL procedure successfully completed. 

Elapsed: 00:00:00.12 
SQL> spool off;