Advertisement
Guest User

Untitled

a guest
Feb 8th, 2016
43
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 12.84 KB | None | 0 0
  1. -------------- Task 1 --------------------------
  2.  
  3. alter table student add istall Int constraint isbool check (istall IN(0,1));
  4.  
  5. create or replace PROCEDURE IsStudentTall(
  6. p_login IN student.login%TYPE) AS
  7. v_avg_tallness student.tallness%TYPE;
  8. v_student_tallness student.tallness%TYPE;
  9. BEGIN
  10. select avg(tallness) into v_avg_tallness from student;
  11. select tallness into v_student_tallness from student where login = p_login;
  12. if v_avg_tallness > v_student_tallness then
  13. update student set istall = 0 where login = p_login;
  14. else
  15. update student set istall = 1 where login = p_login;
  16. end if;
  17. END IsStudentTall;
  18.  
  19. execute IsStudentTall('nov90');
  20. execute IsStudentTall('bac27');
  21.  
  22. ------------
  23.  
  24. create or replace
  25. FUNCTION LoginExist( p_login IN student.login%TYPE)
  26. RETURN boolean AS
  27. v_login student.login%TYPE;
  28. BEGIN
  29. select login into v_login from student where login = p_login;
  30. return true;
  31. EXCEPTION
  32. when others then
  33. return false;
  34. END LoginExist;
  35.  
  36.  
  37. create or replace
  38. PROCEDURE AddStudent2(
  39. p_fname IN VARCHAR2,
  40. p_lname IN VARCHAR2,
  41. p_account IN NUMBER) AS
  42. v_login VARCHAR2(10);
  43. v_number INT;
  44. v_code NUMBER;
  45. v_errm VARCHAR2(64);
  46. BEGIN
  47. v_number := 0;
  48. loop
  49. v_login := substr(p_lname, 0, 3) || TO_CHAR(v_number);
  50. exit when not loginexist(v_login) or v_number > 99;
  51. v_number := v_number + 1;
  52. end loop;
  53. insert into student (login, fname, lname, tallness) values (v_login, p_fname, p_lname, p_tallness);
  54. commit;
  55. exception
  56. when others then
  57. v_code := SQLCODE;
  58. v_errm := SUBSTR(SQLERRM, 1, 64);
  59. DBMS_OUTPUT.PUT_LINE('Error code ' || v_code || ': ' || v_errm);
  60. END AddStudent2;
  61.  
  62. -------------- Task 2 --------------------------
  63.  
  64. create or replace
  65. PROCEDURE IsStudentTall
  66. AS
  67. cursor c_students is select * from student;
  68. v_avg_account student.account%TYPE;
  69. v_studentRecord student%ROWTYPE;
  70. BEGIN
  71. select avg(account) into v_avg_account from student;
  72. open c_students;
  73. loop
  74. fetch c_students into v_studentRecord;
  75. exit when c_students%NOTFOUND;
  76. if v_avg_account > v_studentRecord.account then
  77. update student set isTall = 0 where login = v_studentrecord.login;
  78. else
  79. update student set isTall = 1 where login = v_studentrecord.login;
  80. end if;
  81. end loop;
  82. close c_students;
  83. END IsStudentTall;
  84.  
  85. -------
  86.  
  87. create or replace
  88. PROCEDURE IsStudentTall
  89. AS
  90. cursor c_students is select * from student;
  91. v_avg_konto student.konto%TYPE;
  92. BEGIN
  93. select avg(konto) into v_avg_konto from student;
  94. for onerecord in c_students
  95. loop
  96. if v_avg_konto > onerecord.konto then
  97. update student set isTall = 0 where login = onerecord.login;
  98. else
  99. update student set isTall = 1 where login = onerecord.login;
  100. end if;
  101. end loop;
  102. END IsStudentTall;
  103.  
  104. -------------- Task 3 --------------------------
  105.  
  106. create or replace
  107. PROCEDURE CopyTableStructure(p_table_name VARCHAR2) as
  108. cursor c_columns is select * from user_tab_columns where table_name = p_table_name order by column_id;
  109. v_command VARCHAR2(1000);
  110. begin
  111. v_command := 'CREATE TABLE ' || p_table_name || '_old (';
  112. for one_column in c_columns loop
  113. if c_columns%ROWCOUNT > 1 then
  114. v_command := v_command || ',';
  115. end if;
  116. v_command := v_command || ' ' || one_column.column_name || ' ' || one_column.data_type || '(' || one_column.data_length || ')';
  117. end loop;
  118. v_command := v_command || ')';
  119.  
  120. EXECUTE IMMEDIATE v_command;
  121. end;
  122.  
  123. -----------
  124.  
  125. create or replace
  126. PROCEDURE CopyTable(p_table_name VARCHAR2) as
  127. begin
  128. copytablestructure(p_table_name);
  129. execute immediate 'declare cursor c_rows is select * from ' || p_table_name || '; ' ||
  130. 'begin ' ||
  131. 'for one_row in c_rows loop ' ||
  132. 'insert into ' || p_table_name || '_old values one_row;' ||
  133. 'end loop; end;';
  134. end;
  135.  
  136. -------------- Task 4 --------------------------
  137.  
  138. create or replace
  139. FUNCTION LoginExist( p_login IN student.login%TYPE)
  140. RETURN boolean AS
  141. v_login student.login%TYPE;
  142. BEGIN
  143. select login into v_login from student where login = p_login;
  144. return true;
  145. EXCEPTION
  146. when no_data_found then
  147. return false;
  148. END LoginExist;
  149. /
  150.  
  151. -------
  152.  
  153. create or replace FUNCTION
  154. InsertStudent(
  155. p_login IN student.login%TYPE,
  156. p_fname IN student.fname%TYPE,
  157. p_lname IN student.lname%TYPE,
  158. p_account IN student.account%TYPE)
  159. RETURN boolean AS
  160. BEGIN
  161. Insert Into student(login, fname, lname, account) Values (p_login, p_fname, p_lname, p_account);
  162. return true;
  163. EXCEPTION
  164. when DUP_VAL_ON_INDEX then
  165. return false;
  166. END InsertStudent;
  167. /
  168.  
  169. create or replace
  170. PROCEDURE AddStudent3(
  171. p_fname IN VARCHAR2,
  172. p_lname IN VARCHAR2,
  173. p_account IN NUMBER) AS
  174. v_login VARCHAR2(10);
  175. v_number INT;
  176. v_code NUMBER;
  177. v_errm VARCHAR2(64);
  178. BEGIN
  179. v_number := 0;
  180. loop
  181. v_login := substr(p_lname, 0, 3) || TO_CHAR(v_number);
  182. exit when insertstudent(v_login, p_fname, p_lname, p_account) or v_number > 99;
  183. v_number := v_number + 1;
  184. end loop;
  185. commit;
  186. exception
  187. when others then
  188. v_code := SQLCODE;
  189. v_errm := SUBSTR(SQLERRM, 1, 64);
  190. DBMS_OUTPUT.PUT_LINE('Error code ' || v_code || ': ' || v_errm);
  191. rollback;
  192. END AddStudent3;
  193. /
  194.  
  195. --------
  196.  
  197. create or replace
  198. PROCEDURE StudentBecomeTeacher(
  199. p_login IN CHAR,
  200. p_department IN INTEGER)
  201. AS
  202. v_fname VARCHAR2(20);
  203. v_lname VARCHAR2(20);
  204. e_no_delete exception;
  205. pragma exception_init (e_no_delete,-02292);
  206. BEGIN
  207. SELECT fname, lname INTO v_fname, v_lname FROM student WHERE login = p_login;
  208. DELETE FROM student WHERE login = p_login;
  209. INSERT INTO teacher(login, fname, lname, department) VALUES (p_login, v_fname, v_lname, p_department);
  210. EXCEPTION
  211. WHEN e_no_delete THEN
  212. delete from student_course where idstudent = p_login;
  213. StudentBecomeTeacher(p_login, p_department);
  214. WHEN OTHERS THEN
  215. DBMS_OUTPUT.put_line (DBMS_UTILITY.FORMAT_ERROR_STACK);
  216. END StudentBecomeTeacher;
  217. /
  218.  
  219. -------------- Task 5 --------------------------
  220.  
  221. create or replace
  222. TRIGGER OperationCount
  223. BEFORE DELETE OR INSERT OR UPDATE ON Student
  224. FOR EACH ROW
  225. DECLARE
  226. BEGIN
  227. case
  228. when inserting then
  229. update statistics set operationcount = operationcount + 1 where operation = 'insert';
  230. when updating then
  231. update statistics set operationcount = operationcount + 1 where operation = 'update';
  232. when deleting then
  233. update statistics set operationcount = operationcount + 1 where operation = 'delete';
  234. end case;
  235. END;
  236. /
  237.  
  238. ---------
  239.  
  240. alter table course add capacity int;
  241. update course set capacity = 2;
  242.  
  243. create or replace
  244. trigger capacityControl
  245. BEFORE INSERT ON student_course
  246. for each row
  247. declare
  248. v_capacity int;
  249. v_student_number int;
  250. begin
  251. select capacity into v_capacity from course where id = :NEW.idcourse;
  252. select count(*) into v_student_number from student_course where idcourse = :NEW.idcourse;
  253. if v_capacity < v_student_number + 1 then
  254. dbms_output.put_line('Number of students exceeded the capacity of lecture');
  255. end if;
  256. end;
  257. /
  258.  
  259. ---------
  260.  
  261. create or replace
  262. trigger capacityControl
  263. BEFORE INSERT ON student_course
  264. for each row
  265. declare
  266. v_capacity int;
  267. v_student_number int;
  268. capacity_exceeded exception;
  269. begin
  270. select capacity into v_capacity from course where id = :NEW.idcourse;
  271. select count(*) into v_student_number from student_course where idcourse = :NEW.idcourse;
  272. if v_capacity < v_student_number + 1 then
  273. --dbms_output.put_line('Number of students exceeded the capacity of lecture');
  274. raise capacity_exceeded;
  275. end if;
  276. end;
  277. /
  278.  
  279. set serveroutput on;
  280. set autocommit off;
  281.  
  282. begin
  283. insert into student_course values ('Bon3', 1, TO_DATE('1.1.2009','DD.MM.YYYY'));
  284. commit;
  285. exception
  286. when others then
  287. dbms_output.put_line('Capacita prekrocena');
  288. rollback;
  289. end;
  290. /
  291.  
  292. -------------- Task 6 --------------------------
  293.  
  294. create or replace package student_package as
  295. capacity_exceeded EXCEPTION;
  296.  
  297. PROCEDURE AddStudent(
  298. p_login IN VARCHAR2,
  299. p_fname IN VARCHAR2,
  300. p_lname IN VARCHAR2,
  301. p_account IN NUMBER);
  302. PROCEDURE AddStudent2(
  303. p_fname IN VARCHAR2,
  304. p_lname IN VARCHAR2,
  305. p_account IN NUMBER);
  306. PROCEDURE AddStudent3(
  307. p_fname IN VARCHAR2,
  308. p_lname IN VARCHAR2,
  309. p_account IN NUMBER);
  310. PROCEDURE IsStudentRich (
  311. p_login IN student.login%TYPE);
  312. PROCEDURE StudentBecomeTeacher(
  313. p_login IN CHAR,
  314. p_department IN INTEGER);
  315. end;
  316. /
  317.  
  318. pak se jeste musi vytvorit telo baliku s nakopirovanymi definicemi procedur
  319.  
  320. ---------
  321.  
  322. create or replace
  323. trigger capacityControl
  324. BEFORE INSERT ON student_course
  325. for each row
  326. declare
  327. v_capacity int;
  328. v_student_number int;
  329. begin
  330. select capacity into v_capacity from course where id = :NEW.idcourse;
  331. select count(*) into v_student_number from student_course where idcourse = :NEW.idcourse;
  332. if v_capacity < v_student_number + 1 then
  333. --dbms_output.put_line('Number of students exceeded the capacity of lecture');
  334. raise student_package.capacity_exceeded;
  335. end if;
  336. end;
  337. /
  338.  
  339. set serveroutput on;
  340. set autocommit off;
  341.  
  342. begin
  343. insert into student_course values ('Bon3', 1, TO_DATE('1.1.2009','DD.MM.YYYY'));
  344. commit;
  345. exception
  346. when student_package.capacity_exceeded then
  347. dbms_output.put_line('Capacita prekrocena');
  348. rollback;
  349. end;
  350. /
  351.  
  352. ------------------------ Task 7a -----------------------------------------------
  353. -- Lehka uprava
  354.  
  355. -- 570.53s
  356. DECLARE
  357. TYPE rc IS REF CURSOR;
  358. v_rc rc;
  359. v_dummy ALL_OBJECTS.OBJECT_NAME%type;
  360. v_start NUMBER DEFAULT DBMS_UTILITY.GET_TIME;
  361. BEGIN
  362. FOR i IN 1 .. 10000
  363. LOOP
  364. OPEN v_rc FOR
  365. 'select object_name from all_objects
  366. where object_id = ' || i;
  367. FETCH v_rc INTO v_dummy;
  368. -- DBMS_OUTPUT.PUT_LINE(i || ': ' || v_dummy);
  369. CLOSE v_rc;
  370. END LOOP;
  371. DBMS_OUTPUT.PUT_LINE(round((DBMS_UTILITY.GET_TIME-v_start)/100, 2) || ' s' );
  372. END;
  373. /
  374.  
  375. -------------------------------------------------------------------------------
  376.  
  377. -- 1.62s
  378. DECLARE
  379. TYPE rc IS REF CURSOR;
  380. v_rc rc;
  381. v_dummy ALL_OBJECTS.OBJECT_NAME%type;
  382. v_start NUMBER DEFAULT DBMS_UTILITY.GET_TIME;
  383. BEGIN
  384. FOR i IN 1 .. 10000
  385. LOOP
  386. OPEN v_rc FOR
  387. 'select object_name from all_objects
  388. where object_id = :x' USING i;
  389. FETCH v_rc INTO v_dummy;
  390. CLOSE v_rc;
  391. -- DBMS_OUTPUT.PUT_LINE(i || ': ' || v_dummy);
  392. END LOOP;
  393. DBMS_OUTPUT.PUT_LINE(round((DBMS_UTILITY.GET_TIME-v_start)/100, 2) || ' s' );
  394. END;
  395. /
  396.  
  397. ------------------------ Task 7b -----------------------------------------------
  398.  
  399. CREATE TABLE Usertab(
  400. ID NUMBER PRIMARY KEY,
  401. fname VARCHAR(50) NOT NULL,
  402. lname VARCHAR(50) NOT NULL)
  403.  
  404. -------------------------------------------------------------------------------
  405. -- 34,88 s
  406. DECLARE
  407. v_fname Usertab.fname%TYPE;
  408. v_lname Usertab.lname%TYPE;
  409. v_str VARCHAR(100);
  410. v_start NUMBER DEFAULT DBMS_UTILITY.GET_TIME;
  411. BEGIN
  412. FOR i IN 1 .. 100000
  413. LOOP
  414. v_fname := 'fname' || i;
  415. v_lname := 'lname' || i;
  416. v_str := 'INSERT INTO Usertab VALUES(' || i || ',''' || v_fname || ''',''' || v_lname || ''')';
  417. EXECUTE IMMEDIATE v_str;
  418. -- DBMS_OUTPUT.PUT_LINE(v_str);
  419. END LOOP;
  420. DBMS_OUTPUT.PUT_LINE(round((DBMS_UTILITY.GET_TIME-v_start)/100, 2) || ' s' );
  421. END;
  422. /
  423.  
  424. -------------------------------------------------------------------------------
  425. -- 5,07 s
  426. DECLARE
  427. v_fname Usertab.fname%TYPE;
  428. v_lname Usertab.lname%TYPE;
  429. v_str VARCHAR(100);
  430. v_start NUMBER DEFAULT DBMS_UTILITY.GET_TIME;
  431. BEGIN
  432. FOR i IN 1 .. 100000
  433. LOOP
  434. v_fname := 'fname' || i;
  435. v_lname := 'lname' || i;
  436. v_str := 'INSERT INTO Usertab VALUES(:1,:2,:3)';
  437. EXECUTE IMMEDIATE v_str USING i,v_fname,v_lname;
  438. -- DBMS_OUTPUT.PUT_LINE(v_str);
  439. END LOOP;
  440. DBMS_OUTPUT.PUT_LINE(round((DBMS_UTILITY.GET_TIME-v_start)/100, 2) || ' s' );
  441. END;
  442. /
  443.  
  444. -------------------------- Task 7c ---------------------------------------------
  445.  
  446. -- COMMIT po každém záznamu: 13.45s
  447. -- COMMIT po posledním záznamu: 5.7s
  448.  
  449. -------------------------- Task 7d ---------------------------------------------
  450. -- 0.51s
  451. DECLARE
  452. TYPE UserArray IS VARRAY(10000) OF Usertab%ROWTYPE;
  453. v_userArray UserArray;
  454. v_counter NUMBER := 0;
  455. v_start NUMBER DEFAULT DBMS_UTILITY.GET_TIME;
  456. BEGIN
  457. v_userArray := UserArray(); -- inicialization
  458. v_userArray.EXTEND(10000); -- resize
  459.  
  460. -- you must run it 10x beacuse 100 000 items must be inserted
  461. FOR i IN 1 .. 10
  462. LOOP
  463. FOR j IN 1 .. 10000 -- prepare array
  464. LOOP
  465. v_counter := v_counter + 1;
  466. v_userArray(j).id := v_counter;
  467. v_userArray(j).fname := 'fname' || v_counter;
  468. v_userArray(j).lname := 'lname' || v_counter;
  469. END LOOP;
  470.  
  471. -- bulk insert
  472. FORALL i IN v_userArray.FIRST..v_userArray.LAST
  473. INSERT INTO Usertab VALUES v_userArray(i);
  474. END LOOP;
  475. DBMS_OUTPUT.PUT_LINE(round((DBMS_UTILITY.GET_TIME-v_start)/100, 2) || ' s' );
  476. END;
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement