当表具有相同列时,从另一个表更新Dynamic Oracle

7hiiyaii  于 2023-08-03  发布在  Oracle
关注(0)|答案(2)|浏览(96)

我有两个表,第一个表是“tes_tmp”,第二个表是“tes_tmp1”。我想根据“tes_tmp”表更新“tes_tmp1”表。如果两个表之间存在匹配的列,则应更新“tes_tmp1”。
我已经尝试了以下查询:

MERGE INTO TES_TMP1 t1
USING (SELECT * FROM tes_tmp) t2
   ON (t1.objectid = t2.objectid)
 WHEN MATCHED THEN
       UPDATE SET t1.kecamatan = t2.kecamatan, T1.wilayah = T2.wilayah;

字符串
但是,在上面的查询中,需要显式声明每一列。我的问题是,是否有一种方法可以更新表,而不必先显式地声明列。

clj7thdc

clj7thdc1#

我的问题是,是否有一种方法可以更新表,而不必先显式地声明列。
不,我不知道
documented syntax for MERGE是:

合并::=

x1c 0d1x的数据
注意:必须至少指定merge_update_clausemerge_insert_clause子句之一。

merge_update_clause::=


merge_insert_clause::=



MERGE插入和更新子句中,没有定义使用通配符的语法;你必须显式地声明要合并的列。
如果你想构建一些动态SQL,那么你需要代码来:

  • 自动列出两个表中的列;
  • 计算哪些列需要更新;
  • 使用字符串连接动态构建SQL语句;和/或
  • 然后使用EXECUTE IMMEDIATE运行它。
epfja78i

epfja78i2#

谢谢你的帮助。现在,我可以执行更新,而无需事先声明列。

CREATE OR REPLACE PROCEDURE tes_update
IS
BEGIN
  FOR c IN (SELECT column_name
            FROM user_tab_columns
            WHERE table_name = 'TES_TMP'
              AND column_name IN (SELECT column_name FROM user_tab_columns WHERE table_name = 'TES_TMP1'))
  LOOP
    EXECUTE IMMEDIATE 'UPDATE tes_tmp1 t2
                       SET t2.' || c.column_name || ' = (SELECT t1.' || c.column_name || ' FROM tes_tmp t1 WHERE t1.objectid = t2.objectid AND ROWNUM = 1)
                       WHERE t2.objectid IN (SELECT objectid FROM tes_tmp t1 WHERE t1.' || c.column_name || ' IS NOT NULL)';
  END LOOP;

  COMMIT;
  DBMS_OUTPUT.PUT_LINE('Update successful!');
EXCEPTION
  WHEN OTHERS THEN
    ROLLBACK;
    DBMS_OUTPUT.PUT_LINE('Update failed: ' || SQLERRM);
END;

字符串

相关问题