动态sql-使用循环更新多行
我们有很多表,其中包含3个列(动态sql-使用循环更新多行,sql,oracle,sql-update,dynamic-sql,Sql,Oracle,Sql Update,Dynamic Sql,我们有很多表,其中包含3个列(RID,PARTNER,SUPPLIER)。我想更新theese cols,但仅在4个表中更新-取决于PK 所以我开始做一些事情,但我坚持: BEGIN FOR i IN (select table_name from all_tab_columns where column_name = 'RID' /*PK*/ and column_name = 'PARTNER' or column_name = 'SUPPLIER') LOOP EXEC
RID
,PARTNER
,SUPPLIER
)。我想更新theese cols,但仅在4个表中更新-取决于PK
所以我开始做一些事情,但我坚持:
BEGIN
FOR i IN
(select table_name from all_tab_columns where column_name = 'RID' /*PK*/
and column_name = 'PARTNER' or column_name = 'SUPPLIER')
LOOP
EXECUTE IMMEDIATE 'UPDATE ' || i.table_name|| 'set PARTNER = :newvalue where PARTNER = :oldavalue and RID = :ridvalue'
USING (newvalue, oldvalue, ridvalue)
END LOOP
END
问题:
合作伙伴
或供应商
,例如:在一个表中是合作伙伴
,在另一个表中是供应商
)合作伙伴
或供应商
),但仅在1个表中更新,具体取决于主键您需要在
FOR
循环中使用条件USING
子句和稍微不同的查询,如下所示:
BEGIN
FOR I IN (
SELECT TABLE_NAME
, PARTNER_COUNT
, SUPPLIER_COUNT
FROM (
SELECT TABLE_NAME
, SUM(CASE WHEN COLUMN_NAME = 'RID' THEN 1 ELSE 0 END) AS RID_COUNT
, SUM(CASE WHEN COLUMN_NAME = 'PARTNER' THEN 1 ELSE 0 END) AS PARTNER_COUNT
, SUM(CASE WHEN COLUMN_NAME = 'SUPPLIER' THEN 1 ELSE 0 END) AS SUPPLIER_COUNT
FROM ALL_TAB_COLUMNS
WHERE COLUMN_NAME = 'RID'
OR COLUMN_NAME = 'PARTNER'
OR COLUMN_NAME = 'SUPPLIER'
) WHERE RID_COUNT = 1 AND PARTNER_COUNT + SUPPLIER_COUNT = 1
) LOOP
EXECUTE IMMEDIATE 'UPDATE '
|| I.TABLE_NAME
|| 'set :col_name = :newvalue where :col_name = :oldavalue and RID = :ridvalue'
USING ( DECODE(PARTNER_COUNT,1,'PARTNER','SUPPLIER'),
NEWVALUE,
DECODE(PARTNER_COUNT,1,'PARTNER','SUPPLIER'),
OLDVALUE,
RIDVALUE );
END LOOP;
END;
/
正是我想要的。令人惊叹的。