2010-07-06 10 views
1

J'ai le script sql ci-dessous. Lorsqu'il n'y a aucun enregistrement trouvé par la requête select, aucun enregistrement n'est inséré par l'instruction insert. Si aucun enregistrement trouvé par une requête de sélection je veux avoir un enregistrement inséré avec les nouveaux numéros de séquence et d'autres champs avec des valeurs nulles. comment puis-je le faire.sql query - insert

insert into testing.test_ref_details(SEQNUM, TEST_TYPE,TEST_REF_NO) 

select '&NEXT_SEQ_NO', '1',max(test_ref_no) as prev_test_ref1 
from testing.test_runs_status 
where test_type = 1 
and run_status = 1 
and test_end_dt = (select last_day(add_months(trunc(sysdate),-6))+2 from dual) 
group by test_end_dt 

;

Répondre

3
insert into testing.test_ref_details(SEQNUM, TEST_TYPE,TEST_REF_NO) 
WITH q AS (
select '&NEXT_SEQ_NO' a, '1' b,max(test_ref_no) as prev_test_ref1 
from testing.test_runs_status 
where test_type = 1 
and run_status = 1 
and test_end_dt = (select last_day(add_months(trunc(sysdate),-6))+2 from dual) 
group by test_end_dt 
) 
SELECT a, b, prev_test_ref1 FROM q 
UNION ALL 
SELECT '&NEXT_SEQ_NO', NULL, NULL FROM DUAL 
WHERE NOT EXISTS (SELECT NULL FROM q); 
+1

est à l'aide "AVEC" a des contraintes telles que les versions d'oracle? La version utilisée est oracle10g – Arav

+1

'WITH' fonctionne en 10g, par exemple:' create table t (a number); insérer dans t avec q AS (sélectionner 1 a de dual) SELECT a de q; ' –

+1

@Arav - La clause WITH (aka affacturage de sous-requête, expressions de table commune) a été introduite dans Oracle 9i – APC

2

Une solution PL/SQL:

begin 
    insert into testing.test_ref_details(SEQNUM, TEST_TYPE,TEST_REF_NO) 
    select '&NEXT_SEQ_NO', '1',max(test_ref_no) as prev_test_ref1 
    from testing.test_runs_status 
    where test_type = 1 
    and run_status = 1 
    and test_end_dt = (select last_day(add_months(trunc(sysdate),-6))+2 from dual) 
    group by test_end_dt; 

    if sql%rowcount = 0 then 
    insert into testing.test_ref_details(SEQNUM) 
    values ('&NEXT_SEQ_NO'); 
    end if; 
end;