DECLARE CURSOR WS_EMP_CUR IS SELECT EMP_ID FROM EMPLOYEES ; TYPE WS_REC_TYPE IS RECORD ( WS_REC_DEF EMPLOYEES.EMP_ID%TYPE) ; WS_REC WS_REC_TYPE ; -- WS_REC EMPLOYEES%ROWTYPE ; TYPE WS_TABLE_TYPE IS TABLE OF EMPLOYEES.EMP_ID%TYPE INDEX BY BINARY_INTEGER; WS_TABLE WS_TABLE_TYPE; WS_COUNT NUMBER := 1; WS_PRESENT_ROW NUMBER := 1; BEGIN dbms_output.put_line('OPEN CURSOR'); FOR WS_FOR IN WS_EMP_CUR LOOP EXIT WHEN WS_EMP_CUR%NOTFOUND; WS_REC := WS_FOR ; WS_TABLE(WS_COUNT) := WS_FOR.EMP_ID ; WS_TABLE(WS_COUNT) := WS_REC.WS_REC_DEF ; dbms_output.put_line(WS_COUNT || ':' || WS_TABLE (WS_COUNT)); WS_COUNT := WS_COUNT + 1 ; END LOOP; WS_COUNT := WS_COUNT - 1; WS_PRESENT_ROW := WS_TABLE.FIRST; dbms_output.put_LINE (WS_PRESENT_ROW) ; FOR WS_X IN 1 .. WS_COUNT LOOP DBMS_OUTPUT.PUT_LINE(WS_PRESENT_ROW || ':' || WS_TABLE(WS_PRESENT_ROW) ) ; WS_PRESENT_ROW := WS_TABLE.NEXT(WS_PRESENT_ROW) ; END LOOP;
EXCEPTION WHEN OTHERS THEN dbms_output.put_line('ERROR'||SQLCODE ||':' || SQLERRM); END ; ******************************************* EMP_FUNCTION create or replace FUNCTION emp_FUNCTION ( WS_EMP_ID IN NUMBER DEFAULT NULL , WS_EMP_NAME IN char DEFAULT NULL, WS_EMP_CITY in varchar DEFAULT NULL, WS_EMP_salary IN number DEFAULT NULL, ws_emp_dept IN NUMBER DEFAULT NULL, WS_EMP_DEPT_NAME IN VARCHAR DEFAULT NULL, WS_MESSAGE OUT VARCHAR ) RETURN VARCHAR
IS WS_EMPLOYEES VARCHAR (100) ; CURSOR CUR_LOAD IS SELECT * FROM EMPLOYEES ; WS_VAR EMPLOYEES%rowtype ; begin OPEN CUR_LOAD ; LOOP FETCH CUR_LOAD INTO WS_var; EXIT WHEN CUR_LOAD%NOTFOUND; IF ws_var.EMP_ID = WS_EMP_ID THEN insert into emphistory (emphis_emp_id , emphis_emp_name, emphis_emp_city , emphis_salary , emphis_ dept, emphis_dept_name ) valUES (WS_EMP_ID,WS_EMP_NAME, WS_EMP_CITY,WS_EMP_SALARY, WS_EMP_DEPT,ws_em p_dept); END IF ; END LOOP ; WS_MESSAGE := 'SUCESS FUNCTION'; dbms_output.put_line(WS_MESSAGE); RETURN ('COMPLETE FUNCTION') ; EXCEPTION WHEN OTHERS THEN raise_application_error (-20010,'error'); end EMP_FUNCTION; ********************************** RUN_FUNCTION SET SERVEROUTPUT ON SIZE 2000 ; DECLARE WS_VAR VARCHAR (20); BEGIN dbms_output.put_line('START MAIN'); WS_VAR := EMP_FUNCTION (WS_EMP_ID => 100, WS_MESSAGE => WS_VAR ); dbms_output.put_line('JUST BEFORE MAIN PROGRAM END'); DBMS_OUTPUT.PUT_LINE('DONE DONE' || ' ' || WS_VAR); EXCEPTION WHEN OTHERS THEN DBMS_OUTPUT.PUT_LINE ('FAILUER' || SQLERRM || SQLCODE) ;
END; ********************************** EMP_PROCEDURE create or replace procedure emp_procedure ( WS_EMP_ID IN NUMBER DEFAULT NULL , WS_EMP_NAME IN char DEFAULT NULL, WS_EMP_CITY in varchar DEFAULT NULL, WS_EMP_salary IN number DEFAULT NULL, ws_emp_dept IN NUMBER DEFAULT NULL, WS_EMP_DEPT_NAME IN VARCHAR DEFAULT NULL, WS_MESSAGE OUT VARCHAR ) IS WS_EMPLOYEES VARCHAR (100) ; CURSOR CUR_LOAD IS SELECT * FROM EMPLOYEES ; WS_VAR EMPLOYEES%rowtype ; begin OPEN CUR_LOAD ; LOOP FETCH CUR_LOAD INTO WS_var; EXIT WHEN CUR_LOAD%NOTFOUND; IF ws_var.EMP_ID = WS_EMP_ID THEN insert into emphistory (emphis_emp_id , emphis_emp_name, emphis_emp_city , emphis_salary , emphis_ dept, emphis_dept_name ) valUES (WS_EMP_ID,WS_EMP_NAME, WS_EMP_CITY,WS_EMP_SALARY, WS_EMP_DEPT,ws_em p_dept); END IF ; END LOOP ; WS_MESSAGE := 'SUCESS' ; dbms_output.put_line(WS_MESSAGE); EXCEPTION WHEN OTHERS THEN raise_application_error (-20010,'error'); end EMP_procedure; ************************************ RUN_PROCEDURE SET SERVEROUTPUT ON SIZE 2000 ; DECLARE WS_VAR VARCHAR (20); BEGIN dbms_output.put_line('START'); EMP_PROCEDURE (WS_EMP_ID => 100, WS_MESSAGE => WS_VAR ); DBMS_OUTPUT.PUT_LINE('SUCCESS'); EXCEPTION WHEN OTHERS THEN DBMS_OUTPUT.PUT_LINE ('FAILUER') ;
END; ************************************ EMP_PACKGE CREATE PACKAGE emp_package AS PROCEDURE EMP_P_PROCEDURE ( WS_EMP_ID IN NUMBER DEFAULT NULL , WS_EMP_NAME IN char DEFAULT NULL, WS_EMP_CITY in varchar DEFAULT NULL, WS_EMP_salary IN number DEFAULT NULL, ws_emp_dept IN NUMBER DEFAULT NULL, WS_EMP_DEPT_NAME IN VARCHAR DEFAULT NULL, WS_MESSAGE OUT VARCHAR ) ; END EMP_PACKAGE ; / create or replace PACKAGE BODY EMP_PACKAGE AS WS_OUT1 VARCHAR2 (20); PROCEDURE EMP_P_PRIVATE (WS_INPUT IN NUMBER DEFAULT NULL , WS_OUTPUT OUT VARCHAR2 ) IS BEGIN dbms_output.put_line('PRIVATE PROCEDURE GLOBAL VARIABLE MAIN PACKAGE ' || WS_OUT ); WS_OUTPUT := 10; END EMP_P_PRIVATE ; FUNCTION emp_P_FUNCTION ( WS_EMP_ID IN NUMBER DEFAULT NULL , WS_EMP_NAME IN char DEFAULT NULL, WS_EMP_CITY in varchar DEFAULT NULL, WS_EMP_salary IN number DEFAULT NULL, ws_emp_dept IN NUMBER DEFAULT NULL, WS_EMP_DEPT_NAME IN VARCHAR DEFAULT NULL, WS_MESSAGE OUT VARCHAR ) RETURN VARCHAR
IS WS_EMPLOYEES VARCHAR (100) ; CURSOR CUR_LOAD IS SELECT * FROM EMPLOYEES ; WS_VAR EMPLOYEES%rowtype ; begin dbms_output.put_line('GLOBAL VARIABLE MAIN PACKAGE ' || WS_OUT ); EMP_P_PRIVATE (10,WS_OUTPUT => WS_OUT); DBMS_OUTPUT.PUT_LINE (WS_OUT) ; OPEN CUR_LOAD ; LOOP FETCH CUR_LOAD INTO WS_var; EXIT WHEN CUR_LOAD%NOTFOUND; IF ws_var.EMP_ID = WS_EMP_ID THEN insert into emphistory (emphis_emp_id , emphis_emp_name, emphis_emp_city , emphis_salary , emphis_ dept, emphis_dept_name ) valUES (WS_EMP_ID,WS_EMP_NAME, WS_EMP_CITY,WS_EMP_SALARY, WS_EMP_DEPT,ws_em p_dept); END IF ; END LOOP ; WS_MESSAGE := 'SUCESS FUNCTION'; dbms_output.put_line(WS_MESSAGE); RETURN ('COMPLETE FUNCTION') ; EXCEPTION WHEN OTHERS THEN raise_application_error (-20010,'error'); end EMP_P_FUNCTION; PROCEDURE EMP_P_PROCEDURE ( WS_EMP_ID IN NUMBER DEFAULT NULL , WS_EMP_NAME IN char DEFAULT NULL, WS_EMP_CITY in varchar DEFAULT NULL, WS_EMP_salary IN number DEFAULT NULL, ws_emp_dept IN NUMBER DEFAULT NULL, WS_EMP_DEPT_NAME IN VARCHAR DEFAULT NULL, WS_MESSAGE OUT VARCHAR ) IS WS_EMPLOYEES VARCHAR (100) ; CURSOR CUR_LOAD IS SELECT * FROM EMPLOYEES ; WS_VAR EMPLOYEES%rowtype ; begin dbms_output.put_line('PACKAGE PROCEDURE START '); OPEN CUR_LOAD ; LOOP FETCH CUR_LOAD INTO WS_var; EXIT WHEN CUR_LOAD%NOTFOUND; IF ws_var.EMP_ID = WS_EMP_ID THEN insert into emphistory (emphis_emp_id , emphis_emp_name, emphis_emp_city , emphis_salary , emphis_ dept, emphis_dept_name ) valUES (WS_EMP_ID,WS_EMP_NAME, WS_EMP_CITY,WS_EMP_SALARY, WS_EMP_DEPT,ws_em p_dept); dbms_output.put_line('INSERT SUCESS'); END IF ; END LOOP ; WS_MESSAGE := 'SUCESS PACKAGE PROCEDURE' ; dbms_output.put_line(WS_MESSAGE); EXCEPTION WHEN OTHERS THEN dbms_output.put_line('FAILUER PACKAGE PROCEDURE' || SQLCODE || ';' || SQLERRM ); raise_application_error (-20010,'error'); end EMP_P_procedure; END EMP_PACKAGE ; **************************** RUN PACKAGE FUNCTION SET SERVEROUTPUT ON SIZE 2000 ; DECLARE WS_VAR VARCHAR (20); BEGIN dbms_output.put_line('START MAIN'); WS_VAR := EMP_PACKAGE.EMP_P_FUNCTION (WS_EMP_ID => 100, WS_MESSAGE => WS_VAR ); dbms_output.put_line('JUST BEFORE MAIN PROGRAM END'); DBMS_OUTPUT.PUT_LINE('DONE DONE' || ' ' || WS_VAR); EXCEPTION WHEN OTHERS THEN DBMS_OUTPUT.PUT_LINE ('FAILUER' || SQLERRM || SQLCODE) ;
END; ****************************** RUN PACKAGE PROCEDURE SET SERVEROUTPUT ON SIZE 2000 ; DECLARE WS_VAR VARCHAR (200); BEGIN dbms_output.put_line('START MAIN'); EMP_PACKAGE.EMP_P_PROCEDURE (WS_EMP_ID => 100, WS_MESSAGE => WS_VAR ); DBMS_OUTPUT.PUT_LINE('COMPLETE PROCESS'); EXCEPTION WHEN OTHERS THEN DBMS_OUTPUT.PUT_LINE ('FAILUER MAIN' || SQLCODE || ';' || SQLERRM) ;
END; ************************************* TRIGGER CREATE OR REPLACE TRIGGER EMP_TRIGGER AFTER INSERT ON EMPLOYEES REFERENCING OLD AS OLD_EMP NEW AS NEW_EMP FOR EACH ROW DECLARE WS_DEPT_NAME DEPARTMENT.DEPT_NAME%TYPE DEFAULT NULL ; WS_DEPT DEPARTMENT%ROWTYPE ; BEGIN SELECT DEPT_NAME INTO WS_DEPT_NAME FROM department WHERE DEPARTMENT.DEPT_NUM = :NEW_EMP.EMP_DEPT;
insert into emphistory (emphis_emp_id , emphis_emp_name, emphis_emp_city , emphis_salary , emphis_ dept, emphis_dept_name ) valUES (:NEW_EMP.EMP_ID,:NEW_EMP.EMP_NAME,:NEW_EMP.EMP_CITY,:NEW_EMP.EMP_SA LARY,:NEW_EMP.EMP_DEPT, WS_DEPT_NAME); EXCEPTION WHEN OTHERS THEN DBMS_OUTPUT.PUT_LINE ('ERROR'||SQLERRM||' :' ||SQLCODE) ; RAISE_APPLICATION_ERROR(-20010,'ERROR IN TRIGGER') ; END EMP_TRIGGER ; ************************************* Important -- GIVE COLUMN NAME HAVING PRIMARY/FOREIGN(REFERENCE KEY) SELECT a.table_name, a.column_name, c.table_name, a.column_name,C.CONSTRAINT_TYP E FROM ALL_CONS_COLUMNS A JOIN ALL_CONSTRAINTS C ON A.CONSTRAINT_NAME = C.CONSTRAI NT_NAME WHERE C.TABLE_NAME IN ( 'EMPLOYEES' , 'DEPARTMENT') AND C.CONSTRAINT_TYPE in ('P','R') ; -- GIVE ONLY FOREING KEY BUT WITH PARENT TABLE BANE (NOT FIELD) SELECT UC.TABLE_NAME ,UCC.COLUMyN_NAME, ucc.table_name FROM ALL_CONSTRAINTS UC, ALL_CONS_COLUMNS UCC WHERE UC.R_CONSTRAINT_NAME = UCC.CONSTRAINT_NAME AND uc.constraint_type = 'R' AND UC.TABLE_NAME IN ( 'EMPHISTORY','EMPLOYEES' ,'D EPARTMENT') ; -- Need to use SET while updating UPDATE EMPLOYEES E SET E.EMP_SALARY = 80000 WHERE E.EMP_SALARY > 100 ; -- If more than one column is given with Distinct, then combination should be un ique -- Default is ascending SELECT DISTINCT EMP_DEPT,EMP_NAME,EMP_SALARY FROM employees order by emp_dept DE SC, emp_name DESC ; -- Cann't use order by with Group -- cann't use any field other than given in group by. It is applicable also for HAVING clause -- in PL/SQL we have to use INTO clause SELECT EMP_DEPT,SUM(emp_salary), count(emp_id) FROM employees group by emp_dept having sum(emp_salary) > 4000; select substr(emp_salary,1,2) from employees; --- below command not working because in PL/SQL, rownum are assigned before orde r by. --- Also TOP command does not work select emp_id, emp_salary from employees order by emp_id where emp_salary > 40000 rownum <=1; --- two ways to find max salary select * from (select emp_name,Emp_salary from employees order by emp_salary des c) where rownum <=1 ; ******************************************** others drop table employees ; create table department (Dept_name varchar (20) , dept_manager varchar (40) , Dept_num number (10) prima ry key); insert into department (Dept_name, dept_manager, Dept_num) values ('is','james', 01); create table employees (emp_name char (10), emp_id number primary key, emp_city varchar (10), emp_salary number , emp_dept number (10) references department (dept_num), emp_nationality varchar (5) ) ; insert into employees (emp_name, emp_id, emp_city, emp_salary, emp_dept, emp_nationality) values ('gorav', 100, 'hissar', 75000,01,'in') ; describe employees; Select emp_name, emp_city, emp_salary,Dept_name from employees e ,department d where e.emp_dept = d.dept_num order by dept_name; Select emp_dept, sum (emp_salary) from employees group by emp_dept having ( sum (emp_salary) > 50000 ); -- group by, select can have aggregation function or fields used in group by