2012-03-09 3 views
1

SQL, Oracle 테이블에 여러 행을 INSERT하려고 시도했습니다. SQL Developer v3.0.040 행이 삽입되었습니다. 어떻게 해결할 수 있습니까?

데이터베이스가 Uni에 의해 설정되었으므로 버전이 무엇인지 모릅니다.

나는 아래 코드를 생각해 냈지만 데이터를 삽입하지는 않습니다. 삽입을 하나의 행으로 테스트했는데 OK입니다. 내가 뭘 놓치고 있니?

Insert all 
    Into Patient Values 
    ('101', '1 house', Null, 'Kingston', 'Surrey', 'KT1 1XX', '10/jan/1980', 'm', 01452987456) 
    Into Patient Values 
    ('102', '2 egg rd', 'vail', 'guildford', 'Surrey', 'GU1 1LL', '05/dec/1985', 'm', 01452987456) 
    Into Patient Values 
    ('103', '6 station rd', Null, 'guildford', 'Surrey', 'GU1 2XX', '15/may/1990', 'f', 01452987456) 

Select * from Patient; 
+0

'insert all'... 하나의 인스트럭션 인서트가 필요합니까? –

+0

''v $ version from dual '을 받으려면, –

+0

받고 계신가요? –

답변

6

INSERT ALL에는 두 가지 용도가 있습니다. 하나는 선택한 열의 다른 하위 집합을 표에 삽입하는 것입니다. 다른 하나는 특정 기준에 따라 행을 다른 행으로 안내하는 것입니다. 두 경우 모두 데이터는 VALUES가 아닌 SELECT 절에서 가져옵니다. See the examples in the documentation.

일반적으로 복수 INSERT 문을 단일 PL/SQL 블록에 잠재적으로 작성할 수 있습니다. 당신이 정말로 하나의 SQL 문에서이 작업을 수행하려면

begin 
    Insert Into Patient Values 
    ('101', '1 house', Null, 'Kingston', 'Surrey', 'KT1 1XX', '10/jan/1980', 'm', 01452987456); 
    Insert Into Patient Values 
    ('102', '2 egg rd', 'vail', 'guildford', 'Surrey', 'GU1 1LL', '05/dec/1985', 'm', 01452987456); 
    Insert Into Patient Values 
    ('103', '6 station rd', Null, 'guildford', 'Surrey', 'GU1 2XX', '15/may/1990', 'f', 01452987456); 
end; 
/

같은 무언가가, 당신은 INSERT ... SELECT 할 수 있지만, 일반적으로 세 개의 문을 사용하는 것보다 더 복잡 할 것입니다.

insert into patient 
    select * 
    from (select '101' id, '1 house' addr, null col1, 'Kingston' city, ... 
      from dual 
      union all 
      select '102', '2 egg rd', 'vail', 'guildford', 'Surrey', 'GU1 1LL', '05/dec/1985', 'm', 01452987456 
      from dual 
      union all 
      select '103', '6 station rd', Null, 'guildford', 'Surrey', 'GU1 2XX', '15/may/1990', 'f', 01452987456 
      from dual) 

난 당신이 적절한 데이터 형식을 사용하고 INSERT 문에서 열 이름을 지정하는주의도한다. 예를 들어, Patient 테이블의 첫 번째 열이 NUMBER으로 정의 된 PatientID 일종이라고 추측합니다. 그렇다면 실제로는 문자열이 아닌 숫자를 삽입하고 싶을 것입니다. 마찬가지로, '15/may/1990 '과 같은 값을 갖는 일곱 번째 열은 아마도 테이블에 DATE으로 정의됩니다. 그렇다면 INSERT은 특정 형식 마스크가있는 TO_DATE을 명시 적으로 호출하거나 ANSI 날짜 형식 (예 : date '1980-01-10')을 사용하여 문자열이 아닌 DATE을 삽입해야합니다. 마지막 열에 선행 0을 유지하려면 데이터베이스의 열이 VARCHAR2으로 정의되고 숫자가 아닌 문자열을 삽입해야합니다.

+1

@APC - 편집을 +1 할 수 있으면 좋겠다! –

+0

여러분을 환영합니다! – APC

+0

감사합니다 저스틴!처음에 ID를 인용 할 의도는 없었지만 모든 가정은 옳습니다. 두 솔루션 모두 잘 작동했지만 두 번째 솔루션의 응답이 마음에 들었습니다. 삽입 된 행 수가 "익명 블록 완료"라는 첫 번째 솔루션에 반대되는 것으로 나타납니다. 나는 그것이 바뀔지도 모르는 컬럼 이름을 언급한다면 그것을 추측하고있다. – MrPickles

1

흥미 롭습니다. 시도 할 때 insert all을 사용하여 여러 행을 삽입 할 수 있습니다. 저스틴이 제시 한 솔루션보다 그렇게하는 것이 좋습니다.

다중 테이블 삽입에 대한 syntax diagram은 하위 쿼리가 항상 필요함을 나타냅니다. 그러나 하위 쿼리의 결과 중 하나를 사용할 필요가 없습니다 :

SQL> drop table t; 

Table dropped. 

SQL> create table t (c1 number, c2 varchar2(10)); 

Table created. 

SQL> insert all into t (c1, c2) values (1, 'one') 
    2  into t (c1, c2) values (2, 'two') 
    3 select * from dual; 

2 rows created. 

SQL> select * from t; 

     C1 C2 
---------- ---------- 
     1 one 
     2 two 

두 행의 원인이됩니다 두 into ... values(...)는 서브 쿼리에서 행마다 삽입 할 : 나는 결코 없었다

SQL> insert all into t (c1, c2) values (1, 'one') 
    2  into t (c1, c2) values (2, 'two') 
    3 select * from dual 
    4 connect by level <= 10; 

20 rows created. 
+0

도움을 주셔서 감사합니다. 불행히도 첫 번째 게시물은 내가 찾고있는 것보다 많았습니다. – MrPickles

관련 문제