Sunteți pe pagina 1din 36

PLSQL Basics

If Statement
declare x number; y number; z number; big number; begin z := 10; x := 100; y := 50; big := x; if(y > big) then begin big := y; end; end if; if(z > big) then big := z; end if; dbms_output.put_line(' The highest is '|| to_char(big)); end; /

If Else
Declare x number := 45; y number := 60; z number := 23; big number; begin big := x; if(y > big) then big := y; else if(z > big) then big := z; end if; end if; dbms_output.put_line('the biggest number is '||to_char(big)); end; /

If Elsif
Declare X number := 45; begin if (X<40) then dbms_output.put_line('F'); ELSIF (X<=60) then dbms_output.put_line('S'); ELSIF (X<75) then dbms_output.put_line('I'); else dbms_output.put_line('D'); end if; end; /

For loop
begin x := 0; for i in 1..10 loop x := x + i; end loop; dbms_output.put_line('sum is '||to_char(x)); end; /

While Loop
Declare i number :=1; begin while(i <=21) loop dbms_output.put_line(to_char(i)); i:= i+2; end loop; end; /

Loop ..End Loop


S:= 0; i := 0; LOOP S := S + i; i := i +1; EXIT WHEN (i >100); END LOOP;

Select Into Statement


SELECT.....INTO Statement When a single value or row has to be fetched from a database then SELECT.....INTO can be used. Listing 24.1: Fetching the salary of employee ANIL and calculating the grade according to its value declare x number; begin select salary INTO X from emp_company where ename='ANIL'; --Case Sensitive IF X < 1000 THEN DBMS_OUTPUT.PUT_LINE('A'); ELSIF X < 2000 THEN DBMS_OUTPUT.PUT_LINE('B'); ELSIF X < 3000 THEN DBMS_OUTPUT.PUT_LINE('C'); ELSE DBMS_OUTPUT.PUT_LINE('D'); END IF; END; /

Using Cursor for fetching Rows


DECLARE CURSOR C1 IS SELECT CNAME CN,salary FROM emp_company ORDER BY CNAME; CURSOR C2 IS SELECT ENAME,SALARY FROM EMP_COMPANY; x number:=0; cnt number:=0; BEGIN FOR Z IN C1 LOOP -- DBMS_OUTPUT.PUT_LINE('DATA IS '||Z.CN||' '||Z.salary); cnt:=cnt+1; x:= x+nvl(z.salary,0); END LOOP; DBMS_OUTPUT.PUT_LINE(' total '||x||' avg '||(x/cnt)); FOR Z1 IN C2 LOOP IF(Z1.SALARY>(X/CNT)) THEN DBMS_OUTPUT.PUT_LINE('DATA IS '||Z1.ENAME||' '||Z1.salary); END IF; END LOOP;

END; /

Parametric Cursor
DECLARE CURSOR C1(PCNAME VARCHAR2) IS SELECT CNAME CN,SDATE,PRICE FROM SHARES WHERE CNAME=PCNAME; X NUMBER:=0; COUNTX NUMBER:=0; AVGX NUMBER := 0;

BEGIN FOR Z IN C1('ACC') LOOP X := X + Z.PRICE; COUNTX := COUNTX + 1; DBMS_OUTPUT.PUT_LINE(X); END LOOP; AVGX := X/COUNTX; DBMS_OUTPUT.PUT_LINE(AVGX); END; /

Strongly and Weakly types Cursor


DECLARE TYPE RECTYPE IS RECORD --C ( DES VARCHAR2(20), QTY NUMBER ); Z RECTYPE; --D TYPE CURTYPE IS REF CURSOR ; --RETURN RECTYPE; --A C1 CURTYPE; --B STATUS NUMBER:=2; COUNTR NUMBER:=0; BEGIN IF(STATUS=1) THEN OPEN C1 FOR --4 SELECT CAR,QTY FROM CARSALES ORDER BY CAR; END IF; IF(STATUS=2) THEN OPEN C1 FOR SELECT REGION,QTY FROM CARSALES ORDER BY REGION; END IF; IF(STATUS=3) THEN OPEN C1 FOR SELECT car,QTY FROM CARSALES ORDER BY qty; END IF; FETCH C1 INTO Z; --2 WHILE(C1%FOUND) LOOP --3 DBMS_OUTPUT.PUT_LINE(Z.DES ||' '||Z.QTY); --4 COUNTR:=C1%ROWCOUNT; DBMS_OUTPUT.PUT_LINE('NUMBER OF ROWS FETCHED FROM CURSOR '||TO_CHAR(COUNTR)); FETCH C1 INTO Z; --5 END LOOP;--6 CLOSE C1; --7 END; /

