Desktop
Website
Multimedia
Database
Security
Enterprise
Fråga : Bruk av undantag och gripa Oracle felmeddelanden
Hi grabbar,
Given en nedanför skriva:
ScriptName: InsRecOnMytable.sql
--------------------------
------
ERR_MSG VARCHAR2 (4000) för
DECLARE;
SCRT_NAME VARCHAR2 (400): = ”InsRecOnMytable.sql”; mellanlägget för
BEGIN
in i
för myschema.mytable (SCHEMA, KÄNT, ANMÄRKNINGEN, ORACLE
_TYPE, FUNC
TIONAL_TYP
E, ÄGAREN, DE
TAIL_OWNER
, IS_DYNAMI
C, DISPLAY_
NAME, ENTIT
Y_NAME) värderar (”myschemaen”, ”mytable”, ”tar prov bordlägger 1”, ”BORDLÄGGER”, ”GRUNDLÄGGANDE”, ”PRODUC
T”, ”PRODUC
T”, 0, ”Samp
le 1” som, är ogiltig); mellanlägget för
in i
för myschema.mytable (SCHEMA, KÄNT, ANMÄRKNINGEN, ORACLE
_TYPE, FUNC
TIONAL_TYP
E, ÄGAREN, DE
TAIL_OWNER
, IS_DYNAMI
C, DISPLAY_
NAME, ENTIT
Y_NAME) värderar (”myschemaen”, ”mytable”, ”tar prov bordlägger 2”, ”BORDLÄGGER”, ”BASIC1”, ”PRODU
CT1”, ”PROD
UCT1”, 1, ”S
ample 2” som, är ogiltig);
begår;
GrabErr (SCRT_NAME, ”framgångar) för
;
END OM;
EXCEPTION
NÄR DUP_VAL_ON_INDEX DÄREFTER -- handtagdubblettrekord
som för error
väljer msg
en in i ERR_MSG från dubbel;
GrabErr (SCRT_NAME, ERR_MSG); -- ett tillvägagångssätt som tar ERR_MSGEN som
för parameter
NÄR ANDRA DÄREFTER -- behandlar alla andra msg
för errors
valda resulterade från dubblettmellanläggsabove>en in i ERR_MSG från dubbel;
GrabErr (SCRT_NAME, ERR_MSG); -- ett tillvägagångssätt som tar ERR_MSGEN som ROLLBACK för
för parameter
;
END; behov a för
/
I precis långt att vara kompetent att passera eller lagra using en variabel det faktiska ORACLE felmeddelandet resulterade från dubblettrekord över, och huvudsakligen, fodra numrerar var felet uppstod för feltestning purposes.
the skrivar är över en idé endast. Känselförnimmelsen frigör för att föreslå, att allt vad är den bäst lösningen via PL/SQL.
Using, LOGGA sparar ska arbete, men idén här är att GrabErr tillvägagångssättet ska uppdateringen som några kolonner på innehålla för bordlägganågot att säga SCRIPTINFO specificerar för varje skrivar utförande. Om det finns a långt som skapar LOGGA, spara och var samtidigt den kompetent stillbilden som uppdaterar SCRIPTINFO, bordlägger, då så mycket något liknande för better.
Something detta:
--------------------
SCRIPTINFO TABLE
----------------DET KÄNDA EXEC_STATUS REMARKS
==========================
==========
==========
==========
==========
=========
1 InsRecOnMytable.sql MISSADE
ID felar msg.>
2 MyScriptInsert.sql REKO Success
==========================
==========
==========
==========
==========
=========
Can något något liknande som detta göras?
Thanks i förskott,
jrmn
" klar "
Svar : Bruk av undantag och gripa Oracle felmeddelanden
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.
Andra lösningar
Hur många skrivar av sidor r där i SQL-server?
OMA och OWA
Missa över mellan GLÅMIGA anslutningar för aktiv/för aktiv på en Cisco Router
ASP.Net tappar skuggar verkställer
Vad är ämna av ”den MAKEFILE” makroen i en makefile?
Ett rengöringsdukundantag uppstod därför att en HTTP 401 - det obehöriga svaret mottogs från okända
Funktionen måste använda en Updateable Query
PHP passerar parametrar till den on-line aktiveringssidan
Ethernetövergångskabel förbinder
döda ett processaa vid styrka, hur kan jag