Advertisement
Guest User

Untitled

a guest
May 20th, 2019
107
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 12.78 KB | None | 0 0
  1. CREATE OR REPLACE PACKAGE manager AS
  2. TYPE v_array IS TABLE OF VARCHAR(10000) INDEX BY BINARY_INTEGER;
  3. PROCEDURE insert_into_table(table_name in VARCHAR2, id_name in VARCHAR2, type_column in v_array, data in v_array,
  4. result out VARCHAR2);
  5. PROCEDURE update_entry_table(table_name in VARCHAR2, id_name in VARCHAR2, type_column in v_array, data in v_array,
  6. result out VARCHAR2);
  7. PROCEDURE show_last_transactions(p_arr out v_array);
  8. PROCEDURE show_due_date(p_arr OUT v_array);
  9. PROCEDURE bank_cnp(cnp IN VARCHAR2, result OUT VARCHAR2);
  10. PROCEDURE top_used_atm(p_arr OUT v_array);
  11. PROCEDURE top_bank(p_arr OUT v_array);
  12. PROCEDURE delete_low_bank;
  13. PROCEDURE delete_old_transactions(number_months IN NUMBER);
  14. PROCEDURE delete_from_table(table_name in VARCHAR2, id_name in VARCHAR2);
  15. PROCEDURE select_data(table_name in VARCHAR2, v_start in NUMBER, v_end in NUMBER, result out v_array);
  16. FUNCTION atm_last_transaction(no_atm NUMBER) RETURN VARCHAR2;
  17. FUNCTION responsible_manager RETURN VARCHAR2;
  18. FUNCTION get_no_transactions(v_CNP VARCHAR2) RETURN NUMBER;
  19. FUNCTION get_rejected_transactions RETURN v_array;
  20. FUNCTION no_of_lines(table_name IN VARCHAR2) RETURN NUMBER;
  21. END manager;
  22. /
  23.  
  24. CREATE OR REPLACE PACKAGE BODY manager IS
  25. PROCEDURE insert_into_table(table_name in VARCHAR2, id_name in VARCHAR2, type_column in v_array, data in v_array,
  26. result out VARCHAR2) IS
  27. insert_clause VARCHAR2(10000);
  28. v_var VARCHAR2(5000);
  29. v_count NUMBER(38);
  30. l_single_quote CHAR(1) := '''';
  31. v_i NUMBER(38);
  32. BEGIN
  33. v_count := 0;
  34. insert_clause := 'INSERT INTO ';
  35. insert_clause := insert_clause || table_name;
  36. insert_clause := insert_clause || '(' || id_name || ',';
  37.  
  38. v_count := type_column.COUNT;
  39. v_i := 1;
  40. LOOP
  41. insert_clause := insert_clause || type_column(v_i);
  42. EXIT WHEN v_i = v_count;
  43. v_i := v_i + 1;
  44. insert_clause := insert_clause || ',';
  45. END LOOP;
  46. insert_clause := INSERT_CLAUSE || ') values ((SELECT max(' || id_name || ')+1 FROM ' || table_name || '),';
  47.  
  48. v_i := 1;
  49. LOOP
  50. IF data(v_i) = 'sysdate' THEN
  51. insert_clause := insert_clause || 'sysdate';
  52. ELSE
  53. insert_clause := insert_clause || l_single_quote || data(v_i) || l_single_quote;
  54. END IF;
  55. EXIT WHEN v_i = v_count;
  56. v_i := v_i + 1;
  57. insert_clause := insert_clause || ',';
  58. END LOOP;
  59. insert_clause := INSERT_CLAUSE || ')';
  60. EXECUTE IMMEDIATE insert_clause;
  61. result := 'Inserarea a reusit!';
  62. EXCEPTION
  63. WHEN DUP_VAL_ON_INDEX THEN
  64. result := 'Datele introduse nu corespund cu baza de date.';
  65. END insert_into_table;
  66.  
  67. PROCEDURE show_last_transactions(p_arr out v_array) IS
  68. BEGIN
  69. SELECT CARD_ID || '%' || ATM_ID || '%' || TRANSACTION_DATE || '%' || SUM || ' Lei' bulk COLLECT into p_arr
  70. from (select * FROM TRANSACTION ORDER BY TRANSACTION_DATE DESC)
  71. WHERE ROWNUM < 11;
  72. END show_last_transactions;
  73.  
  74. PROCEDURE show_due_date(p_arr OUT v_array) IS
  75. BEGIN
  76. SELECT fname || ' ' || lname || '%' || CARD_NUMBER || '%' || EXP BULK COLLECT INTO p_arr
  77. FROM (SELECT c.card_number, c.exp, c1.fname, c1.lname
  78. FROM card c
  79. JOIN has h ON c.fk_id = h.account_id
  80. JOIN clients c1 ON c1.id = h.CLIENT_ID
  81. WHERE c.exp < SYSDATE);
  82. EXCEPTION
  83. WHEN NO_DATA_FOUND THEN
  84. p_arr(1) := 'Nu am gasit nici un card.';
  85. END show_due_date;
  86.  
  87. PROCEDURE bank_cnp(cnp IN VARCHAR2, result OUT VARCHAR2) IS
  88. v_id_client NUMBER(10);
  89. sql_stmt VARCHAR2(500);
  90. BEGIN
  91. sql_stmt := 'SELECT ID FROM clients WHERE clients.CNP=:1';
  92. EXECUTE IMMEDIATE sql_stmt INTO v_id_client USING cnp;
  93. sql_stmt := 'SELECT ba.name FROM bank ba join branch br on ba.id=br.bank_id join managers ma on ma.fk_id=br.subsidiary_id
  94. join handles ha on ha.manager_id=ma.id where ha.client_id=:1';
  95. EXECUTE IMMEDIATE sql_stmt INTO result USING V_ID_CLIENT;
  96. EXCEPTION
  97. WHEN NO_DATA_FOUND THEN
  98. result := 'Acest client nu exista.';
  99. END bank_cnp;
  100.  
  101. PROCEDURE top_used_atm(p_arr out v_array) IS
  102. sql_stmt VARCHAR2(500);
  103. BEGIN
  104. SELECT ATM_ID || '%' || PLACE || '%' || "COUNTED" BULK COLLECT INTO p_arr
  105. from (SELECT ATM_ID, PLACE, "COUNTED"
  106. FROM (select T.ATM_ID, A.PLACE, COUNT(*) as "COUNTED"
  107. FROM TRANSACTION T
  108. JOIN ATM A ON A.ATM_NO = T.ATM_ID
  109. GROUP BY ATM_ID, A.PLACE)
  110. ORDER BY COUNTED desc)
  111. WHERE ROWNUM < 6;
  112. END top_used_atm;
  113.  
  114. PROCEDURE top_bank(p_arr out v_array) IS
  115. sql_stmt VARCHAR2(5000);
  116. BEGIN
  117. SELECT NAME || '%' || ADDRESS || '%' || "COUNTED" BULK COLLECT INTO p_arr
  118. FROM (SELECT *
  119. FROM (SELECT name, address, SUM("COUNTED") AS "COUNTED"
  120. FROM (SELECT ba.name, ba.address, COUNT(*) AS "COUNTED"
  121. FROM bank ba
  122. join branch br on ba.id = br.bank_id
  123. join managers ma on ma.fk_id = br.subsidiary_id
  124. join handles ha on ha.manager_id = ma.id
  125. GROUP BY ha.manager_id, ba.name, ba.address)
  126. GROUP BY NAME, ADDRESS)
  127. ORDER BY "COUNTED" DESC)
  128. WHERE ROWNUM < 6;
  129. END top_bank;
  130.  
  131. PROCEDURE delete_low_bank IS
  132. sql_stmt VARCHAR2(500);
  133. bank_id NUMBER(10);
  134. BEGIN
  135. sql_stmt := 'SELECT IDBANK FROM (SELECT * FROM (SELECT IDBANK,SUM("COUNTED") AS "COUNTED" FROM (SELECT ba.id as "IDBANK",COUNT(*) AS "COUNTED" FROM
  136. bank ba join branch br on ba.id=br.bank_id join managers ma on ma.fk_id=br.subsidiary_id
  137. join handles ha on ha.manager_id=ma.id GROUP BY ha.manager_id,ba.id) GROUP BY IDBANK) ORDER BY "COUNTED" ASC) WHERE ROWNUM<2';
  138. EXECUTE IMMEDIATE sql_stmt INTO BANK_ID;
  139. sql_stmt := 'DELETE FROM BANK WHERE ID=:1';
  140. EXECUTE IMMEDIATE sql_stmt USING BANK_ID;
  141. END delete_low_bank;
  142.  
  143. PROCEDURE delete_old_transactions(number_months in NUMBER) IS
  144. sql_stmt VARCHAR2(500);
  145. BEGIN
  146. sql_stmt := 'DELETE FROM TRANSACTION WHERE MONTHS_BETWEEN(SYSDATE,TRANSACTION_DATE)>=:1';
  147. EXECUTE IMMEDIATE sql_stmt USING number_months;
  148. END DELETE_OLD_TRANSACTIONS;
  149.  
  150. FUNCTION atm_last_transaction(no_atm NUMBER) RETURN VARCHAR2 AS
  151. date_last_transaction VARCHAR2(20) := 'NO TRANSACTION';
  152. format_date VARCHAR2(10) := 'DD-MM-YYYY';
  153. sql_stmt VARCHAR2(500);
  154. BEGIN
  155. sql_stmt := 'SELECT TO_CHAR(TRANSACTION_DATE,:1)
  156. FROM (SELECT TRANSACTION_DATE FROM TRANSACTION WHERE ATM_ID=:2
  157. ORDER BY TRANSACTION_DATE) WHERE ROWNUM<2';
  158. EXECUTE IMMEDIATE sql_stmt INTO date_last_transaction USING FORMAT_DATE, NO_ATM;
  159. return date_last_transaction;
  160. EXCEPTION
  161. WHEN NO_DATA_FOUND THEN
  162. return 'ID-ul ATM-ului este invalid sau nu au fost realizate tranzactii.';
  163. END atm_last_transaction;
  164.  
  165.  
  166. FUNCTION responsible_manager RETURN VARCHAR2 AS
  167. manager_name VARCHAR2(200);
  168. sql_stmt VARCHAR2(500);
  169. SPACE VARCHAR2(2) := ' ';
  170. BEGIN
  171. sql_stmt := 'SELECT FNAME||:1||LNAME FROM (SELECT * FROM (SELECT M.FNAME,
  172. M.LNAME,M.ID,COUNT(M.ID) AS "COUNTABLE"
  173. FROM MANAGERS M JOIN EMPLOYER E ON M.ID=E.MANAGER_ID
  174. JOIN EMPLOYEES EM ON EM.ID=E.EMPLOYEE_ID GROUP BY M.ID,M.FNAME,
  175. M.LNAME) ORDER BY "COUNTABLE" DESC)
  176. WHERE ROWNUM<2';
  177. EXECUTE IMMEDIATE sql_stmt INTO manager_name USING SPACE;
  178. RETURN manager_name;
  179. END responsible_manager;
  180.  
  181. FUNCTION get_no_transactions(v_CNP VARCHAR2) RETURN NUMBER AS
  182. v_transactions NUMBER(10);
  183. sql_stmt VARCHAR2(500);
  184. BEGIN
  185. sql_stmt := 'SELECT count(c.id) FROM clients c
  186. join has h on c.ID=h.client_id
  187. join accounts a on a.id=h.account_id
  188. join card c1 on c1.fk_id=h.account_id
  189. join transaction t on t.card_id=c1.id where c.CNP=:cnp group by c.id';
  190. EXECUTE IMMEDIATE sql_stmt INTO v_transactions USING v_CNP;
  191. RETURN v_transactions;
  192. EXCEPTION
  193. WHEN NO_DATA_FOUND THEN return 0; ---'Tranzactiile clientului cu CNP-ul specificat nu are tranzactii.'
  194. END get_no_transactions;
  195.  
  196. FUNCTION get_rejected_transactions RETURN v_array AS
  197. v_transactions NUMBER(10);
  198. p_arr v_array;
  199. BEGIN
  200. SELECT t.id || '%' || c1.exp || '%' || t.TRANSACTION_DATE BULK COLLECT INTO p_arr
  201. FROM card c1
  202. join transaction t on t.card_id = c1.id
  203. where c1.exp < t.TRANSACTION_DATE
  204. AND t.TRANSACTION_DATE < sysdate;
  205. RETURN p_arr;
  206. END get_rejected_transactions;
  207.  
  208. FUNCTION no_of_lines(table_name IN VARCHAR2) RETURN NUMBER AS
  209. no_entries NUMBER(10);
  210. sql_stmt VARCHAR2(500);
  211. BEGIN
  212. sql_stmt := 'SELECT count(*) FROM ' || table_name;
  213. EXECUTE IMMEDIATE sql_stmt INTO no_entries;
  214. RETURN no_entries;
  215. EXCEPTION
  216. WHEN NO_DATA_FOUND THEN
  217. RETURN -1; --- 'Tabeleul nu este populat'
  218. END no_of_lines;
  219.  
  220. PROCEDURE select_data(table_name in VARCHAR2, v_start in NUMBER, v_end in NUMBER, result out v_array) IS
  221. sql_stmt VARCHAR2(5000);
  222. sql_string varchar2(5000);
  223. v_cursor integer;
  224. l_column varchar2(4000);
  225. l_status integer;
  226. l_describeTable dbms_sql.desc_tab;
  227. l_count NUMBER;
  228. v_count_lines NUMBER := 1;
  229. BEGIN
  230. v_cursor := dbms_sql.open_cursor;
  231. SQL_STMT:='SELECT * FROM (SELECT m.* ,ROWNUM r FROM '|| table_name|| ' m) WHERE r>'||(v_start-1)||' AND r<'||(v_end+1) ;
  232. dbms_sql.parse(v_cursor, SQL_STMT, dbms_sql.native);
  233.  
  234. dbms_sql.describe_columns(v_cursor, l_count, l_describeTable);
  235.  
  236. for i in 1 .. l_count
  237. loop
  238. dbms_sql.define_column(v_cursor, i, l_column, 4000);
  239. end loop;
  240.  
  241. sql_string:=l_describeTable(1).col_name;
  242. FOR i IN 2 .. l_count-1 LOOP
  243. sql_string := sql_string || '%' || l_describeTable(i).col_name;
  244. END LOOP;
  245. result(1) := sql_string;
  246.  
  247. l_status := dbms_sql.execute(v_cursor);
  248. while (dbms_sql.fetch_rows(v_cursor) > 0)
  249. LOOP
  250. v_count_lines := v_count_lines + 1;
  251. dbms_sql.column_value(v_cursor, 1, l_column);
  252. sql_string := l_column;
  253. for i in 2 .. l_count-1
  254. loop
  255. dbms_sql.column_value(v_cursor, i, l_column);
  256. sql_string := sql_string || '%' || l_column;
  257. end loop;
  258. result(v_count_lines) := sql_string;
  259. end loop;
  260. exception
  261. when others then dbms_sql.close_cursor(v_cursor); RAISE;
  262. END select_data;
  263.  
  264. PROCEDURE delete_from_table(table_name in VARCHAR2, id_name in VARCHAR2) IS
  265. sql_stmt VARCHAR2(500);
  266. BEGIN
  267. sql_stmt := 'DELETE FROM :1 WHERE ID=:2';
  268. EXECUTE IMMEDIATE sql_stmt USING table_name,id_name;
  269. END delete_from_table;
  270.  
  271. PROCEDURE update_entry_table(table_name in VARCHAR2, id_name in VARCHAR2, type_column in v_array, data in v_array,
  272. result out VARCHAR2) IS
  273. update_clause VARCHAR2(10000);
  274. v_var VARCHAR2(5000);
  275. v_count NUMBER(38);
  276. l_single_quote CHAR(1) := '''';
  277. v_i NUMBER(38);
  278. BEGIN
  279. v_count := 0;
  280. update_clause := 'UPDATE ';
  281. update_clause := update_clause || table_name;
  282. update_clause := update_clause || ' SET ';
  283. v_count := type_column.COUNT;
  284.  
  285. update_clause := update_clause || type_column(2)||' = '|| l_single_quote || data(2) || l_single_quote;
  286. v_i := 3;
  287.  
  288. LOOP
  289. EXIT WHEN v_i = v_count;
  290. IF (data(v_i) != 'sysdate')
  291. THEN
  292. update_clause := update_clause ||' AND '|| type_column(v_i)||' = '|| l_single_quote || data(v_i) || l_single_quote;
  293. END IF;
  294. v_i := v_i + 1;
  295. END LOOP;
  296. update_clause := update_clause||' WHERE '||type_column(1)||' = '||data(1);
  297. -- EXECUTE IMMEDIATE update_clause;
  298. result := update_clause;
  299. END update_entry_table;
  300.  
  301. END manager;
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement