Ditt kodifiera är REKO, men jag skulle rekommenderar några ändringar: Det finns inte något behov av att göra detta: välj in i ERR_MSG från dubbel; Felet är i dessa variabler: SQLCODE och SQLERRM, så
UNDANTAG NÄR DUP_VAL_ON_INDEX DÄREFTER -- handtagdubblett antecknar fel
GrabErr (SCRT_NAME, SQLCODE||' ',||SQLERRM); ROLLBACK; -- Jag har tillfogat denna, därför att i ett tillvägagångssätt GrabErr det ought att finnas den AUTONOMA TRANSAKTIONEN
NÄR ANDRA DÄREFTER -- behandlar alla andra fel GrabErr (SCRT_NAME, SQLCODE||' ',||SQLERRM); ROLLBACK; AVSLUTA;
I den AUTONOMA TRANSAKTIONEN för tillvägagångssättGrabErr bruk. Du kan också definiera dina egna applikationfel. Är här mer om undantagsbruk: http://download.oracle.com/docs/cd/B19306_01/appdev.102/b14261/errors.htm#i7014
Om du önskar att veta fodra var felet uppstår därefter, tillfoga en variabele.g. n_debug:
FÖRKLARA SCRT_NAME VARCHAR2 (400): = ”InsRecOnMytable.sql”; n_debug PLS_INTEGER: =0;
BÖRJA n_debug: =1; Mellanlägg in i myschema.mytable (SCHEMA, KÄNT, ANMÄRKNINGEN, ORACLE_TYPE, FUNCTIONAL_TYPE, ÄGAREN, DETAIL_OWNER, IS_DYNAMIC, DISPLAY_NAME, ENTITY_NAME) värderar (”myschemaen”, ”mytable”, ”tar prov bordlägger 1”, ”BORDLÄGGER”, ”GRUNDLÄGGANDE”, ”PRODUKTEN”, ”PRODUKTEN”, 0, ”tar prov 1”, ogiltigt);
n_debug: =2;
Mellanlägg in i myschema.mytable (SCHEMA, KÄNT, ANMÄRKNINGEN, ORACLE_TYPE, FUNCTIONAL_TYPE, ÄGAREN, DETAIL_OWNER, IS_DYNAMIC, DISPLAY_NAME, ENTITY_NAME) värderar (”myschemaen”, ”mytable”, ”tar prov bordlägger 2”, ”BORDLÄGGER”, ”BASIC1”, ”PRODUCT1”, ”PRODUCT1”, 1, ”tar prov 2”, ogiltigt);
n_debug: =3; begå;
GrabErr (n_debug, SCRT_NAME, ”framgångar);
AVSLUTA OM;
UNDANTAG GrabErr (n_debug, SCRT_NAME, SQLCODE||' ',||SQLERRM); ROLLBACK;
NÄR ANDRA DÄREFTER -- behandlar alla andra fel GrabErr (n_debug, SCRT_NAME, SQLCODE||' ',||SQLERRM); ROLLBACK; AVSLUTA;
Jag gör den hitåt. Du kan också skapa ett tillvägagångssätt med matar in parametern SCRT_NAME, och i stället för skriva dig kan använda tillvägagångssättet.
Jag hoppas ska denna är lite en hjälp för dig.
|