PLSQL 하위 쿼리 및 반환 절을 사용하여 에 삽입
다음 pseudo-sql에 대한 올바른 구문을 찾을 수 없습니다.
INSERT INTO some_table
(column1,
column2)
SELECT col1_value,
col2_value
FROM other_table
WHERE ...
RETURNING id
INTO local_var;
하위 쿼리의 값을 가진 것을 삽입하고 싶습니다.삽입 후에 새로 생성된 아이디가 필요합니다.
오라클 문서의 설명은 다음과 같습니다.
네, 저는 가치 조항만으로는 불가능하다고 생각합니다...대안이 있습니까?
INSERT에서는 RETURNING BULL COLLECT를 사용할 수 없습니다.이 방법은 업데이트 및 삭제와 함께 사용할 수 있습니다.
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;
이 문서에 설명된 대로 몇 가지 추가 단계(TRAE를 사용하여 FORAL INSERT를 수행)를 수행하면 작동할 수 있습니다.
T
작성한 예제를 활용하여 테스트 2 테스트 표에 적용합니다.
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;
/
안타깝게도 그것은 불가능합니다.RETURNING은 INSERT...VALUE 문에만 사용할 수 있습니다.이 주제에 대한 자세한 내용은 이 Oracle 포럼 스레드를 참조하십시오.
할 수는 없지만 적어도 Oracle 19c에서는 다음을 지정할 수 있습니다.SELECT내부의 하위 질의VALUES절 등의 용법RETURNING이 방법은 다음과 같은 작업을 반복해야 하는 경우에도 유용한 해결 방법이 될 수 있습니다.WHERE모든 필드에 대한 절:
INSERT INTO some_table
(column1,
column2)
VALUES((SELECT col1_value FROM other_table WHERE ...),
(SELECT col2_value FROM other_table WHERE ...))
RETURNING id
INTO local_var;
삽입은 선택 항목을 기반으로 하기 때문에 Oracle은 사용자가 해당 구문으로 다중 행 삽입을 허용하는 것으로 간주합니다.이 경우 BULK COLLECT를 사용하여 삽입된 모든 행에서 결과 집합으로 값을 검색해야 하므로 반환 절 문서의 다중 행 버전을 확인하십시오.
결국, 삽입 쿼리가 두 개의 행을 생성하는 경우, 어떤 값을 반환하여 단일 변수에 넣을까요?
편집 - 알고 보니 이게 제가 생각했던 것처럼 작동하지 않네요… 젠장!
이것은 여러분이 생각하는 것만큼 쉽지 않고 MySQL을 사용하는 것만큼 쉽지 않습니다.Oracle은 결과를 ping백할 수 있는 방식으로 마지막 삽입을 추적하지 않습니다.
당신은 이것을 하는 다른 방법을 생각해 내야 할 것입니다. ROWID를 사용하여 할 수 있습니다. 하지만 이것에는 함정이 있습니다.
이 링크는 이 문제에 대해 논의했습니다. http://forums.oracle.com/forums/thread.jspa?threadID=352627
언급URL : https://stackoverflow.com/questions/5325033/plsql-insert-into-with-subquery-and-returning-clause
'programing' 카테고리의 다른 글
| 스프링 부트: 동적 상위 개체에서 JSON 응답 래핑 (0) | 2023.07.08 |
|---|---|
| 폴더의 모든 파일을 여는 방법 (0) | 2023.07.08 |
| Spring Boot에서 테스트 목적으로 DB 연결을 모의 실행하려면 어떻게 해야 합니까? (0) | 2023.07.08 |
| 문서 집합에 대한 각 값의 발생 횟수를 몽고 카운트 (0) | 2023.07.08 |
| SQL 스크립트 하나로 하위 및 상위 행 삭제 (0) | 2023.07.08 |