Documente Academic
Documente Profesional
Documente Cultură
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; /
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; /
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; /
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
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; /
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; /