문제

나는 SQL (Oracle의 경우)을 작성하고 있습니다.

INSERT INTO Schema1.tableA SELECT * FROM Schema2.tableA;

여기서 schema1.tablea 및 schema2.tablea에는 동일한 열이 있습니다. 그러나 SELECT에서 다시 오는 열의 순서가 정의되지 않기 때문에 이것은 안전하지 않은 것 같습니다. 내가해야 할 일은 다음과 같습니다.

INSERT INTO Schema1.tableA (col1, col2, ... colN) 
SELECT (col1, col2, ... colN) FROM Schema2.tableA;

일부 스크립트를 사용하여 많은 테이블을 위해이 작업을 수행하므로 원하는 것은 다음과 같은 글을 쓰는 것입니다.

INSERT INTO Schema1.tableA (foo(Schema1.tableA)) 
SELECT (foo(Schema1.tableA)) FROM Schema2.tableA;

여기서 Foo는 표 1에서 열 이름을 추출하고 적절한 구문으로 포장하는 멋진 마법입니다. 생각?

도움이 되었습니까?

해결책

이 PL/SQL은 다음을 수행해야합니다.

declare
    l_cols long;
    l_sql  long;
begin
    for r in (select column_name from all_tab_columns
              where  table_name = 'TABLEA'
              and    owner = 'SCHEMA1'
             )
    loop
       l_cols := l_cols || ',' || r.column_name;
    end loop;

    -- Remove leading comma
    l_cols := substr(l_cols, 2);

    l_sql := 'insert into schema1.tableA (' || l_cols || ') select ' 
             || l_cols || ' from schema2.tableA';

    execute immediate l_sql;

end;
/

다른 팁

동적으로 삽입 문을 구성해야 할 수도 있습니다. user_tab_columns 그리고 그것들을 사용하여 실행하십시오 즉시 실행하십시오.

라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top