insert all语句用法详解(三)
97
97
97
97
97
97
97
97
97
97
97
97
97
97
97
97
97
97
97
97
97
已选择24行。
SQL> SELECT * FROM V$VERSION;
BANNER
----------------------------------------------------------------
Oracle Database 10g Enterprise Edition Release 10.2.0.1.0 - Prod
PL/SQL Release 10.2.0.1.0 - Production
CORE 10.2.0.1.0 Production
TNS for 32-bit Windows: Version 10.2.0.1.0 - Production
NLSRTL Version 10.2.0.1.0 - Production
因此,在10g中还可以通过建立一个DETERMINISTIC属性的函数来解决这个问题,在函数调用过程中输入主键或者ROWID来唯一标识每条记录。由于TAB是
系统视图,不包含ROWID信息,需要建立一张新表:
SQL> CREATE TABLE TEST_TAB AS SELECT * FROM TAB;
表已创建。
SQL> CREATE OR REPLACE FUNCTION F_GETSEQ(P_ID IN ROWID) RETURN NUMBER DETERMINISTIC AS
2 V_SEQ NUMBER;
3 BEGIN
4 SELECT SEQ_TEST.NEXTVAL INTO V_SEQ FROM DUAL;
5 RETURN V_SEQ;
6 END;
7 /
函数已创建。
SQL> INSERT ALL INTO A (ID, NAME) VALUES (ID, TNAME)
2 INTO LOG_A (ID, NAME) VALUES (ID, TNAME)
3 SELECT F_GETSEQ(ROWID) ID, TNAME FROM TEST_TAB;
已创建48行。
SQL> SELECT * FROM A WHERE ROWNUM < 5;
ID NAME
---------- ------------------------------
98 DEPT
99 EMP
100 BONUS
101 SALGRADE
SQL> SELECT * FROM LOG_A WHERE ROWNUM < 5;
ID NAME
---------- ------------------------------
98 DEPT
99 EMP
100 BONUS
101 SALGRADE
至此,这个数据插入问题已经全部解决了。