pl / sql - 是否有空行的NVL()

时间:2010-10-08 15:04:36

标签: oracle plsql

有了这个,

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()之类的内容,以便获取默认值而不是出错?

4 个答案:

答案 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;