oracle - Passing procedure arguments to SELECT INTO where clause not working -


i have compound trigger checks condition select into. if condition met, raise exception , values not inserted. using no_data_found exception, when fine, meaning condition raising custom exception isn't met , insert executed.

what bothers me when use constant in select clause no_data_found exception correctly. when use procedure argument same value constant, no_data_found exception isn't getting raised.

here's procedure inside trigger makes check:

procedure validate_system(     v_abgleich_id   in ctl_webadmin_abgleich.webadmin_abgleich_id%type,     v_valid_from    in ctl_webadmin_abgleich.gueltig_von%type,     v_valid_through in ctl_webadmin_abgleich.gueltig_bis%type,     v_source_system in ctl_webadmin_abgleich.cldb_quellsystem_id%type,     v_target_system in ctl_webadmin_abgleich.cldb_zielsystem_id%type,     v_table_id      in ctl_webadmin_abgleich.cldb_webadmin_table_id%type)   overlapping_abgleich exception;   src_target_same      exception;   from_date_null       exception;   from_date_gt         exception;   dummy                char(1);   v_ss number(10,0); begin   v_ss := 4;   dbms_output.put_line('v_ss' || v_ss);   if(validate_system.v_source_system = validate_system.v_target_system)     dbms_output.put_line('raising src_target_same.');     raise src_target_same;   end if;   if(validate_system.v_valid_from null)     dbms_output.put_line('raising from_date_null.');     raise from_date_null;   end if;   if(validate_system.v_valid_from > validate_system.v_valid_through)     dbms_output.put_line('raising from_date_gt.');     raise from_date_gt;   end if;        begin      select 'x'     dummy     ctl_webadmin_abgleich ab     ab.cldb_quellsystem_id = 4 , rownum = 1; -- constant raises no_data_found  -- ab.cldb_quellsystem_id = validate_system.v_source_system , rownum = 1; -- variable same value doesn't raise no_data_found exception.      dbms_output.put_line('conflicting recs foound: ' || v_ss);      exception     when no_data_found     dbms_output.put_line('no data found:' || validate_system.v_source_system);     null;   end;  exception when src_target_same   raise_application_error(-20001, 'quellsystem darf nicht gleich dem zielsystem sein!'); when from_date_null   raise_application_error(-20002, 'von datum darf nicht null sein!'); when from_date_gt   raise_application_error(-20003, 'von datum liegt vor datum bis!'); when overlapping_abgleich   raise_application_error(-20004, 'gültigkeitsbereiche mit schon existierenden einträgen kollidieren!'); end validate_system; 

in empty table, if pass constant clause of select no_data_found. when work variable -> validate_system.v_source_system, exception isn't raised.

what doing wrong? procedure called procedure, in turn called in after statement block of trigger.

the insert following:

insert ctl_webadmin_abgleich (webadmin_abgleich_id, gueltig_von, gueltig_bis, cldb_quellsystem_id, cldb_zielsystem_id, cldb_webadmin_table_id)  values (12, to_date('20.01.20', 'dd.mm.rr'), to_date('20.05.20', 'dd.mm.rr'), 4, 6, 813); 

and here's whole trigger:

