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
Post a Comment