Guest User

Untitled

a guest
Dec 18th, 2017
56
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 5.91 KB | None | 0 0
  1. CREATE OR REPLACE PACKAGE tmr
  2. IS
  3. PROCEDURE start_timer;
  4.  
  5. PROCEDURE show_elapsed (str IN VARCHAR2);
  6. END tmr;
  7. /
  8.  
  9. CREATE OR REPLACE PACKAGE BODY tmr
  10. IS
  11. last_timing NUMBER := NULL;
  12.  
  13. PROCEDURE start_timer
  14. IS
  15. BEGIN
  16. last_timing := DBMS_UTILITY.get_time;
  17. END;
  18.  
  19. PROCEDURE show_elapsed (str IN VARCHAR2)
  20. IS
  21. BEGIN
  22. DBMS_OUTPUT.put_line (
  23. str
  24. || ': '
  25. || MOD (DBMS_UTILITY.get_time - last_timing + POWER (2, 32),
  26. POWER (2, 32)));
  27. start_timer;
  28. END;
  29. END tmr;
  30. /
  31.  
  32. CREATE TABLE not_much_stuff (n NUMBER)
  33. ;
  34.  
  35. INSERT INTO not_much_stuff
  36. SELECT LEVEL
  37. FROM DUAL
  38. CONNECT BY LEVEL < 11
  39. ;
  40.  
  41. -- Demonstration of Exception Behavior with SELECT-INTO
  42. DECLARE
  43. my_n not_much_stuff.n%TYPE;
  44. BEGIN
  45. DBMS_OUTPUT.put_line ('No rows found:');
  46.  
  47. BEGIN
  48. SELECT n
  49. INTO my_n
  50. FROM not_much_stuff
  51. WHERE n = -1;
  52. EXCEPTION
  53. WHEN NO_DATA_FOUND
  54. THEN
  55. DBMS_OUTPUT.put_line (DBMS_UTILITY.format_error_stack);
  56. END;
  57.  
  58. DBMS_OUTPUT.put_line ('Too many rows found:');
  59.  
  60. BEGIN
  61. SELECT n
  62. INTO my_n
  63. FROM not_much_stuff
  64. WHERE n BETWEEN 1 AND 10;
  65. EXCEPTION
  66. WHEN TOO_MANY_ROWS
  67. THEN
  68. DBMS_OUTPUT.put_line (DBMS_UTILITY.format_error_stack);
  69. END;
  70. END;
  71. /
  72.  
  73. DECLARE
  74. my_n not_much_stuff.n%TYPE;
  75. BEGIN
  76. tmr.start_timer;
  77. FOR indx IN 1 .. 10000
  78. LOOP
  79. BEGIN
  80. SELECT n
  81. INTO my_n
  82. FROM not_much_stuff
  83. WHERE n = -1;
  84.  
  85. my_n := 100;
  86. EXCEPTION
  87. WHEN NO_DATA_FOUND
  88. THEN
  89. my_n := 100;
  90. END;
  91. END LOOP;
  92.  
  93. DBMS_OUTPUT.put_line (my_n);
  94.  
  95. tmr.show_elapsed ('Implicit Failure');
  96. END;
  97.  
  98. /
  99.  
  100. DECLARE
  101. my_n not_much_stuff.n%TYPE;
  102. BEGIN
  103. tmr.start_timer;
  104.  
  105. FOR indx IN 1 .. 10000
  106. LOOP
  107. BEGIN
  108. SELECT n
  109. INTO my_n
  110. FROM not_much_stuff
  111. WHERE n = 1;
  112.  
  113. my_n := 100;
  114. EXCEPTION
  115. WHEN NO_DATA_FOUND
  116. THEN
  117. my_n := 100;
  118. END;
  119. END LOOP;
  120.  
  121. DBMS_OUTPUT.put_line (my_n);
  122.  
  123. tmr.show_elapsed ('Implicit Success');
  124. END;
  125. /
  126.  
  127. DECLARE
  128. my_n not_much_stuff.n%TYPE;
  129.  
  130. CURSOR stuff_cur
  131. IS
  132. SELECT n
  133. FROM not_much_stuff
  134. WHERE n = -1;
  135. BEGIN
  136. tmr.start_timer;
  137.  
  138. FOR indx IN 1 .. 10000
  139. LOOP
  140. OPEN stuff_cur;
  141.  
  142. FETCH stuff_cur INTO my_n;
  143.  
  144. IF stuff_cur%NOTFOUND
  145. THEN
  146. my_n := 100;
  147. END IF;
  148.  
  149. CLOSE stuff_cur;
  150. END LOOP;
  151.  
  152. DBMS_OUTPUT.put_line (my_n);
  153.  
  154. tmr.show_elapsed ('Explicit Failure');
  155. END;
  156. /
  157.  
  158. DECLARE
  159. my_n not_much_stuff.n%TYPE;
  160.  
  161. CURSOR stuff_cur
  162. IS
  163. SELECT n
  164. FROM not_much_stuff
  165. WHERE n = 1;
  166. BEGIN
  167. tmr.start_timer;
  168.  
  169. FOR indx IN 1 .. 10000
  170. LOOP
  171. OPEN stuff_cur;
  172.  
  173. FETCH stuff_cur INTO my_n;
  174.  
  175. IF stuff_cur%FOUND
  176. THEN
  177. my_n := 100;
  178. END IF;
  179.  
  180. CLOSE stuff_cur;
  181. END LOOP;
  182.  
  183. DBMS_OUTPUT.put_line (my_n);
  184.  
  185. tmr.show_elapsed ('Explicit Success');
  186. END;
  187. /
  188.  
  189. -- 1. Implicit cursor inside a nested block
  190. CREATE OR REPLACE PROCEDURE do_stuff_with_employee (
  191. employee_id_in IN hr.employees.employee_id%TYPE)
  192. IS
  193. l_name hr.employees.last_name%TYPE;
  194. BEGIN
  195. BEGIN
  196. SELECT last_name
  197. INTO l_name
  198. FROM hr.employees e
  199. WHERE e.employee_id = do_stuff_with_employee.employee_id_in;
  200. EXCEPTION
  201. WHEN NO_DATA_FOUND
  202. THEN
  203. /* log the error if this really is an error or let it go... */
  204. l_name := NULL;
  205. END;
  206.  
  207. IF l_name IS NOT NULL
  208. THEN
  209. /* continue with application logic */
  210. NULL;
  211. END IF;
  212. END;
  213. /
  214.  
  215. -- 2. Implicit cursor inside a nested subprogram
  216. CREATE OR REPLACE PROCEDURE do_stuff_with_employee (
  217. employee_id_in IN hr.employees.employee_id%TYPE)
  218. IS
  219. l_name hr.employees.last_name%TYPE;
  220.  
  221. FUNCTION emp_name (employee_id_in IN hr.employees.employee_id%TYPE)
  222. RETURN hr.employees.last_name%TYPE
  223. IS
  224. l_name hr.employees.last_name%TYPE;
  225. BEGIN
  226. SELECT last_name
  227. INTO l_name
  228. FROM hr.employees
  229. WHERE employee_id = employee_id_in;
  230.  
  231. RETURN l_name;
  232. EXCEPTION
  233. WHEN NO_DATA_FOUND
  234. THEN
  235. /* log the error if this really is an error or let it go... */
  236. RETURN NULL;
  237. END;
  238. BEGIN
  239. l_name := emp_name (employee_id_in);
  240.  
  241. IF l_name IS NOT NULL
  242. THEN
  243. /* continue with application logic */
  244. NULL;
  245. END IF;
  246. END;
  247. /
  248.  
  249. -- 3. Explicit cursor unconcerned with too many rows
  250. CREATE OR REPLACE PROCEDURE do_stuff_with_employee (
  251. employee_id_in IN hr.employees.employee_id%TYPE)
  252. IS
  253. l_name hr.employees.last_name%TYPE;
  254.  
  255. CURSOR name_cur
  256. IS
  257. SELECT last_name
  258. FROM hr.employees e
  259. WHERE e.employee_id = do_stuff_with_employee.employee_id_in;
  260. BEGIN
  261. OPEN name_cur;
  262.  
  263. FETCH name_cur INTO l_name;
  264.  
  265. CLOSE name_cur;
  266.  
  267. IF l_name IS NOT NULL
  268. THEN
  269. /* continue with application logic */
  270. NULL;
  271. END IF;
  272. END;
  273. /
  274.  
  275. -- 4. Explicit cursor that checks for too many rows
  276. CREATE OR REPLACE PROCEDURE do_stuff_with_employee (
  277. employee_id_in IN hr.employees.employee_id%TYPE)
  278. IS
  279. l_name hr.employees.last_name%TYPE;
  280. l_name2 hr.employees.last_name%TYPE;
  281.  
  282. CURSOR name_cur
  283. IS
  284. SELECT last_name
  285. FROM hr.employees e
  286. WHERE e.employee_id = do_stuff_with_employee.employee_id_in;
  287. BEGIN
  288. OPEN name_cur;
  289.  
  290. FETCH name_cur INTO l_name;
  291.  
  292. FETCH name_cur INTO l_name2;
  293.  
  294. IF name_cur%FOUND
  295. THEN
  296. CLOSE name_cur;
  297.  
  298. RAISE TOO_MANY_ROWS;
  299. ELSE
  300. CLOSE name_cur;
  301. END IF;
  302.  
  303. IF l_name IS NOT NULL
  304. THEN
  305. /* continue with application logic */
  306. NULL;
  307. END IF;
  308. END;
  309. /
Add Comment
Please, Sign In to add comment