SQL 쿼리에서 테이블의 열 이름을 동적으로 찾아
문제
나는 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 그리고 그것들을 사용하여 실행하십시오 즉시 실행하십시오.
제휴하지 않습니다 StackOverflow