动态 sql - 使用循环更新多行
Dynamic sql - update multiple rows with loop
我们有很多 table,其中包含 3 个列(RID
、PARTNER
、SUPPLIER
)。我想更新这些列,但只能在 4 table 秒内更新 - 取决于 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
问题:
- 我不知道,如何使用此方法更新多个列
(因为在 table 中存在
Partner
或 Supplier
,例如:在一个 table 中是 Partner
,在另一个 table 中是 Supplier
)
- 我只想更新(
Partner
或Supplier
)但只更新1个table,取决于PK
- 这是可行的解决方案吗?
您需要在 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;
/
我们有很多 table,其中包含 3 个列(RID
、PARTNER
、SUPPLIER
)。我想更新这些列,但只能在 4 table 秒内更新 - 取决于 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
问题:
- 我不知道,如何使用此方法更新多个列
(因为在 table 中存在
Partner
或Supplier
,例如:在一个 table 中是Partner
,在另一个 table 中是Supplier
) - 我只想更新(
Partner
或Supplier
)但只更新1个table,取决于PK - 这是可行的解决方案吗?
您需要在 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;
/