pl / sql - есть ли NVL () для пустых строк - PullRequest
3 голосов
/ 08 октября 2010

При этом,

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 ]

13 голосов
/ 08 октября 2010

Если подходит, вы можете сделать это как альтернативу более обычной обработке исключений 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 обычным способом.

12 голосов
/ 08 октября 2010

Вы можете поймать исключение 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, вероятно, самое близкое, которое вы получите.

4 голосов
/ 08 октября 2010

Вы не можете использовать 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;

, но только то, что что-то возможно, не означает, что это хорошая идея.База данных пытается предупредить о чем-то важном (в частности, об отсутствии данных, соответствующих вашим критериям), и этот код игнорирует это предупреждение.

1 голос
/ 08 октября 2010

В зависимости от того, что вы делаете, вы можете переместить запрос в курсор и извлечь из него:

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;
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...