oracle - 为什么在这个过程中没有满足我的条件?
问题描述
所以我有一个存储过程(为了演示目的,它在下面被淡化了)没有通过任何条件,因此没有向我的表中插入/传递任何值。我尝试将 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;
解决方案
据我所知,您希望异常部分捕获查找表中没有任何内容的情况。在这种情况下,您设置 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;
推荐阅读
- xamarin - 通过 Xamarin for Android 中的 Web 链接处理深层链接
- linux - 获取每个ip地址的前3行/ifconfig接口命令Linux
- winbugs - WinBugs 中的“无效或意外令牌扫描”模型错误
- excel - 如何通过 VBA 自动引用“辅助功能(System32\oleacc.dll)”
- chatbot - 我们如何知道客户所说的是否符合意图?
- python - 在虚拟环境python 2.7中安装Tensorflow
- pimcore-v5 - 我们可以在 pimcore 5 中上下移动数据对象吗,默认情况下它是升序的?
- image - XPDL 到图像转换器
- php - 将 PHP 会话数据保存到 mysql db
- java - 如何多次运行 TestNG 套件