2015-04-06 74 views
3

我想使用INSERT ALL語句將2行插入到2個不同的表中。 但是,如果我想自己插入值,下面的查詢工作正常。Oracle INSERT ALL with SELECT給出無效的規範錯誤

insert all 
into REGIONS values (5,'Africa') 
into JOBS values ('ZZZZ','Shop Sleeper',1000,1000) 
select * from DUAL; 

但是如果我想複製一排不同的主鍵值,下面的語句給我ORA-01747錯誤

insert all 
into REGIONS (select :REGION_ID,REGION_NAME from REGION where REGION_ID = 4) 
into JOBS (select :JOB_ID,JOB_TITLE,MIN_SALARY,MAX_SALARY where JOB_ID = 'ST_CLERK') 
select * from DUAL; 

我不知道如何糾正查詢。請幫忙。

回答

2
insert all 
into REGIONS (select :REGION_ID,REGION_NAME from REGION where REGION_ID = 4) 
into JOBS (select :JOB_ID,JOB_TITLE,MIN_SALARY,MAX_SALARY where JOB_ID = 'ST_CLERK') 
select * from DUAL; 

上面INSERT ALL是不正確句法。您必須提及VALUES關鍵字和列出您要從表中選擇要插入行的所需列

正確的語法是:

INSERT ALL 
INTO REGIONS VALUES 
    (
    REGION_ID, 
    REGION_NAME 
) 
INTO JOBS VALUES 
    (
    JOB_ID, 
    JOB_TITLE, 
    MIN_SALARY, 
    MAX_SALARY 
) 
SELECT REGION_ID, 
    REGION_NAME, 
    JOB_ID, 
    JOB_TITLE, 
    MIN_SALARY, 
    MAX_SALARY 
FROM region, jobs 
WHERE region.column=job.column --> Jon with the required key 
AND ...; --> Put the required filter conditions     
  • 測試案例#1

隨着目標表相同的列。

SQL> CREATE TABLE tab1(a NUMBER, b varchar2(20)); 

Table created. 

SQL> CREATE TABLE tab2(a NUMBER, b varchar2(20)); 

Table created. 

SQL> 
SQL> INSERT ALL 
    2 INTO tab1(A, b) VALUES(empno, ename) 
    3 INTO tab2(A, b)VALUES(empno, ename) 
    4 SELECT empno, ename FROM emp; 

28 rows created. 

SQL> 

因此,所有行分別TAB1TAB2插入表中。讓我們來看看:

SQL> SELECT * FROM tab1; 

     A B 
---------- -------------------- 
     7369 SMITH 
     7499 ALLEN 
     7521 WARD 
     7566 JONES 
     7654 MARTIN 
     7698 BLAKE 
     7782 CLARK 
     7788 SCOTT 
     7839 KING 
     7844 TURNER 
     7876 ADAMS 
     7900 JAMES 
     7902 FORD 
     7934 MILLER 

14 rows selected. 

SQL> SELECT * FROM tab2; 

     A B 
---------- -------------------- 
     7369 SMITH 
     7499 ALLEN 
     7521 WARD 
     7566 JONES 
     7654 MARTIN 
     7698 BLAKE 
     7782 CLARK 
     7788 SCOTT 
     7839 KING 
     7844 TURNER 
     7876 ADAMS 
     7900 JAMES 
     7902 FORD 
     7934 MILLER 

14 rows selected. 

SQL> 
  • 測試案例#2

隨着目標表的不同列。

SQL> CREATE TABLE tab1(a NUMBER); 

Table created. 

SQL> CREATE TABLE tab2(b varchar2(20)); 

Table created. 

SQL> 
SQL> INSERT ALL 
    2 INTO tab1(A) VALUES(empno) 
    3 INTO tab2(b)VALUES(ename) 
    4 SELECT empno, ename FROM emp; 

28 rows created. 

讓我們來看看:

SQL> SELECT * FROM tab1; 

     A 
---------- 
     7369 
     7499 
     7521 
     7566 
     7654 
     7698 
     7782 
     7788 
     7839 
     7844 
     7876 
     7900 
     7902 
     7934 

14 rows selected. 

SQL> SELECT * FROM tab2; 

B 
-------------------- 
SMITH 
ALLEN 
WARD 
JONES 
MARTIN 
BLAKE 
CLARK 
SCOTT 
KING 
TURNER 
ADAMS 
JAMES 
FORD 
MILLER 

14 rows selected. 

SQL> 
  • 測試案例#3

隨着目標表不同列和不同的列在源表

SQL> CREATE TABLE tab1(A VARCHAR2(20)); 

Table created. 

SQL> CREATE TABLE tab2(b NUMBER); 

Table created. 

SQL> 
SQL> INSERT ALL 
    2  INTO tab1(A) VALUES(ename) 
    3  INTO tab2(b)VALUES(deptno) 
    4  SELECT e.ename ename, d.deptno deptno FROM emp e, dept d 
    5  where e.deptno = d.deptno; 

28 rows created. 

SQL> 

讓我們來看看:

SQL> SELECT * FROM tab1; 

A 
-------------------- 
SMITH 
ALLEN 
WARD 
JONES 
MARTIN 
BLAKE 
CLARK 
SCOTT 
KING 
TURNER 
ADAMS 
JAMES 
FORD 
MILLER 

14 rows selected. 

SQL> SELECT * FROM tab2; 

     B 
---------- 
     20 
     30 
     30 
     20 
     30 
     30 
     10 
     20 
     10 
     30 
     20 
     30 
     20 
     10 

14 rows selected. 

SQL> 
+0

感謝INSERT INTO的上述解釋。我完全瞭解它的工作。但是,您提供的**正確語法**是錯誤的,因爲** JOBS **表的列在** REGIONS **表(HR SCHEMA)中不存在。我開始懷疑,應該還是不應該使用INSERT ALL,併爲兩個**插入到table_name select ... **語句中。你有什麼意見? – 2015-04-06 11:20:26

+0

沒問題,你仍然可以使用它。只需加入這兩個表格。見我更新的答案,**測試案例3 **。此外,更新了您的問題的正確語法。 – 2015-04-06 11:30:04

0

嘗試......

INSERT ALL 
INTO REGIONS(REGION_ID,REGION_NAME) 
SELECT REGION_ID,REGION_NAME from REGION where REGION_ID = 4 
INTO JOBS(JOB_ID,JOB_TITLE,MIN_SALARY,MAX_SALARY) 
SELECT JOB_ID,JOB_TITLE,MIN_SALARY,MAX_SALARY where JOB_ID = 'ST_CLERK' 
SELECT * FROM DUAL; 
+0

錯誤在命令行:4列:1份 錯誤報告 - SQL錯誤:ORA-00933:SQL命令不能正確地結束 00933. 00000 - 「SQL命令不能正確地結束」 *原因: *操作: – 2015-04-06 11:22:42