create or replace  trigger abgleich_quellsystem_trg insert or   update on ctl_webadmin_abgleich compound trigger type abgleich_type record ( abgleich_id ctl_webadmin_abgleich.webadmin_abgleich_id%type, valid_from ctl_webadmin_abgleich.gueltig_von%type, valid_through ctl_webadmin_abgleich.gueltig_bis%type, source_system ctl_webadmin_abgleich.cldb_quellsystem_id%type, target_system ctl_webadmin_abgleich.cldb_zielsystem_id%type, table_id ctl_webadmin_abgleich.cldb_webadmin_table_id%type ); type abgleich_recs_type   table of abgleich_type index pls_integer;   abgleich_rec abgleich_recs_type; procedure lock_system(     v_abgleich_id   in ctl_webadmin_abgleich.webadmin_abgleich_id%type,     v_valid_from    in ctl_webadmin_abgleich.gueltig_von%type,     v_valid_through in ctl_webadmin_abgleich.gueltig_bis%type,     v_source_system in ctl_webadmin_abgleich.cldb_quellsystem_id%type,     v_target_system in ctl_webadmin_abgleich.cldb_zielsystem_id%type,     v_table_id      in ctl_webadmin_abgleich.cldb_webadmin_table_id%type)   abgleich_id ctl_webadmin_abgleich.webadmin_abgleich_id%type;   valid_from ctl_webadmin_abgleich.gueltig_von%type;   valid_through ctl_webadmin_abgleich.gueltig_bis%type;   source_system ctl_webadmin_abgleich.cldb_quellsystem_id%type;   target_system ctl_webadmin_abgleich.cldb_zielsystem_id%type;   table_id ctl_webadmin_abgleich.cldb_webadmin_table_id%type; begin   dbms_output.put_line('locking...' || lock_system.v_abgleich_id);   select ab.webadmin_abgleich_id,     ab.gueltig_von,     ab.gueltig_bis,     ab.cldb_quellsystem_id,     ab.cldb_zielsystem_id,     ab.cldb_webadmin_table_id   abgleich_id,     valid_from,     valid_through,     source_system,     target_system,     table_id   ctl_webadmin_abgleich ab   ab.webadmin_abgleich_id = lock_system.v_abgleich_id update; end lock_system;   procedure validate_system(     v_abgleich_id   in ctl_webadmin_abgleich.webadmin_abgleich_id%type,     v_valid_from    in ctl_webadmin_abgleich.gueltig_von%type,     v_valid_through in ctl_webadmin_abgleich.gueltig_bis%type,     v_source_system in ctl_webadmin_abgleich.cldb_quellsystem_id%type,     v_target_system in ctl_webadmin_abgleich.cldb_zielsystem_id%type,     v_table_id      in ctl_webadmin_abgleich.cldb_webadmin_table_id%type)   overlapping_abgleich exception;   src_target_same      exception;   from_date_null       exception;   from_date_gt         exception;   dummy                char(1); begin   if(validate_system.v_source_system = validate_system.v_target_system)     dbms_output.put_line('raising src_target_same.');     raise src_target_same;   end if;   if(validate_system.v_valid_from null)     dbms_output.put_line('raising from_date_null.');     raise from_date_null;   end if;   if(validate_system.v_valid_from > validate_system.v_valid_through)     dbms_output.put_line('raising from_date_gt.');     raise from_date_gt;   end if;        begin      select 'x'     dummy     ctl_webadmin_abgleich ab     ab.cldb_quellsystem_id = 5 , rownum = 1;      dbms_output.put_line('conflicting recs foound: ' || validate_system.v_source_system);      exception     when no_data_found     dbms_output.put_line('no data found:' || validate_system.v_source_system);     null;   end;  exception when src_target_same   raise_application_error(-20001, 'quellsystem darf nicht gleich dem zielsystem sein!'); when from_date_null   raise_application_error(-20002, 'von datum darf nicht null sein!'); when from_date_gt   raise_application_error(-20003, 'von datum liegt vor datum bis!'); when overlapping_abgleich   raise_application_error(-20004, 'gültigkeitsbereiche mit schon existierenden einträgen kollidieren!'); end validate_system;    procedure validate_systems   sys_idx pls_integer; begin   dbms_output.put_line('start validation...');   sys_idx := abgleich_rec.first;   loop     exit   when sys_idx null;     validate_system(abgleich_rec(sys_idx).abgleich_id, abgleich_rec(sys_idx).valid_from, abgleich_rec(sys_idx).valid_through, abgleich_rec(sys_idx).source_system, abgleich_rec(sys_idx).target_system, abgleich_rec(sys_idx).table_id);     sys_idx := abgleich_rec.next(sys_idx);   end loop; end validate_systems; before each row begin   abgleich_rec(:new.webadmin_abgleich_id).abgleich_id   := :new.webadmin_abgleich_id;   abgleich_rec(:new.webadmin_abgleich_id).valid_from    := :new.gueltig_von;   abgleich_rec(:new.webadmin_abgleich_id).valid_through := :new.gueltig_bis;   abgleich_rec(:new.webadmin_abgleich_id).source_system := :new.cldb_quellsystem_id;   abgleich_rec(:new.webadmin_abgleich_id).target_system := :new.cldb_zielsystem_id;   abgleich_rec(:new.webadmin_abgleich_id).table_id      := :new.cldb_webadmin_table_id; end before each row;  after statement begin   dbms_output.enable (buffer_size => null);   dbms_output.put_line('start validation...');   validate_systems;   dbms_output.put_line('validation successful.'); end after statement; end abgleich_quellsystem_trg; 

and ddl table:

-------------------------------------------------------- --  ddl table ctl_webadmin_abgleich --------------------------------------------------------    create table "cldbdef"."ctl_webadmin_abgleich"     (    "webadmin_abgleich_id" number(10,0),      "userid_ins" number(10,0),      "timestamp_ins" timestamp (6),      "timestamp_upd" timestamp (6),      "userid_upd" number(10,0),      "gueltig_von" date,      "gueltig_bis" date,      "cldb_quellsystem_id" number(10,0),      "cldb_webadmin_table_id" number(10,0),      "cldb_zielsystem_id" number(10,0)    ); -------------------------------------------------------- --  ddl index sys_c0027983 --------------------------------------------------------    create unique index "cldbdef"."sys_c0027983" on "cldbdef"."ctl_webadmin_abgleich" ("webadmin_abgleich_id") ; -------------------------------------------------------- --  constraints table ctl_webadmin_abgleich --------------------------------------------------------    alter table "cldbdef"."ctl_webadmin_abgleich" add primary key ("webadmin_abgleich_id");   alter table "cldbdef"."ctl_webadmin_abgleich" modify ("webadmin_abgleich_id" not null enable); 

thank help! al

update: ok, i've added

select count(*) recnr ctl_webadmin_abgleich ab; dbms_output.put_line('rec nr: ' || recnr); 

right after select into, , apparently insert executed , count(*) returns 1. how's possible? can explain this? thanks!

as boneist noticed record attempting insert present in table time checking conflicts. change select statement exclude record id of record inserting , should operate expected:

select 'x' dummy ctl_webadmin_abgleich ab ab.cldb_quellsystem_id = v_source_system  , ab.webadmin_abgleich_id != v_abgleich_id -- add condition , rownum = 1; 

Comments