我有一个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)以使事情更简洁一些?
答案 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;
变更:
count(*)
完成,因为如果id declare
块。这令人困惑。