简体   繁体   English

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

[英]Dynamically look up column names for a table while in an sql query

I'm writing SQL (for Oracle) like: 我正在写SQL(对于Oracle),如下所示:

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

where Schema1.tableA and Schema2.tableA have the same columns. 其中Schema1.tableA和Schema2.tableA具有相同的列。 However, it seems like this is unsafe, since the order of the columns coming back in the SELECT is undefined. 但是,这似乎是不安全的,因为在SELECT中返回的列的顺序是不确定的。 What I should be doing is: 我应该做的是:

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

I'm doing this for lots of tables using some scripts, so what I'd like to do is write something like: 我正在使用一些脚本在许多表上执行此操作,因此我想编写以下内容:

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

Where foo is some nifty magic that extracts the column names from table one and packages them in the appropriate syntax. foo是一些漂亮的魔术,它可以从表一中提取列名,并以适当的语法打包它们。 Thoughts? 有什么想法吗?

This PL/SQL should do it: 此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动态构造插入语句,并使用EXECUTE IMMEDIATE执行它们。

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM