想要MERGE很多表,所以想要构建通用程序来实现这一点

时间:2016-06-24 15:26:09

标签: oracle generics stored-procedures merge

我的术语将会松散,但重点将是明确的。我已经构建了一个使用Merge Statement合并数据的过程。现在我的表格列表正在增长,我认为我需要通用函数,所以我只需要传递源名称,目标和条件的表名称,并且可以实现合并。

这将使我的代码维护变得不那么复杂,否则我必须为每个表编写一个过程以使其易于维护但仍然不紧凑。

虽然由于专业原因,线性代码作为最终产品效率更高,但相关性较低。

这是我的一般代码。

SET DEFINE OFF;
PROMPT drop Procedure XXX_PROJECTS_MERGE;
DROP PROCEDURE CUSTOM.XXX_PROJECTS_MERGE;
PROMPT Procedure XXX_PROJECTS_MERGE;

/***************************************************************************************************
Prompt Procedure XXX_PROJECTS_MERGE;
--
-- XXX_PROJECTS_MERGE  (Procedure)
--
***************************************************************************************************/

CREATE OR REPLACE PROCEDURE CUSTOM.XXX_PROJECTS_MERGE (
   errbuf                   OUT VARCHAR2,
   retcode                  OUT NUMBER,
   x_Start_Period_Name   IN     VARCHAR2)
AS
   x_retcode   NUMBER := 0;
   x_errbuf    VARCHAR2 (200) := NULL;
BEGIN
   -- Update or insert non transactional tables ------------------------------

   -- Refreshing Key Project Table--------------------------------------------------------------------
   FND_FILE.PUT_LINE (FND_FILE.LOG, 'Starting Project Table Refresh Process');

   MERGE INTO CUSTOM.XXX_PROJECT GPRJ
        USING (SELECT ROWID,
                      PROJECT_ID,
                      set of columns
                 FROM PA.PA_PROJECTS_ALL
                WHERE     ORG_ID = 21
                      AND LAST_UPDATE_DATE >=
                             (SELECT MAX (LAST_UPDATE_DATE)
                                FROM CUSTOM.XXX_PROJECT)) OPRJ
           ON (GPRJ.PROJECT_ID = OPRJ.PROJECT_ID AND GPRJ.ROWID = OPRJ.ROWID)
   WHEN MATCHED
   THEN
      UPDATE SET
         GPRJ.NAME = OPRJ.NAME,
         Above set of columns in above update form
   WHEN NOT MATCHED
   THEN
      INSERT     (set of columns)
          VALUES (set of values as selected above);

   COMMIT;
   FND_FILE.PUT_LINE (
      FND_FILE.LOG,
         'Number of Rows Processed or Merged For XXX_PROJECT Table '
      || TO_CHAR (SQL%ROWCOUNT));
END;
/

SHOW ERRORS;

现在我想要上面的通用程序,我传递不同的输入集,可以运行任何表。

0 个答案:

没有答案