Exception
DECLARE X NUMBER :=34; Y NUMBER:=0; Z NUMBER(2); BEGIN Z:=X/Y; --A Z:=Z+10; --G DBMS_OUTPUT.PUT_LINE('Z VALUE '||TO_CHAR(Z)); --B EXCEPTION WHEN ZERO_DIVIDE THEN Z:=0; --C DBMS_OUTPUT.PUT_LINE('Z VALUE EXCP '||TO_CHAR(Z)); --D WHEN VALUE_ERROR THEN Z:=0; --C DBMS_OUTPUT.PUT_LINE('Z VALUE ERROR EXCP '||TO_CHAR(Z)); --D WHEN OTHERS THEN Z:=0; --E DBMS_OUTPUT.PUT_LINE('Z VALUE EXCP VALUE '||TO_CHAR(Z)); --F END; /

Exception Example
DECLARE X NUMBER(2); Y NUMBER; Z VARCHAR2(200); BEGIN SELECT SALARY INTO X FROM EMP_COMPANY WHERE ENAME='ANIL' OR ename='SUNIL'; DBMS_OUTPUT.PUT_LINE(' SALARY '||TO_CHAR(X)); EXCEPTION WHEN TOO_MANY_ROWS THEN X := 10; Y := SQLCODE; Z := SQLERRM; DBMS_OUTPUT.PUT_LINE(' SALARY '||TO_CHAR(X)||' '||TO_CHAR(Y)); DBMS_OUTPUT.PUT_LINE(Z); WHEN NO_DATA_FOUND THEN X := 200; DBMS_OUTPUT.PUT_LINE(' SALARY '||TO_CHAR(X)); WHEN VALUE_ERROR THEN BEGIN X := 1000; DBMS_OUTPUT.PUT_LINE(' SALARY '||TO_CHAR(X)); EXCEPTION WHEN VALUE_ERROR THEN DBMS_OUTPUT.PUT_LINE(' INNER VALUE ERROR'); END; WHEN OTHERS THEN X := 16; DBMS_OUTPUT.PUT_LINE(' SALARY '||TO_CHAR(X)); END; END; /

Use Defined Exception


declare y number := 89; e1 exception; -- A begin -- of outer declare --begin inner x number :=20; --e1 exception; -- B begin if x > 12 then raise e1; -- B end if; exception when e1 then -- of A dbms_output.put_line(' e1 inner'); raise; end ; -- end inner exception when zero_divide then dbms_output.put_line(' zero_divide outer'); when e1 then -- of A dbms_output.put_line(' e1 outer'); when others then dbms_output.put_line(' others outer'); end; -- outer /

Collections
Declare Type vmarktype IS VARRAY(10) OF integer; X vmarktype; begin X := vmarktype (34,67,89,32,1 ); -- X := vmarktype ( ); -- C -- A

-- B

-- C

For i in 1 .. x.count loop dbms_output.put_line(X(i)); -- E end loop; x.extend; x(6):=100; dbms_output.put_line(X(6)); -- E dbms_output.put_line(X.last); -- E dbms_output.put_line(x(X.last)); -- E IF X.EXISTS(8) THEN DBMS_OUTPUT.PUT_LINE('EXISTS'); ELSE DBMS_OUTPUT.PUT_LINE('NOT EXISTS'); END IF; end; /

Unlimited Array
Declare Type vmarktype IS table OF integer; X vmarktype;

-- A
-- B

begin X := vmarktype (34,67,89,32,1 ); For i in 1 .. x.count loop dbms_output.put_line(X(i)); end loop; x.extend; x(6):=100; dbms_output.put_line(X(6)); dbms_output.put_line(X.last); end; /

-- C

-- E

-- E -- E

Collection as Column Attribute


CREATE TYPE tab_course AS OBJECT (coursecode number(2), coursename varchar2(30)) / CREATE TYPE tab_courselist AS TABLE OF tab_course / CREATE TABLE tab_STUDENT (sname varchar2(30), courses tab_courselist) NESTED TABLE courses STORE AS c_tab / insert into tab_student values('Ajay', tab_courselist(tab_course(1,'java'),tab_course(2,'j2ee'))) /

INSERT INTO tab_student VALUES( 'Anil', tab_courselist( tab_course (10,'Oracle'), tab_course (20, 'Pascal'))) / INSERT INTO tab_student VALUES( 'Sunil', tab_courselist (tab_course (10,'Oracle'),tab_course (25,'C'), tab_course (30,'FORTRAN'))) /

The Operator
insert into THE ( select courses from tab_student where sname= 'Anil') values(30,'Pascal') Update THE ( select courses from tab_student where sname = 'Anil' ) SET coursename = 'oracle 8.0' WHERE coursecode= 10

