首页 > 解决方案 > 为什么在这个过程中没有满足我的条件?

问题描述

所以我有一个存储过程(为了演示目的,它在下面被淡化了)没有通过任何条件,因此没有向我的表中插入/传递任何值。我尝试将 Java 传入的 varchar/string 转换为数字,但没有任何效果。下面是我的“简化代码”

Create or Replace Procedure SAMPLE(rValue IN VARCHAR)
IS
v_Max value.value%type;
v_forecast value.value%type;
BEGIN
--
SELECT BUFFER_MAX_VALUE
 INTO v_MAX
 FROM look_up;
--
EXCEPTION 
WHEN no_data_found
THEN SELECT 0
    INTO v_forecast
    FROM DUAL;
--
 IF to_Number(rValue) < 0 OR to_Number(rValue) > v_MAX) 
 THEN 
 dbms_output.put_line('IF1 Works');
 insert into value(value_id, value)
           values(1, rValue);
ELSIF rValue is null OR to_Number(rValue) = 0
 THEN
dbms_output.put_line('IF1A ONLY Works');
 END IF;
ELSE
insert into value(value_id, value)
           values(1, v_forecast);
dbms_output.put_line('IF1 ELSE ONLY Works');
END SAMPLE;

我尝试传递以下内容:

BEGIN
SAMPLE('-7');
END;

标签: oracleplsql

解决方案


据我所知,您希望异常部分捕获查找表中没有任何内容的情况。在这种情况下,您设置 v_forecast 然后继续。这意味着您需要将选择放在自己的块中。

我还通过设置一个常量来避免多次 to_number 调用。

我从双重中摆脱了不必要的选择。

我也真的很希望你没有一个名为 VALUE 的表,其中有一个名为 VALUE 的列。选择更有意义的名称。

看看这对你有什么作用。

CREATE OR REPLACE PROCEDURE sample (rvalue IN VARCHAR2)
IS
   c_rvalue   CONSTANT NUMBER := rvalue;
   v_max               VALUE.VALUE%TYPE;
   v_forecast          VALUE.VALUE%TYPE;
BEGIN
   BEGIN
      SELECT buffer_max_value INTO v_max FROM look_up;
   EXCEPTION
      WHEN NO_DATA_FOUND
      THEN
         v_forecast := 0;
   END;

   IF c_rvalue < 0 OR c_rvalue > v_max
   THEN
      DBMS_OUTPUT.put_line ('IF1 Works');

      INSERT INTO VALUE (value_id, VALUE)
           VALUES (1, rvalue);
   ELSIF c_rvalue IS NULL OR c_rvalue = 0
   THEN
      DBMS_OUTPUT.put_line ('IF1A ONLY Works');
   ELSE
      INSERT INTO VALUE (value_id, VALUE)
           VALUES (1, v_forecast);

      DBMS_OUTPUT.put_line ('IF1 ELSE ONLY Works');
   END IF;
END sample;

推荐阅读