ORACLE FUNCTION中的IF语句

时间:2014-10-10 03:02:18

标签: sql oracle

我有一个关于比较两个表的问题,更新它的值并增加rev no value。

首先,我的表结构就像这样

主绘图表, HEAD_MARK重量表面

虚拟大师绘图表, HEAD_MARK_DUM WEIGHT_DUM SURFACE DUM

我有一个函数来将dummy_master_drawing和master_drawing的值同步

CREATE OR REPLACE FUNCTION WELTESADMIN.DUM_MST_SYNC(PROJNAME IN VARCHAR2)
    RETURN NUMBER IS NUM_ROWS NUMBER;
    PRAGMA AUTONOMOUS_TRANSACTION;
  BEGIN
    MERGE INTO MASTER_DRAWING DST USING
    (SELECT WEIGHT_DUM, SURFACE_DUM, HEAD_MARK_DUM, PROJECT_NAME_DUM FROM DUMMY_MASTER_DRAWING) SRC 
        ON (DST.HEAD_MARK = SRC.HEAD_MARK_DUM)
  WHEN MATCHED THEN
    UPDATE SET DST.WEIGHT  = SRC.WEIGHT_DUM,
               DST.SURFACE = SRC.SURFACE_DUM
    WHERE DST.PROJECT_NAME = SRC.PROJECT_NAME_DUM
    AND DST.PROJECT_NAME   = PROJNAME;
    NUM_ROWS              := SQL%ROWCOUNT;

    COMMIT;
    RETURN NUM_ROWS;
  END;

我有第二个SQL来比较不同的数据值,

Select A.HEAD_MARK, A.WEIGHT MDWEIGHT, B.WEIGHT_DUM DUMWEIGHT, 
       A.SURFACE SURFACE, B.SURFACE_DUM 
From MASTER_DRAWING A, DUMMY_MASTER_DRAWING B
    Where A.HEAD_MARK = B.HEAD_MARK_DUM AND A.WEIGHT != B.WEIGHT_DUM AND A.SURFACE != B.SURFACE_DUM
    AND A.PROJECT_NAME = B.PROJECT_NAME_DUM AND A.PROJECT_NAME = PROJNAME

问题是我不知道如何将这2个查询集成到单个函数中。在WELTESADMIN.DUM_MST_SYNC函数中使用IF语句或将第二个放在函数中并将这两个函数放在一个过程中是否更好?

或者让它们成为一个程序并在函数内执行它们两个?

请帮帮我, 我刚刚开始学习oracle,我想在这些方面做得很好。

提前致谢

1 个答案:

答案 0 :(得分:0)

不,您不应该将第二个SQL放在函数或过程中。不要将PL / SQL用于这种简单的任务。由于PL / SQL有上下文切换的开销,SQL总是会更快。

话虽如此,您的第二个查询可以是MERGE语句本身的一部分。这只是一个WHEN NOT MATCHED条件。你想用不匹配的行做什么?我相信,这个问题是你昨天的问题的延伸。

在高级别,您的要求是:

  1. 在源表和目标表之间查找匹配的数据集,并更新目标表。
  2. 在两个表之间找到无与伦比的数据集,您需要对此做些什么。您可能希望从目标表中insertdelete这些行。这只不过是在同一个合并声明中添加插入/删除。