小编典典

在sql查询中动态查找表的列名

sql

我正在写SQL(对于Oracle),如下所示:

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

其中Schema1.tableA和Schema2.tableA具有相同的列。但是,这似乎是不安全的,因为在SELECT中返回的列的顺序是不确定的。我应该做的是:

插入Schema1.tableA(col1,col2,... colN) 
从Schema2.tableA中选择(col1,col2,... colN);

我正在使用一些脚本在很多表上执行此操作,因此我想编写以下内容:

插入Schema1.tableA(foo(Schema1.tableA)) 
从Schema2.tableA中选择(foo(Schema1.tableA));

foo是一些漂亮的魔术,它从表一中提取列名,并以适当的语法打包它们。有什么想法吗?


阅读 224

收藏
2021-05-16

共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;
/
2021-05-16