转换Sql Server如果不存在,则转换为Oracle

时间:2014-10-16 08:52:11

标签: sql sql-server oracle

我有一个SQL Server程序片段,如下所示:

IF NOT EXISTS(SELECT ID FROM IDTABLE WHERE ID=@ID)
BEGIN
    DECLARE @MSG VARCHAR(100)
    SET @MSG = 'The ID (ID: ' + CONVERT(VARCHAR(50), @ID) + ') does not exist'
    EXEC SP_LOGAUDITMESSAGE 'Warning', 'Bill report', @MSG
    SET @RETVAL = 0
    RETURN
END

这会运行select查询,如果没有返回结果,则运行开始/结束块。它声明了一个消息变量,并在从方法返回之前将其与其他一些值一起发送到日志记录存储过程。

我现在正在开展项目,但我必须将所有这些内容转换为Oracle(我对此并不熟悉)。我通过Sql Developer中的临时编辑器运行它并获得了这个:

BEGIN
    SELECT 1
    INTO v_temp
    FROM DUAL
    WHERE NOT EXISTS
      ( SELECT ID FROM ID WHERE IDTABLE = v_ID
      );
  EXCEPTION
  WHEN OTHERS THEN
    NULL;
  END;
  IF v_temp = 1 THEN
    DECLARE
      v_MSG VARCHAR2(100);
    BEGIN
      v_MSG := 'The ID (ID: ' || UTILS.CONVERT_TO_VARCHAR2(v_ID,50) || ') does not exist' ;
      BEGIN
        SP_LOGAUDITMESSAGE('Warning', 'Bill report', v_MSG) ;
      EXCEPTION
      WHEN OTHERS THEN
        v_sys_error := SQLCODE;
      END;
      v_RETVAL := 0 ;
      RETURN;
    END;
  END IF;

现在,我得到它想要做的事情 - 它只是采取了一些步骤来做,将select语句的结果保存到v_temp然后如果设置为等于1 ,运行if块。

但是,我有一些疑问。首先,一些简单的谷歌搜索告诉我,第一个异常块(当其他人为空时)是可怕的做法。在这种情况下会有什么替代方案,或者在下面的if语句中是否可以接受?其次,是否需要整个重写,或者是否可以合并if和select语句(类似于上面的SQL)以使事情更简洁一些?

1 个答案:

答案 0 :(得分:1)

这样的事情:

DECLARE
  v_MSG   VARCHAR2(100);
  v_temp  integer;
BEGIN

  SELECT count(*)
    into v_temp
  FROM COF 
  WHERE ID = v_ID

  IF v_temp = 0 THEN
    v_MSG := 'The ID (ID: ' || to_char(v_id) || ') does not exist' ;
    SP_LOGAUDITMESSAGE('Warning', 'Bill report', v_MSG) ;
    v_RETVAL := 0;
  ELSE 
    v_RETVAL := 1; -- not sure about this though
  END IF;

RETURN;

EXCEPTION
   WHEN OTHERS THEN
      v_sys_error := SQLCODE;
   raise;
END;

变更:

  • 如果id存在的测试最好使用count(*)完成,因为如果id
  • ,则不会抛出异常
  • 不嵌套declare块。这令人困惑。
  • 我只会为整个过程使用一个异常处理程序