Oracle: 행 유형 데이터를 다른 테이블에 삽입합니다.
나는 event라는 테이블이 하나 있는데, event와 같은 열과 정의로 또 다른 글로벌 temp table tmp_event를 만들었습니다.이것을 이용하여 이벤트 내 레코드를 tmp_event에 삽입할 수 있습니까?
DECLARE
v_record event%rowtype;
BEGIN
Insert into tmp_event values v_record;
END;
이벤트 테이블에 열이 너무 많아서요, 열을 다 나열하고 싶지 않아서 해보려고요.
언급하는 것을 잊었습니다.트리거에 사용합니다. 이 v_record가 EVENT 테이블에 삽입 후 object:new가 될 수 있습니까?
하나의 행을 삽입하려면-
DECLARE
v_record event%rowtype;
BEGIN
SELECT * INTO v_record from event where rownum=1; --or whatever where clause
Insert into tmp_event values v_record;
END;
또는 모든 행을 삽입하기 위해 더 정교한 버전event
-
DECLARE
TYPE t_bulk_collect_test_tab IS TABLE OF event%ROWTYPE;
l_tab t_bulk_collect_test_tab;
CURSOR c_data IS
SELECT *
FROM event;
BEGIN
OPEN c_data;
LOOP
FETCH c_data
BULK COLLECT INTO l_tab LIMIT 10000;
EXIT WHEN l_tab.count = 0;
-- Process contents of collection here.
Insert into tmp_event values v_record;
END LOOP;
CLOSE c_data;
END;
/
방아쇠에서는 가능하지만 닭이나 달걀과 같습니다.의 모든 필드를 초기화해야 합니다.rowtype
와 함께:new
열 값:
v_record.col1 := :new.col1;
v_record.col2 := :new.col2;
v_record.col3 := :new.col3;
....
위의 PLSQL 예제는 변이 트리거 오류를 발생시키므로 트리거에 사용할 수 없습니다.위에서 설명한 것처럼 각 열에 개별적으로 액세스하는 것 외에 트리거의 전체 행을 얻을 수 있는 다른 방법은 없습니다. 따라서 이 모든 작업을 수행하는 경우 직접 사용하지 않는 것이 좋습니다.:new.col
에서INSERT into temp_event
그 자체로 많은 일을 절약할 수 있을 겁니다.
또한 모든 열을 언급하는 것은 많은 작업이라고 하셨으므로, (Oracle 11gR2에서) 다음과 같은 방법을 생성하여 빠른 작업을 수행할 수 있습니다.INSERT
문을 열고 동적으로 실행합니다(성능 테스트는 아니지만).
CREATE OR REPLACE TRIGGER event_air --air stands for "after insert of row"
AFTER INSERT ON EVENT
FOR EACH ROW
L_query varchar2(2000); --size it appropriately
BEGIN
SELECT 'INSERT INTO tmp_event VALUES ('|| listagg (':new.'||column_name, ',')
WITHIN GROUP (ORDER BY column_name) ||')'
INTO l_query
FROM all_tab_columns
WHERE table_name='EVENT';
EXECUTE IMMEDIATE l_query;
EXCEPTION
WHEN OTHERS THEN
--Meaningful exception handling here
END;
%Rowtype으로 여러 행을 테이블에 삽입하는 방법이 있습니다.
아래 예제를 확인합니다.
DECLARE
TYPE v_test IS TABLE OF TEST_TAB%rowtype;
v_test_tab v_test ;
EXECUTE immediate ' SELECT * FROM TEST_TAB ' bulk collect INTO v_test_tab ;
dbms_output.put_line('v_test_tab.count -->'||v_test_tab.count);
FOR i IN 1..v_test_tab.count
LOOP
INSERT INTO TEST_TAB_1 VALUES v_test_tab
(i
) ;
END LOOP;
END;
완전한 예를 들어보면...
DECLARE
TYPE t_bulk_collect_test_tab IS TABLE OF event%ROWTYPE;
l_tab t_bulk_collect_test_tab;
CURSOR c_data IS SELECT * FROM event;
BEGIN
OPEN c_data;
LOOP
FETCH c_data
BULK COLLECT INTO l_tab LIMIT 10000;
EXIT WHEN l_tab.count = 0;
FORALL i IN 1..l_tab.count
Insert into tmp_event values l_tab(i);
commit;
END LOOP;
CLOSE c_data;
END;
/
언급URL : https://stackoverflow.com/questions/13866915/oracle-insert-rowtype-data-into-another-table
'source' 카테고리의 다른 글
C의 함수 내부의 함수 (0) | 2023.10.17 |
---|---|
공백 문자를 모두 바꿉니다. (0) | 2023.10.17 |
세션이 만료되면 .Net MVC 부분 보기 로드 로그인 페이지 (0) | 2023.10.17 |
웹 소켓을 통해 데이터베이스에서 클라이언트로 실시간 데이터 업데이트/변경 (0) | 2023.10.12 |
mysqldump 명령을 실행하려고 하는 중 오류 1064(42000) (0) | 2023.10.12 |