2016-03-09 2 views
0

У меня есть блок PL/SQL, который запрашивает из пустой таблицы. Мне было интересно, есть ли способ конвертировать пустой результат в 0? или, по крайней мере, нам функция ifnull для этого запроса?PLSQL Block, можно ли это сделать ifnull?

Вот код

declare 
p_entity_id varchar2(14) := 10100033904; 
date_format varchar2(10) := 'MM/DD/YYYY'; 
v_mapcount integer; 
v_compcount integer; 
v_qa_comp_date varchar2(12) := 'MM/DD/YYYY'; 


begin 

SELECT SUM(total),SUM(complete),TO_CHAR(MAX(compDate),date_format) INTO v_mapCount,v_CompCount,v_qa_comp_date FROM 
(
SELECT COUNT(barcode) as total, SUM(DECODE(qa_comp,NULL,0,1)) complete ,MAX(qa_comp) compDate from bbsp_boundary WHERE upper(cycle1) = 'Y' AND entity_id = p_entity_id AND DELETED_DATE IS NULL 
    UNION ALL 
SELECT COUNT(barcode) as total, SUM(DECODE(qa_comp,NULL,0,1)) complete ,MAX(qa_comp) compDate from bbsp_feature WHERE upper(cycle1) = 'Y' AND entity_id = p_entity_id AND DELETED_DATE IS NULL 
    UNION ALL 
SELECT COUNT(barcode) as total, SUM(DECODE(qa_comp,NULL,0,1)) complete ,MAX(qa_comp) compDate from bbsp_ADDRESS WHERE upper(cycle1) = 'Y' AND entity_id = p_entity_id AND DELETED_DATE IS NULL 
    UNION ALL 
SELECT COUNT(barcode) as total, SUM(DECODE(qa_comp,NULL,0,1)) complete ,MAX(qa_comp) compDate from bbsp_CORRECTION WHERE upper(cycle1) = 'Y' AND entity_id = p_entity_id AND DELETED_DATE IS NULL 
    UNION ALL 
SELECT COUNT(barcode) as total, SUM(DECODE(qa_comp,NULL,0,1)) complete ,MAX(qa_comp) compDate from bbsp_point_landmark WHERE upper(cycle1) = 'Y' AND entity_id = p_entity_id AND DELETED_DATE IS NULL 
    UNION ALL 
SELECT COUNT(barcode) as total, SUM(DECODE(qa_comp,NULL,0,1)) complete ,MAX(qa_comp) compDate from bbsp_area_landmark WHERE upper(cycle1) = 'Y' AND entity_id = p_entity_id AND DELETED_DATE IS NULL 
) ; 

end; 
+0

которые, в частности, вы говорите? – trincot

+1

Возможный дубликат [эквивалент оракула mysql ifnull (без случая, нет, если)] (http://stackoverflow.com/questions/31409990/oracle-equivalent-of-mysql-ifnull-no-case-no-if) – trincot

+0

если я могу NVL() это весь оператор, как бы я это сделал? –

ответ

0

Попробуйте nvl() функция

например: nvl(sum(total),0)

1

Если все ваши таблицы не пусто, то ни одна строка возвращается, следовательно, нет счетчика, чтобы вернуться , Вы можете сбросить эти переменные на ноль с if .. then ... end, или добавьте следующее право после select заявления:

v_mapcount  := COALESCE (v_mapcount, 0); 
    v_compcount  := COALESCE (v_compcount, 0); 
    v_qa_comp_date := COALESCE (v_qa_comp_date, 0); 

Coalesce возвращает первое значение, если оно не равно нулю, в противном случае она возвращает второе значение.