回答

收藏

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

技术问答 技术问答 45 人阅读 | 0 人回复 | 2023-09-13

我正在写SQL(对于Oracle),如下所示:  y  x) m9 H) t' h9 V
将INSERT INTO Schema1.tableA SELECT * FROM Schema2.tableA;9 I- P' Z# ]$ T) D6 s2 M5 u6 z
其中Schema1.tableA和Schema2.tableA具有相同的列。但是,这似乎是不安全的,因为在SELECT中返回的列的顺序是不确定的。我应该做的是:+ m3 W3 B( c+ w, b+ r% A
插入Schema1.tableA(col1,col2,... colN)
# F) u; P/ D3 I" r% Z& [% _从Schema2.tableA中选择(col1,col2,... colN);
% E6 e' O5 ]+ P6 r: L0 e我正在使用一些脚本在很多表上执行此操作,因此我想编写以下内容:
1 K3 u! R" E) B" C; C) W插入Schema1.tableA(foo(Schema1.tableA)) . Q1 c" q, l+ `$ K' o3 \
从Schema2.tableA中选择(foo(Schema1.tableA));
9 K6 w+ B# n: F% A7 gfoo是一些漂亮的魔术,它从表一中提取列名,并以适当的语法打包它们。有什么想法吗?
) [- I8 f# }6 T8 A6 H+ z* |( i* x               
# b% ^* C7 |! E解决方案:
+ h& z1 y& |( ?7 K1 }: t, ]                6 W' K" Y$ `5 K# I5 R6 z  j: V
0 \! Y' \1 o+ G& O
+ r& H# l: [: i+ b! F! a2 w
                此PL / SQL应该做到这一点:8 a* Y$ R. L/ q: D
declare, X+ l* {! M- i- m! A
    l_cols long;4 C8 R5 k! ]! |; j* F- ?. N
    l_sql  long;$ _+ `4 j6 ~1 m. [$ e. r7 x
begin9 U/ l3 C. d5 ~7 M3 g* R2 O
    for r in (select column_name from all_tab_columns( B  h, R) f" X6 z7 C$ |
              where  table_name = 'TABLEA'
0 g& X% n* l" _; E8 w              and    owner = 'SCHEMA1'; b5 w+ i1 I: o2 v8 j9 c
             ). p5 k' U2 N- o
    loop
8 P5 c, A* r& m2 Y       l_cols := l_cols || ',' || r.column_name;( |* w; m4 ]1 j! }  K
    end loop;/ s. Y; w5 X9 h3 y! {$ x1 H
    -- Remove leading comma1 h; X# F* Z$ W7 X
    l_cols := substr(l_cols, 2);  [  _6 V: N' _) @, v
    l_sql := 'insert into schema1.tableA (' || l_cols || ') select ' : L* U/ C* w( n" ]
             || l_cols || ' from schema2.tableA';
8 Q5 s7 I) O0 U3 l- d) \    execute immediate l_sql;
$ X; f* O. o' L* H2 |end;% k# v+ a$ M1 ^. ^' O% Q; S
/
分享到:
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则