Bulk Operations
DECLARE TYPE tabnum IS table OF NUMBER; TYPE tabchar IS table OF varchar2(20); aename tabchar := tabchar(); aesalary tabnum:=tabnum(); cursor c1 is select ename,salary from emp_company; cnt number:=0; BEGIN for z in c1 loop aename.extend; aesalary.extend; aename(aename.last):=z.ename; aesalary(aesalary.last):=z.salary; end loop; forall i in aename.first..aename.last insert into empbulk1 values(aename(i),aesalary(i)); forall i in aename.first..aename.last update empbulk1 set salary=aesalary(i) where ename= aename(i); cnt := sql%rowcount;-- sql%bulk_rowcount(i) dbms_output.put_line(' total rows '||to_char(cnt)); END; / /* Create table empbulk1(ename varchar2(20),salary number) */

Bulk Fetch
DECLARE TYPE tabnum IS table OF NUMBER; TYPE tabchar IS table OF varchar2(20); aename tabchar := tabchar(); aesalary tabnum:=tabnum(); cursor c1 is select ename,salary from emp_company; cnt number:=0; BEGIN SELECT ENAME , SALARY BULK COLLECT INTO AENAME,AESALARY FROM EMP_COMPANY; FOR I IN AENAME.FIRST..AENAME.LAST LOOP DBMS_OUTPUT.PUT_LINE(AENAME(I)); END LOOP; OPEN C1; FETCH C1 BULK COLLECT INTO AENAME,AESALARY LIMIT 12; CLOSE C1; FOR I IN AENAME.FIRST..AENAME.LAST LOOP DBMS_OUTPUT.PUT_LINE('CURSOR '||AENAME(I)); END LOOP; end; /

Stored Procedure
CREATE OR REPLACE PROCEDURE ADD2(A IN NUMBER,B IN NUMBER, C OUT NUMBER,F OUT NUMBER) AS D NUMBER; BEGIN D:=A*A; D:=D+B*B; C:= D; F:= A*A*A; END; / CREATE OR REPLACE FUNCTION FADD2(A IN NUMBER,B IN NUMBER)RETURN NUMBER AS D NUMBER; BEGIN D:=A*A; D:=D+B*B; RETURN D; END; / declare x number; y number; a1 number:=90; begin add2(3,5,x,y); add2(a1,5,x,y); y:=2*fadd2(3,6); end; /

create or replace procedure calcamt as x number; cursor c1 is select sn,amt,clamt from t order by sn for update; begin x := 0; for z in c1 loop x:= x+z.amt; update t set clamt =x where current of c1; end loop; end; /

Examples of Stored Subprograms


create or replace PROCEDURE getPsal(pcname IN varchar2,avgSAL OUT NUMBER,maxsal out number) is asal number; msal number; begin select avg(salary),max(salary) into asal,msal from emp_company where cname=pcname; AVGSAL:=ASAL; MAXSAL:=MSAL; end; / create or replace PROCEDURE getratio1(pcname IN varchar2,ratio OUT NUMBER) is asal number; msal number; begin select avg(salary),max(salary) into asal,msal from emp_company where cname=pcname; ratio := msal/asal; end; / create or replace PROCEDURE getratio2(pcname IN varchar2,ratio OUT NUMBER) As asal number; msal number; begin getpsal(pcname,asal,msal); ratio := msal/asal; end; /

Package: Abstraction
create or replace package pkgadd as x number:=10; function add3(a number,b number,c number) return number; procedure pmul(x in number,y in number,z out number); end; / create or replace package body pkgadd as d number:=90; function add2(a number,b number) return number is z number; begin z:=a+b; return (z); end; function add3(a number,b number,c number) return number is z number; begin z:=add2(add2(a,b),c); return (z); end; procedure pmul(x in number,y in number,z out number) is begin z:=x*y; end; begin select max(salary) into x from emp_company; end; /

Package:Example
create or replace package account_pkg as procedure ins(pcname varchar2,pclbalance number,STATUS OUT NUMBER); procedure UPD(PACCOUNTID IN NUMBER,PAMOUNT IN NUMBER); FUNCTION GETBALANCE(PACCOUNTID NUMBER)RETURN NUMBER; end account_pkg; / /* ACCOUNT Name Null? Type ----------------------------------------- -------- --------------ACCOUNTID NUMBER CNAME VARCHAR2(20) CLBALANCE NUMBER */

create or replace package body account_pkg as function getaccountid return number is x number; begin select accountseq.nextval into x from dual; return(x); end; function checkbalance(pclbalance number) return number is begin if pclbalance >=0 then return(1); else return(-1); end if; end; function checkday return number is x char(3); begin select to_char(sysdate,'DAY') INTO X from dual; if(x='SUN') THEN RETURN(-1); ELSE RETURN(1); END IF; end;

