将数据从 table 存储到对象 table

Store data from table into object table

如何将数据传输到对象中table?

假设你有一个 table:

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

你有一个新对象table:

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

如何将此表中的数据传输到 oo_thisTable?

declare
    cursor c1 is
        select * from thisTable;
begin
    open c1;
    loop
        fetch c1 into column1, column2, column3;
        exit when c1%notfound;
        ...
INSERT INTO oo_thisTable (object1) SELECT object1_t(column1, column2, column3) FROM thisTable;

为了更好的可读性,您可以使用关键字 NEW 来明确表明您调用类型构造函数而不仅仅是一些函数。

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

不需要使用PL/SQL,你可以用纯SQL.

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

演示

创建 所需的 typetables:

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.

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.

现在我们要thistable中的所有行插入oo_thistable中:

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

3 rows created.

验证:

SQL> SELECT * FROM oo_thistable;

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

您已插入所有行。

我已经针对所描述的问题编写了一些顺序步骤。请试试这个,如果有帮助请告诉我。

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;