CREATE OR REPLACE PACKAGE mip_friendly_messages IS -- Author : HARDYA -- Created : 19/02/2008 09:45:09 -- Purpose : /** Attempt to produce a user friendly message for an Oracle message %param p_ora_msg the message to be processed %return either a friendly message or p_ora_msg */ FUNCTION get_friendly_message(p_ora_msg IN VARCHAR2) RETURN VARCHAR2; END mip_friendly_messages; / CREATE OR REPLACE PACKAGE BODY mip_friendly_messages IS PROCEDURE pl(p_in VARCHAR2) IS l_fh utl_file.file_type; BEGIN dbms_application_info.set_module('MIP_FRIENDLY_MESSAGES' ,p_in); l_fh := utl_file.fopen(location => 'WEBMIP_BULK_LOAD' ,filename => 'MIP_FRIENDLY_MESSAGES.txt' ,open_mode => 'A'); utl_file.put_line(l_fh ,to_char(SYSDATE ,'DD/MM/YYYY HH24:MI:SS') || ',' || p_in); utl_file.fclose(l_fh); END pl; FUNCTION get_constraint_message(p_ora_msg IN VARCHAR2) RETURN VARCHAR2 IS c_marker CONSTANT VARCHAR2(30) := 'constraint ('; c_marker_length CONSTANT NUMBER := length(c_marker); l_msg constraint_messages.msg%TYPE; l_constraint VARCHAR2(30); l_constraint_name VARCHAR2(30); l_start_posn NUMBER; l_end_posn NUMBER; BEGIN -- get the complete constraint "user.constraint_name" l_start_posn := instr(p_ora_msg ,c_marker) + c_marker_length; l_end_posn := instr(p_ora_msg ,')' ,l_start_posn) - 1; l_constraint := substr(p_ora_msg ,l_start_posn ,l_end_posn - l_start_posn + 1); -- get the "constraint_name" l_start_posn := instr(l_constraint ,'.') + 1; l_constraint_name := substr(l_constraint ,l_start_posn); BEGIN SELECT msg INTO l_msg FROM constraint_messages WHERE constraint_name = l_constraint_name; EXCEPTION WHEN no_data_found THEN l_msg := NULL; END; IF l_msg IS NULL AND l_constraint_name LIKE 'SYS!_C%' ESCAPE '!' OR l_constraint_name LIKE 'AVCON!_%' ESCAPE '!' THEN -- this is a system generated check constraint and should not be appearing l_msg := 'Application error. Attempting to violate check constraint ' || l_constraint_name || '. Please report this error to Advantica.'; END IF; RETURN l_msg; END get_constraint_message; FUNCTION get_friendly_message(p_ora_msg IN VARCHAR2) RETURN VARCHAR2 IS l_ora_msg VARCHAR2(240) := p_ora_msg; l_sqlcode NUMBER; l_msg VARCHAR2(2000); BEGIN l_sqlcode := substr(l_ora_msg ,1 ,5); IF instr(l_ora_msg ,'constraint (') > 0 THEN l_msg := nvl(get_constraint_message(l_ora_msg) ,l_ora_msg); ELSE l_msg := l_ora_msg; END IF; return(l_msg); END get_friendly_message; END mip_friendly_messages; /