Oracle PL / SQL의 변수에 여러 열이있는 마이너스 쿼리 결과 저장
내가 TABLE_TWO에 비해 TABLE_ONE에서 별도의 프로젝트 ID가 존재 가져 오는 코드 이하로 사용하고 있습니다 (소스 오라클 PL의 변수에 마이너스 쿼리 (VARCHAR에 대한 목록)의 저장 결과를 / SQL )
DECLARE
l_missing_id_list SYS.ODCINUMBERLIST;
BEGIN
SELECT project_id
BULK COLLECT INTO l_missing_id_list
FROM
(
SELECT t1.project_id FROM table_one t1
MINUS
SELECT t2.project_id FROM table_two t2 );
FORALL i IN l_missing_id_list.FIRST..l_missing_id_list.LAST
INSERT INTO table_two VALUES ( l_missing_id_list(i) );
COMMIT;
-- Values are now inserted and you have the list of IDs in l_missing_id_list to add to your email.
END;
이제 두 번째 테이블에도 해당 프로젝트 이름을 추가하고 싶습니다. TABLE_TWO와 비교하여 TABLE_ONE에 존재하는 추가 project_id는 해당 프로젝트 이름과 함께 TABLE_TWO에 삽입되어야합니다. 어떻게하나요? 결과로 여러 단계를 수행 할 것이므로 마이너스 쿼리 결과를 변수에 저장해야합니다.
답변
SYS.ODCINUMBERLIST
각 레코드에 단일 번호가있는 목록입니다. 각 행에 여러 필드를 저장하려면 새 레코드 유형을 사용해야합니다.
대신 사용할 레코드 유형을 정의 할 수 SYS.ODCINUMBERLIST
있습니다. 그러나 나는 SELECT
당신이 새로운 유형을 cursor로 정의 할 수 있도록 명령문을 명시 적 커서 로 옮기는 경향이 있습니다 %ROWTYPE
. 이렇게하면 레코드 유형과 select 문이 항상 일관되지만 코드 구조가 약간 변경됩니다.
그 접근 방식은 다음과 같습니다.
DECLARE
CURSOR c_select IS
SELECT project_id, project_name
FROM
(
SELECT t1.project_id, t1.project_name FROM table_one t1
MINUS
SELECT t2.project_id, t2.project_name FROM table_two t2 );
TYPE l_missing_row_list_typ IS TABLE OF c_select%ROWTYPE;
l_missing_row_list l_missing_row_list_typ;
BEGIN
OPEN c_select;
FETCH c_select BULK COLLECT INTO l_missing_row_list;
CLOSE c_select;
FORALL i IN l_missing_row_list.FIRST..l_missing_row_list.LAST
INSERT INTO table_two VALUES ( l_missing_row_list(i).project_id, l_missing_row_list(i).project_name );
COMMIT;
-- Values are now inserted and you have the list of IDs in l_missing_row_list to add to your email.
END;
BULK COLLECT
(여기와 원본 게시물 모두) 에 대한 참고 사항 -대량 수집중인 데이터는 PGA 메모리에 저장됩니다. 따라서 변경 사항이있는 경우이 코드를 그대로 사용하지 마십시오. 새 레코드 수가 부적절 할 수 있습니다 (아마도 수천 개 이상).