source

Oracle: 행 유형 데이터를 다른 테이블에 삽입합니다.

manysource 2023. 10. 17. 20:21

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