function checkUSER return number is x VARCHAR2(30); begin select USER INTO X from dual; if(x='SCOTT') THEN RETURN(1); ELSE RETURN(-1); END IF; end; PROCEDURE PERFORMVALIDATION(PCLBALANCE IN NUMBER,STATUS OUT NUMBER) IS BEGIN STATUS:=1; IF(CHECKBALANCE(PCLBALANCE) < 0) THEN STATUS := -1; END IF; END; PROCEDURE CHECKSECURITY(STATUS OUT NUMBER) IS BEGIN STATUS:=1; IF(CHECKDAY < 0) THEN STATUS := -2; END IF; END; PROCEDURE PERFORMREPLICATION(PCLBALANCE NUMBER) IS BEGIN UPDATE SUMMERY_ACCOUNT SET TCNT=TCNT+1,TBALANCE=TBALANCE+PCLBALANCE; END;

PROCEDURE PERFORMAUDIT(PACCOUNTID NUMBER) IS X VARCHAR2(30); BEGIN SELECT USER INTO X FROM DUAL; INSERT INTO AUDIT_ACCOUNT VALUES(X,PACCOUNTID,SYSDATE); END; procedure ins(pcname varchar2,pclbalance number,STATUS OUT NUMBER) is accountsn number; begin STATUS := 1; PERFORMVALIDATION(PCLBALANCE,STATUS); DBMS_OUTPUT.PUT_LINE('VALIDATION '||TO_CHAR(STATUS)); CHECKSECURITY(STATUS); DBMS_OUTPUT.PUT_LINE('SECURITY '||TO_CHAR(STATUS)); IF (STATUS=1) THEN accountsn := getaccountid; insert into account values(accountsn,pcname,pclbalance); PERFORMAUDIT(ACCOUNTSN); PERFORMREPLICATION(PCLBALANCE); END IF; end;

FUNCTION GETBALANCE(PACCOUNTID NUMBER) RETURN NUMBER IS X NUMBER; BEGIN SELECT CLBALANCE INTO X FROM ACCOUNT WHERE ACCOUNTID=PACCOUNTID; RETURN(X); END; procedure UPD(PACCOUNTID IN NUMBER,PAMOUNT IN NUMBER) IS BEGIN UPDATE ACCOUNT SET CLBALANCE=CLBALANCE+PAMOUNT WHERE ACCOUNTID=PACCOUNTID; UPDATE SUMMERY_ACCOUNT SET TBALANCE=TBALANCE+PAMOUNT; END; end account_pkg; /

Trigger
create or replace trigger UPDemp1 before update on emp_company declare x VARCHAR2(10); begin SELECT TO_CHAR(SYSDATE,'DAY') INTO X FROM DUAL; DBMS_OUTPUT.PUT_LINE(X); IF(RTRIM(X)='FRIDAY') THEN RAISE_APPLICATION_ERROR(-20110,'NOT ALLOWED'); END IF; END; /

Triggers
create or replace trigger UPDemp before update on emp_company for each row declare x number :=0; begin if :new.cname='ACC' THEN X:=0.05*:NEW.SALARY; END IF; :NEW.SALARY:=:NEW.SALARY+X; END; /

CREATE OR REPLACE TRIGGER TRGBILL BEFORE INSERT ON ZBILL FOR EACH ROW DECLARE X NUMBER; Y DATE; BEGIN SELECT BILLSEQ.NEXTVAL INTO X FROM DUAL; SELECT SYSDATE INTO Y FROM DUAL; :NEW.BILLNO:=X; :NEW.BDATE:=Y;

END; / /* create sequence billseq Create table zbill(billno number,bdate date, billamt number); */

Trigger:Example
create or replace trigger pcm_trg4 before insert or update or delete on pcm declare uname varchar2(20); x char(20); begin select user into uname from dual; --dbms_output.put_line(x); select to_char(sysdate,'Day') into x from dual; dbms_output.put_line(x); if INSERTING then if (x != 'Saturday') then Raise_application_error(-20111,'Insertion is not allowed on other days'); end if; end if; if (updating or deleting) AND (UNAME !='SCOTT') then Raise_application_error(-20112,'Updation and Deletion is not allowed '); end if; end; /

CREATE TABLE Z_COPY(A NUMBER , B NUMBER) / create or replace trigger autotrigger before insert on Z FOR EACH ROW declare pragma autonomous_transaction; begin insert into Z_COPY values(:new.A,:new.B); commit; end;

/
insert into z values(1,1) /

Dynamic SQL
DECLARE STR VARCHAR2(200); TN VARCHAR2(10):='ABC'; BEGIN STR:= 'CREATE TABLE '||TN||'(A NUMBER)'; DBMS_OUTPUT.PUT_LINE(STR); EXECUTE IMMEDIATE STR; END; /

S-ar putea să vă placă și