복붙노트

[SQL] 하위 쿼리 및 반환 절에 PLSQL 삽입

SQL

하위 쿼리 및 반환 절에 PLSQL 삽입

나는 다음과 같은 의사-SQL에 대한 올바른 구문을 알아낼 수 없습니다 :

INSERT INTO some_table
           (column1,
            column2)
     SELECT col1_value, 
            col2_value 
       FROM other_table
      WHERE ...       
  RETURNING id
       INTO local_var; 

나는 서브 쿼리의 값으로 뭔가를 삽입하고 싶습니다. 삽입 한 후 나는 새로운 생성 된 ID가 필요합니다.

오라클 문서의 말씀을 Heres :

삽입 문

속으로 반환

OK 내가 그것을 값만 절 불가능하다고 생각 ... 대안이 있습니까?

해결법

  1. ==============================

    1.당신은 INSERT에서 COLLECT 복귀 BULK를 사용할 수 없습니다. 이 방법은 업데이트와 삭제가 howeveer 작업 할 수 있습니다 :

    당신은 INSERT에서 COLLECT 복귀 BULK를 사용할 수 없습니다. 이 방법은 업데이트와 삭제가 howeveer 작업 할 수 있습니다 :

    create table test2(aa number)
    /
    insert into test2(aa)
          select level
            from dual
            connect by level<100
    /        
    
    set serveroutput on
    declare 
         TYPE t_Numbers IS TABLE OF test2.aa%TYPE
            INDEX BY BINARY_INTEGER;
          v_Numbers t_Numbers;
          v_count number;
    begin
    
    
    update test2
      set aa = aa+1
    returning aa bulk collect into v_Numbers;
    
        for v_count in 1..v_Numbers.count loop
            dbms_output.put_line('v_Numbers := ' || v_Numbers(v_count));
        end loop;
    
    end;
    

    당신은 몇 가지 추가 단계 사업에 그것을 얻을 (A FORALL INSERT 활용 TREAT을 수행) 할 수 있습니다 이 문서에 설명 된대로 :

    insert..select로 복귀

    자신이 만든 예제를 활용 TEST2 테스트 테이블에 적용합니다

     CREATE or replace TYPE ot AS OBJECT
        ( aa number);
    /
    
    
    CREATE TYPE ntt AS TABLE OF ot;
    /
    
    set serveroutput on
     DECLARE
    
           nt_passed_in ntt;
           nt_to_return ntt;
    
           FUNCTION pretend_parameter RETURN ntt IS
              nt ntt;
           BEGIN
              SELECT ot(level) BULK COLLECT INTO nt
             FROM   dual
             CONNECT BY level <= 5;
             RETURN nt;
          END pretend_parameter;
    
       BEGIN
    
          nt_passed_in := pretend_parameter();
    
          FORALL i IN 1 .. nt_passed_in.COUNT
             INSERT INTO test2(aa)
             VALUES
             ( TREAT(nt_passed_in(i) AS ot).aa
             )
             RETURNING ot(aa)
             BULK COLLECT INTO nt_to_return;
    
          FOR i IN 1 .. nt_to_return.COUNT LOOP
             DBMS_OUTPUT.PUT_LINE(
                'Sequence value = [' || TO_CHAR(nt_to_return(i).aa) || ']'
                );
          END LOOP;
    
       END;
       /
    
  2. ==============================

    2.불행하게도 그 수는 없습니다. 가 돌려 INSERT ... VALUES 문에만 사용할 수 있습니다. 이 주제에 대한 설명이 오라클 포럼 스레드를 참조하십시오.

    불행하게도 그 수는 없습니다. 가 돌려 INSERT ... VALUES 문에만 사용할 수 있습니다. 이 주제에 대한 설명이 오라클 포럼 스레드를 참조하십시오.

  3. ==============================

    3.삽입이 선택을 기반으로하기 때문에, 오라클은 해당 구문을 사용하여 여러 행 삽입을 허용된다고 가정한다. 이 경우, 반환 절 문서의 여러 행 버전에서 보면 그것은 당신이 결과 집합에 모든 삽입 된 행의 값을 검색 할 COLLECT 사용 BULK 할 필요가 있음을 보여줍니다한다.

    삽입이 선택을 기반으로하기 때문에, 오라클은 해당 구문을 사용하여 여러 행 삽입을 허용된다고 가정한다. 이 경우, 반환 절 문서의 여러 행 버전에서 보면 그것은 당신이 결과 집합에 모든 삽입 된 행의 값을 검색 할 COLLECT 사용 BULK 할 필요가 있음을 보여줍니다한다.

    당신의 삽입 쿼리가 두 행 만드는 경우 결국, - 값을 반환 그것은 하나의 변수에 넣을까요?

    편집 -이 판명이 작품은 내가 생각했던하지 않는 한 .... 이놈이!

  4. ==============================

    4.이 MySQL을 사용하고 있기 때문에 이는 쉽지 확실히 쉽게 당신이 생각하는대로하지 않고,. 오라클은 결과를 다시 ping 할 수있는 방식으로, 마지막 삽입을 추적하지 않습니다.

    이 MySQL을 사용하고 있기 때문에 이는 쉽지 확실히 쉽게 당신이 생각하는대로하지 않고,. 오라클은 결과를 다시 ping 할 수있는 방식으로, 마지막 삽입을 추적하지 않습니다.

    당신은, 당신은 ROWID를 사용하여 할 수있는이 일을 다른 방법으로 해결해야합니다 -하지만 그 함정이있다.

    이 링크는이 문제를 논의 : http://forums.oracle.com/forums/thread.jspa?threadID=352627

  5. from https://stackoverflow.com/questions/5325033/plsql-insert-into-with-subquery-and-returning-clause by cc-by-sa and MIT license