有了这个,
set serveroutput on size 900000;
DECLARE
test VARCHAR(255):=0;
BEGIN
SELECT id INTO test FROM sku WHERE id = 1515;
dbms_output.put_line('Result:' || test);
END;
我有错误
"no data found"
当数据库中不存在ID时。
如何在此处使用nvl()
之类的内容,以便获取默认值而不是出错?
答案 0 :(得分:13)
如果合适,您可以替代更常见的NO_DATA_FOUND异常处理:
DECLARE
test VARCHAR(255):=0;
BEGIN
SELECT NVL(MAX(id),'default') INTO test FROM sku WHERE id = 1515;
dbms_output.put_line('Result:' || test);
END;
通过使用MAX(ID),您肯定会返回一行,当没有数据时将返回NULL;然后以通常的方式使用NVL。
答案 1 :(得分:12)
您可以捕获NO_DATA_FOUND异常
DECLARE
test VARCHAR(255):=0;
BEGIN
SELECT id INTO test FROM sku WHERE id = 1515;
dbms_output.put_line('Result:' || test);
EXCEPTION
WHEN NO_DATA_FOUND THEN
dbms_output.put_line ('sorry no data found :(' );
END;
有关PL / SQL错误处理的更多信息,请访问:http://download.oracle.com/docs/cd/B10501_01/appdev.920/a96624/07_errs.htm
据我所知,PL / SQL中的空行没有nvl()
这样的东西,NO_DATA_FOUND
异常可能是你得到的最接近的。
答案 2 :(得分:4)
这里不能使用NVL(或类似的NVL2或COALESCE),因为没有这些功能可以操作的数据。以下内容将按您的要求进行:
DECLARE
test VARCHAR2(255):=0;
BEGIN
BEGIN
SELECT id INTO test FROM sku WHERE id = 1515;
EXCEPTION
WHEN NO_DATA_FOUND THEN
test := '0';
END;
dbms_output.put_line('Result:' || test);
END;
但仅仅因为有可能并不意味着这是一个好主意。数据库正在尝试警告重要的事情(具体而言,没有符合您标准的数据),此代码忽略了该警告。
答案 3 :(得分:1)
根据您正在做的事情,您可以将查询移动到游标并从中获取:
DECLARE
test VARCHAR(255):=0;
CURSOR c_test IS
SELECT id
FROM sku
WHERE id = 1515
;
BEGIN
OPEN c_test;
FETCH c_test INTO test;
IF c_test%NOTFOUND THEN
dbms_output.put_line('no data found');
ELSE
dbms_output.put_line('result:' || test);
END IF;
CLOSE c_test;
END;