Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/oracle/9.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
动态sql-使用循环更新多行_Sql_Oracle_Sql Update_Dynamic Sql - Fatal编程技术网

动态sql-使用循环更新多行

动态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

我们有很多表,其中包含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
  EXECUTE IMMEDIATE 'UPDATE  ' || i.table_name|| 'set PARTNER = :newvalue where PARTNER = :oldavalue and RID = :ridvalue'
  USING (newvalue, oldvalue, ridvalue)
END LOOP 
END
问题:

  • 我不知道,如何用这种方法更新多个COL (因为在表中存在
    合作伙伴
    供应商
    ,例如:在一个表中是
    合作伙伴
    ,在另一个表中是
    供应商
  • 我只想更新(
    合作伙伴
    供应商
    ),但仅在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;
    /
    

    正是我想要的。令人惊叹的。