.


:




:

































 

 

 

 


4.




1. Insert. Insert , , ID_CRE DAT_CRE . 5- . , .

 

2.3 ר

 

. :

- ;

- ( DDL );

- ( DDL ).

. .

 

 

1. ?

2. . Cache?

3. ?

4. PL/SQL .

 

3

 

. PL/SQL. (Procedure) (Function).

3.3.1. PL/SQL

 

PL/SQL . . NUMBER, . Inventory. , Order_record. Order_record .

DECLARE

in_inventory NUMBER(5);

BEGIN

SELECT quantity INTO in_inventory FROM Inventory

WHERE product = ;

IF in_inventory > 0 THEN --

UPDATE Inventory SET quantity = quantity - 1

WHERE product = ' ';

INSERT INTO Order_record

VALUES (' ', SYSDATE);

ELSE

INSERT INTO Order_record

VALUES (' ', SYSDATE);

END IF;

COMMIT;

END;

PL/SQL SQL ORACLE . , , ( ) . , PL/SQL SQL .

 

 

PL/SQL , .. (, ), PL/SQL, , . . , PL/SQL , .

( ) . , . , .

, PL/SQL : , . ( PL/SQL , , .) .

 

[DECLARE -- ]

 

BEGIN

--
[EXCEPTION -- ]
END;

. , . . .

PL/SQL , . .

, .

 

 

PL/SQL SQL , . . , .

SQL, , , VARCHAR2, DATE. NUMBER, PL/SQL, BOOLEAN, BINARY INTEGER. , part_no 4- in_stock TRUE FALSE. :

 

part_no NUMBER(4);

in_stock BOOLEAN;

 

PL/SQL, RECORD TABLE.

. (:=), . , . :

 

tax:= price * tax_rate;

bonus:= current_salary * 0.10;

raise:= TO_NUMBER(SUBSTR('750 raise', 1, 3));

valid:= FALSE;

 

SELECT FETCH . ORACLE 10%, :

 

SELECT sal*0.10 INTO bonus FROM emp

WHERE empno=emp_id;

 

bonus .

, CONSTANT . . minimum_balance:

 

miniraura_balance CONSTANT REAL:= 10.00;

 

PL/SQL , , . , , .

%TYPE , . , , , . , , books title. my_title, , title, %TYPE :

 

my_title books.title%TYPE

 

_title %TYPE . title. title (, ), y_title .

PL/SQL . , . %ROWTYPE , . , ( ).

. , , dept_rec. , dept.

 

DECLARE

dept_rec dept%ROWTYPE;

...

 

, :

 

my_deptno:= dept_rec.deptno;

 

, , , %ROWTYPE , , :

 

DECLARE

CURSOR c1 IS SELECT ename, sal, hiredate, job FROM emp;

emp_rec c1%ROWTYPE;

 

FETCH cl INTO emp_rec; ename ename emp_rec, sal sal .. (. 3.1).

3.1

emp_rec
emp_rec.ename
emp_rec.sal 950.00
emp_rec.hiredate 03.12.2001
emp_rec.job

 

 

 

PL/SQL SQL. PL/SQL ORACLE, , , , IF-THEN-ELSE, FOR-LOOP, WHILE-LOOP, EXIT-WHEN GOTO. .

. IF-THEN-ELSE . IF ; THEN , , ; ELSE , , .

, . $500 3, , , . , ; .

DECLARE

acct_balance NUMBER(11, 2);

acct CONSTANT NUMBER(4):= 3;

debit_amt CONSTANT NUMBER(5,2):= 500.00;

BEGIN

SELECT bal INTO acct_balance FROM accounts

WHERE account_id = acct FOR UPDATE OF bal;

IF acct_balance >= debit_amt THEN

UPDATE accounts SET bal = bal - debit_amt

WHERE account_id = acct;

ELSE

INSERT INTO temp VALUES

(acct, acct_balance, 'Insufficient funds');

-- ,

END IF;

COMMIT;

END;

, , , . , , . , PL/SQL. .

 

 

