Exception object

An Exception object you can pass around between procedures. It was a bit of an experiment and I haven't found a real use for it yet, but maybe that's just because I've been working on warehouse systems for a while. Let me know if you find a use for it!

  1. -- EXCEPTION object type
  2. -- William Robertson 2003, www.williamrobertson.net
  3.  
  4. create or replace type exception_ot as object
  5. ( message varchar2(32767)
  6. , error_code integer
  7. , module varchar2(30)
  8. , action varchar2(100)
  9. , os_logdir varchar2(80)
  10. , os_logfile varchar2(70)
  11. , raised timestamp
  12. , member procedure include_text
  13. ( p_word1 varchar2 default null
  14. , p_word2 varchar2 default null
  15. , p_word3 varchar2 default null )
  16. , member procedure log
  17. ( p_log_to_database_yn varchar2 default 'Y'
  18. , p_log_to_file_yn varchar2 default 'N'
  19. , p_send_mail_yn varchar2 default 'N' )
  20. , member procedure raise
  21. ( p_log_to_database_yn varchar2 default 'N'
  22. , p_log_to_file_yn varchar2 default 'N'
  23. , p_send_mail_yn varchar2 default 'N' )
  24. , constructor function exception_ot
  25. ( p_message varchar2
  26. , p_error_code integer default -20000
  27. , p_module varchar2 default null
  28. , p_action varchar2 default null
  29. , p_logdir varchar2 default null
  30. , p_logfile varchar2 default null )
  31. return self as result
  32. , member procedure print )
  33. /
  34.  
  35. show errors
  36.  
  37. create or replace type body exception_ot
  38. as
  39. member procedure include_text
  40. ( p_word1 varchar2 default null
  41. , p_word2 varchar2 default null
  42. , p_word3 varchar2 default null )
  43. is
  44. begin
  45. message := replace(replace(replace(message,'[1]',p_word1),'[2]',p_word2),'[3]',p_word3);
  46. end;
  47.  
  48.  
  49. member procedure log
  50. ( p_log_to_database_yn varchar2 default 'Y'
  51. , p_log_to_file_yn varchar2 default 'N'
  52. , p_send_mail_yn varchar2 default 'N' )
  53. is
  54. begin
  55. if upper(substr(p_log_to_database_yn,1,1)) = 'Y' then
  56. logger.write(message, module, action);
  57. end if;
  58.  
  59. if upper(substr(p_log_to_file_yn,1,1)) = 'Y' then
  60. logger.write(message, module, action);
  61. end if;
  62.  
  63. if upper(substr(p_send_mail_yn,1,1)) = 'Y' then
  64. logger.write(message, module, action);
  65. end if;
  66. end;
  67.  
  68.  
  69. member procedure raise
  70. ( p_log_to_database_yn varchar2 default 'N'
  71. , p_log_to_file_yn varchar2 default 'N'
  72. , p_send_mail_yn varchar2 default 'N' )
  73. is
  74. begin
  75. raise_application_error
  76. ( nvl(error_code,-20000)
  77. , message
  78. , true );
  79. end;
  80.  
  81.  
  82. constructor function exception_ot
  83. ( p_message varchar2
  84. , p_error_code integer default -20000
  85. , p_module varchar2 default null
  86. , p_action varchar2 default null
  87. , p_logdir varchar2 default null
  88. , p_logfile varchar2 default null )
  89. return self as result
  90. is
  91. v_module varchar2(30);
  92. v_action varchar2(100);
  93. v_dummy pls_integer;
  94. begin
  95. message := p_message;
  96. error_code := nvl(p_error_code,-20000);
  97.  
  98. if p_logdir is not null then
  99. begin
  100. select directory_name into os_logdir
  101. from all_directories
  102. where p_logdir in (directory_name, directory_path)
  103. order by
  104. decode(p_logdir, directory_name, 1,2);
  105.  
  106. begin
  107. select 1 into v_dummy
  108. from user_tab_privs_recd
  109. where table_name = self.os_logdir
  110. and privilege = 'WRITE';
  111. exception
  112. when no_data_found then
  113. raise_application_error
  114. ( -20999
  115. , 'user ' || user || ' lacks write permission to directory "' || p_logdir || '".' );
  116. end;
  117. exception
  118. when no_data_found then
  119. raise_application_error
  120. ( -20999
  121. , 'No such directory "' || p_logdir ||
  122. '" defined in database.' );
  123. end;
  124. end if;
  125.  
  126. os_logfile := p_logfile;
  127.  
  128. raised := systimestamp;
  129.  
  130. if p_module is null
  131. or p_action is null
  132. then
  133. dbms_application_info.read_module(v_module, v_action);
  134. module := nvl(p_module,v_module);
  135. action := coalesce(p_action,v_action,'Unknown');
  136. end if;
  137. return;
  138. end;
  139.  
  140.  
  141. member procedure print
  142. is
  143. begin
  144. echo(error_code || ': ' || message);
  145. end;
  146. end;
  147. /
  148.  
  149. show errors
  150.  
  151. create or replace package error
  152. as
  153. e_general constant exception_ot := exception_ot('An error occurred', -20001);
  154. e_no_such constant exception_ot := exception_ot('No such [1]', -20002);
  155. e_job constant exception_ot := exception_ot('Job submit error', -20003);
  156. end error;
  157. /
  158.  
  159. prompt demo exception_ot:
  160.  
  161. create or replace procedure test_exception
  162. ( p_test varchar2 )
  163. as
  164. e_no_such_thing exception_ot := error.e_no_such;
  165. v_dummy varchar2(1);
  166. begin
  167. select dummy into v_dummy from dual where dummy = p_test;
  168. exception
  169. when no_data_found then
  170. -- e_no_such_thing.message := sqlerrm;
  171. e_no_such_thing.include_text('dummy "' || p_test || '"');
  172. e_no_such_thing.print();
  173. e_no_such_thing.raise();
  174. end;
  175. /
  176.  
  177. PROMPT Success:
  178. exec test_exception('X')
  179.  
  180. PROMPT Failure:
  181. exec test_exception('Y')
  182.