[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.당신은 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.불행하게도 그 수는 없습니다. 가 돌려 INSERT ... VALUES 문에만 사용할 수 있습니다. 이 주제에 대한 설명이 오라클 포럼 스레드를 참조하십시오.
불행하게도 그 수는 없습니다. 가 돌려 INSERT ... VALUES 문에만 사용할 수 있습니다. 이 주제에 대한 설명이 오라클 포럼 스레드를 참조하십시오.
-
==============================
3.삽입이 선택을 기반으로하기 때문에, 오라클은 해당 구문을 사용하여 여러 행 삽입을 허용된다고 가정한다. 이 경우, 반환 절 문서의 여러 행 버전에서 보면 그것은 당신이 결과 집합에 모든 삽입 된 행의 값을 검색 할 COLLECT 사용 BULK 할 필요가 있음을 보여줍니다한다.
삽입이 선택을 기반으로하기 때문에, 오라클은 해당 구문을 사용하여 여러 행 삽입을 허용된다고 가정한다. 이 경우, 반환 절 문서의 여러 행 버전에서 보면 그것은 당신이 결과 집합에 모든 삽입 된 행의 값을 검색 할 COLLECT 사용 BULK 할 필요가 있음을 보여줍니다한다.
당신의 삽입 쿼리가 두 행 만드는 경우 결국, - 값을 반환 그것은 하나의 변수에 넣을까요?
편집 -이 판명이 작품은 내가 생각했던하지 않는 한 .... 이놈이!
-
==============================
4.이 MySQL을 사용하고 있기 때문에 이는 쉽지 확실히 쉽게 당신이 생각하는대로하지 않고,. 오라클은 결과를 다시 ping 할 수있는 방식으로, 마지막 삽입을 추적하지 않습니다.
이 MySQL을 사용하고 있기 때문에 이는 쉽지 확실히 쉽게 당신이 생각하는대로하지 않고,. 오라클은 결과를 다시 ping 할 수있는 방식으로, 마지막 삽입을 추적하지 않습니다.
당신은, 당신은 ROWID를 사용하여 할 수있는이 일을 다른 방법으로 해결해야합니다 -하지만 그 함정이있다.
이 링크는이 문제를 논의 : http://forums.oracle.com/forums/thread.jspa?threadID=352627
from https://stackoverflow.com/questions/5325033/plsql-insert-into-with-subquery-and-returning-clause by cc-by-sa and MIT license
'SQL' 카테고리의 다른 글
[SQL] 여러 행을 기준으로 테이블에서 MYSQL 선택 (0) | 2020.05.29 |
---|---|
[SQL] MS 액세스 제한 (0) | 2020.05.29 |
[SQL] 액세스 - 두 개의 테이블 및 업데이트를 비교하거나 첫 번째 테이블에 데이터를 삽입 (0) | 2020.05.29 |
[SQL] 어떻게 2005 SQL Server를 사용하여 별도의 행에 쉼표로 구분 된 값을 확장합니까? (0) | 2020.05.29 |
[SQL] SSIS를 사용하면 파일에 테이블 데이터의 XML 표현을 추출 (0) | 2020.05.29 |