LOOP . LOOP , END LOOP . , :

LOOP

--

END LOOP;

 

FOR-LOOP . , , .

. , FOR:

 

FOR i IN 1..order_qty LOOP

UPDATE sales SET custno = customer_id

WHERE snum = snum_seq.NEXTVAL; END LOOP;

 

WHILE-LOOP . . TRUE, , . FALSE NULL, , .

7902, $4000:

 

DECLARE

salary emp.sal%TYPE;

mgr_num emp.mgr%TYPE;

last_name emp.ename%TYPE;

starting_empno CONSTANT NUMBER(4):= 7902;

BEGIN

SELECT sal, ragr INTO salary, mgr_num FROM emp

WHERE empno = starting_empno;

WHILE salary < 4000 LOOP

SELECT sal, mgr, ename INTO salary, mgr_num, last_name FROM emp

WHERE empno = mgr num;

END LOOP;

INSERT INTO temp VALUES (NULL, salary, last_name);

COMMIT;

END;

 

EXIT-WHEN , . EXIT, WHEN. TRUE, . , total 25000:

 

LOOP

...

total = total + salary;

EXIT WHEN total > 25000;

-- ,

END LOOP;

--

 

GOTO . , , PL/SQL. GOTO , :

 

IF rating > 90 THEN

GOTO calc_raise; --

END IF;

...

calc_raise

IF job_title = 'SALESMAN' THEN --

raise:= commission * 0.25;

ELSE

raise:= salary * 0.10; END IF;

 

 

SQL ORACLE , SQL. PL/SQL, , SQL . : . PL/SQL SQL, , , . , , , . :

 

DECLARE

CURSOR cl IS

SELECT empno, ename, job FROM emp WHERE deptno = 20;

 

, , . , . . 3.1, . . :

SELECT empno, ename, job FROM emp WHERE deptno = 20;

 


. 3.1

 

- . , COBOL , , . PL/SQL , , , . , , .

. 3.2

 

. 3.2, OPEN, FETCH CLOSE.

OPEN , , . FETCH . CLOSE .

 

FOR

 

, , , FOR OPEN, FETCH CLOSE. FOR %ROWTYPE, , , . FOR _r , c1%ROWTYPE:

 

DECLARE

CURSOR c1 IS

SELECT ename, sal, hiredate, deptno FROM emp;

...

BEGIN

...

FOR emp_rec IN c1 LOOP

...

salary_total:= salary_total + emp_rec.sal;

END LOOP;

END;

 

, .

 

 

PL/SQL , . , , .. PL/SQL. , .

. , , ZERO-DIVIDE. RAISE.

 

DECLARE

salary NUBER(7,2);

commission NUMBER(7,2);

comm_missing EXCEPTION; --

BEGIN

SELECT sal, comm INTO salary, commission FROM emp

WHERE empno =:emp_id;

IF commission IS NULL THEN

RAISE comm_missing; --

ELSE

:bonus:= (salary * 0.05) + (commission * 0.15);

END IF;

EXCEPTION --

WHEN comm_missing THEN

--

END;

 

PL/SQL. , . , RAISE. , . ( commission). , , comm_missing.

, emp_id bonus , PL/SQL.

 

, . , , . PL/SQL . , PL/SQL , , .

PL/SQL , , (, , ). , , , , .

. 25% . . , ; .

 

PROCEDURE award_bonus (emp_id NUMBER) IS

bonus REAL;

comm_missing EXCEPTION;

BEGIN

SELECT comm * 0.25 INTO bonus FROM emp

WHERE empno = emp_id;

IF bonus IS NULL THEN

RAISE comm_missing;

ELSE

UPDATE payroll SET pay = pay + bonus

WHERE empno = emp_id;

END IF;

EXCEPTION

WHEN comm_missing THEN

...

END award_bonus;





:


: 2017-03-12; !; : 316 |


:

:

, , .
==> ...

1565 - | 1470 -


© 2015-2024 lektsii.org - -

: 0.127 .