将数据从 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;
演示
创建 所需的 type 和 tables:
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;
如何将数据传输到对象中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;
演示
创建 所需的 type 和 tables:
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;