Professional Documents
Culture Documents
An Introduction To PL/SQL: Team Rainbow & Wase
An Introduction To PL/SQL: Team Rainbow & Wase
Wipro Confidential 2
PL/SQL Program Constructs
Stored
Stored
Anonymous
Anonymous procedure/
procedure/
block
block
DECLARE function
function
BEGIN Application
Application
Application
Application procedure/
procedure/
trigger
trigger function
function
EXCEPTION
Database
END;
Database Package
trigger Package
trigger
Object
Object type
type
Wipro Confidential 3
Block Structure for Anonymous PL/SQL Blocks
DECLARE (optional)
Declare PL/SQL objects to be used within this block
BEGIN (mandatory)
Define the executable statements
EXCEPTION (optional)
Define the actions that take place if an error arises
END; (mandatory)
Wipro Confidential 4
Block Structure for PL/SQL Subprograms
Header
IS
Declaration section
BEGIN
Executable section
EXCEPTION (optional)
Exception section
END;
Wipro Confidential 5
Benefits of Subprograms
Improved maintenance
Improved performance
Wipro Confidential 6
Developing Procedures and Functions Using SQL*Plus
Wipro Confidential 7
Writing Control Structures
Wipro Confidential 8
Objectives
Wipro Confidential 9
Controlling PL/SQL Flow of Execution
Conditional IF statements:
IF-THEN-END IF
IF-THEN-ELSE-END IF
IF-THEN-ELSIF-END IF
Wipro Confidential 10
IF Statements
Syntax
IF
IF condition
condition THEN
THEN
statements;
statements;
[ELSIF
[ELSIF condition
condition THEN
THEN
statements;]
statements;]
[ELSE
[ELSE
statements;]
statements;]
END
END IF;
IF;
Simple IF Statement:
Set the manager ID to 22 if the employee name is Osborne.
IF
IF v_ename
v_ename == 'OSBORNE'
'OSBORNE' THEN
THEN
v_mgr
v_mgr :=
:= 22;
22;
END
END IF;
IF;
Wipro Confidential 11
Simple IF Statements
Set the job title to Salesman, the department number to 35, and
the commission to 20%of the current salary if the last name is
Miller.
Example
.. .. ..
IF
IF v_ename
v_ename == 'MILLER'
'MILLER' THEN
THEN
v_job
v_job :=
:= 'SALESMAN';
'SALESMAN';
v_deptno
v_deptno :=
:= 35;
35;
v_new_comm
v_new_comm :=
:= sal
sal ** 0.20;
0.20;
END
END IF;
IF;
.. .. ..
Wipro Confidential 12
IF-THEN-ELSE Statement Execution Flow
TRUE FALSE
IF Condition
THEN
THEN Actions
Actions ELSE
ELSE actions
actions
(including
(including further
further IFs)
IFs) (including
(including further
further IFs)
IFs)
Wipro Confidential 13
IF-THEN-ELSE Statements
Set a flag for orders where there are fewer than 5 days between
order date and ship date.
Example
...
...
IF
IF v_shipdate
v_shipdate -- v_orderdate
v_orderdate << 55 THEN
THEN
v_ship_flag
v_ship_flag :=
:= 'Acceptable';
'Acceptable';
ELSE
ELSE
v_ship_flag
v_ship_flag :=
:= 'Unacceptable';
'Unacceptable';
END
END IF;
IF;
...
...
Wipro Confidential 14
IF-THEN-ELSIF Statement Execution Flow
IF
IF Condition
Condition
TRUE FALSE
ELSIF
ELSIF
Condition
Condition
THEN
THEN Actions
Actions
TRUE FALSE
ELSE
ELSE
THEN
THEN Actions
Actions Actions
Actions
Wipro Confidential 15
IF-THEN-ELSIF Statements
Example
.. .. ..
IF
IF v_start
v_start >> 100
100 THEN
THEN
v_start
v_start :=
:= 22 ** v_start;
v_start;
ELSIF
ELSIF v_start
v_start >=
>= 50
50 THEN
THEN
v_start
v_start :=
:= .5
.5 ** v_start;
v_start;
ELSE
ELSE
v_start
v_start :=
:= .1
.1 ** v_start;
v_start;
END
END IF;
IF;
.. .. ..
Wipro Confidential 16
Building Logical Conditions
Wipro Confidential 17
Logic Tables
TRUE TRUE FALSE NULL TRUE TRUE TRUE TRUE TRUE FALSE
FALSE FALSE FALSE FALSE FALSE TRUE FALSE NULL FALSE TRUE
NULL NULL FALSE NULL NULL TRUE NULL NULL NULL NULL
Wipro Confidential 18
Boolean Conditions
v_flag
v_flag :=
:= v_reorder_flag
v_reorder_flag AND
AND v_available_flag;
v_available_flag;
Wipro Confidential 19
Iterative Control: LOOP Statements
Wipro Confidential 20
Basic Loop
Syntax
LOOP
LOOP -- delimiter
statement1;
statement1; -- statements
.. .. ..
EXIT -- EXIT statement
EXIT [WHEN
[WHEN condition];
condition];
END
END LOOP;
LOOP; -- delimiter
where:
where: condition
condition is
is aa Boolean
Boolean variable
variable or
or
expression
expression (TRUE,
(TRUE, FALSE,
FALSE,
or
or NULL);
NULL);
Wipro Confidential 21
Basic Loop
Example
DECLARE
DECLARE
v_ordid
v_ordid item.ordid%TYPE
item.ordid%TYPE :=:= 101;
101;
v_counter
v_counter NUMBER(2)
NUMBER(2) :=
:= 1;
1;
BEGIN
BEGIN
LOOP
LOOP
INSERT
INSERT INTO
INTO item(ordid,
item(ordid, itemid)
itemid)
VALUES(v_ordid,
VALUES(v_ordid, v_counter);
v_counter);
v_counter
v_counter :=
:= v_counter
v_counter ++ 1;
1;
EXIT
EXIT WHEN
WHEN v_counter
v_counter >> 10;
10;
END
END LOOP;
LOOP;
END;
END;
Wipro Confidential 22
FOR Loop
Syntax
FOR
FOR counter
counter in
in [REVERSE]
[REVERSE]
lower_bound..upper_bound
lower_bound..upper_bound LOOP
LOOP
statement1;
statement1;
statement2;
statement2;
.. .. ..
END
END LOOP;
LOOP;
Use a FOR loop to shortcut the test for the number of iterations.
Do not declare the index; it is declared implicitly.
Wipro Confidential 23
FOR Loop
Guidelines
Wipro Confidential 24
FOR Loop
Insert the first 10 new line items for order number 101.
Example
DECLARE
DECLARE
v_ordid
v_ordid item.ordid%TYPE
item.ordid%TYPE :=
:= 101;
101;
BEGIN
BEGIN
FOR
FOR ii IN
IN 1..10
1..10 LOOP
LOOP
INSERT
INSERT INTO
INTO item(ordid,
item(ordid, itemid)
itemid)
VALUES(v_ordid,
VALUES(v_ordid, i);
i);
END
END LOOP;
LOOP;
END;
END;
Wipro Confidential 25
WHILE Loop
Syntax
WHILE
WHILE condition
condition LOOP
LOOP Condition is
statement1;
statement1; evaluated at the
statement2;
statement2; beginning of
.. .. .. each iteration.
END
END LOOP;
LOOP;
Wipro Confidential 26
WHILE Loop
Example
ACCEPT
ACCEPT p_price
p_price PROMPT
PROMPT 'Enter
'Enter the
the price
price ofof the
the item:
item: ''
ACCEPT
ACCEPT p_itemtot
p_itemtot PROMPT
PROMPT 'Enter
'Enter the
the maximum
maximum total
total for
for
purchase
purchase of
of item:
item: ''
DECLARE
DECLARE
...
...
v_qty
v_qty NUMBER(8)
NUMBER(8) :=:= 1;
1;
v_running_total
v_running_total NUMBER(7,2)
NUMBER(7,2) :=:= 0;
0;
BEGIN
BEGIN
...
...
WHILE
WHILE v_running_total
v_running_total << &p_itemtot
&p_itemtot LOOP
LOOP
...
...
v_qty
v_qty :=
:= v_qty
v_qty ++ 1;
1;
v_running_total
v_running_total :=:= v_qty
v_qty ** &p_price;
&p_price;
END
END LOOP;
LOOP;
...
...
Wipro Confidential 27
Nested Loops and Labels
Wipro Confidential 28
Nested Loops and Labels
...
...
BEGIN
BEGIN
<<Outer_loop>>
<<Outer_loop>>
LOOP
LOOP
v_counter
v_counter :=
:= v_counter+1;
v_counter+1;
EXIT
EXIT WHEN
WHEN v_counter>10;
v_counter>10;
<<Inner_loop>>
<<Inner_loop>>
LOOP
LOOP
...
...
EXIT
EXIT Outer_loop
Outer_loop WHEN
WHEN total_done
total_done == 'YES';
'YES';
--
-- Leave
Leave both
both loops
loops
EXIT
EXIT WHEN
WHEN inner_done
inner_done == 'YES';
'YES';
--
-- Leave
Leave inner
inner loop
loop only
only
...
...
END
END LOOP
LOOP Inner_loop;
Inner_loop;
...
...
END
END LOOP
LOOP Outer_loop;
Outer_loop;
END;
END;
Wipro Confidential 29
Summary
Loops
Basic loop
FOR loop
WHILE loop
EXIT statement
Wipro Confidential 30
Writing Explicit Cursors
Wipro Confidential 31
Objectives
Wipro Confidential 32
About Cursors
Wipro Confidential 33
Explicit Cursor Functions
Result Set
Wipro Confidential 34
Controlling Explicit Cursors
No
Yes
DECLARE
DECLARE OPEN
OPEN FETCH
FETCH EMPTY? CLOSE
CLOSE
Wipro Confidential 35
Controlling Explicit Cursors
Cursor
Fetch a Row from the cursor.
Pointer
Cursor
Continue until empty.
Pointer
Cursor
Close the cursor.
Cursor
Wipro Confidential 36
Declaring the Cursor
Syntax
CURSOR
CURSOR cursor_name
cursor_name IS
IS
select_statement;
select_statement;
Wipro Confidential 37
Declaring the Cursor
Example
DECLARE
DECLARE
CURSOR
CURSOR c1
c1 IS
IS
SELECT
SELECT empno,
empno, ename
ename
FROM
FROM emp;
emp;
CURSOR
CURSOR c2
c2 IS
IS
SELECT
SELECT **
FROM
FROM dept
dept
WHERE
WHERE deptno
deptno == 10;
10;
BEGIN
BEGIN
...
...
Wipro Confidential 38
Opening the Cursor
Syntax
OPEN
OPEN cursor_name;
cursor_name;
Wipro Confidential 39
Fetching Data from the Cursor
Syntax
FETCH
FETCH cursor_name
cursor_name INTO
INTO [variable1,
[variable1, variable2,
variable2, ...]
...]
|| record_name];
record_name];
Wipro Confidential 40
Fetching Data from the Cursor
Examples
FETCH
FETCH c1
c1 INTO
INTO v_empno,
v_empno, v_ename;
v_ename;
...
...
OPEN
OPEN defined_cursor;
defined_cursor;
LOOP
LOOP
FETCH
FETCH defined_cursor
defined_cursor INTO
INTO defined_variables
defined_variables
EXIT
EXIT WHEN
WHEN ...;
...;
...
...
--
-- Process
Process the
the retrieved
retrieved data
data
...
...
END;
END;
Wipro Confidential 41
Closing the Cursor
Syntax
CLOSE
CLOSE cursor_name;
cursor_name;
Wipro Confidential 42
Explicit Cursor Attributes
Wipro Confidential 43
Controlling Multiple Fetches
Wipro Confidential 44
The %ISOPEN Attribute
Example
IF
IF NOT
NOT c1%ISOPEN
c1%ISOPEN THEN
THEN
OPEN
OPEN c1;
c1;
END
END IF;
IF;
LOOP
LOOP
FETCH
FETCH c1...
c1...
Wipro Confidential 45
The %NOTFOUND and %ROWCOUNT Attributes
Wipro Confidential 46
Cursors and Records
Example
...
...
CURSOR
CURSOR c1
c1 IS
IS
SELECT
SELECT empno,
empno, ename
ename
FROM
FROM emp;
emp;
emp_record
emp_record c1%ROWTYPE;
c1%ROWTYPE;
BEGIN
BEGIN
OPEN
OPEN c1;
c1;
.. .. ..
FETCH
FETCH c1
c1 INTO
INTO emp_record;
emp_record;
Wipro Confidential 47
Cursor FOR Loops
Syntax
FOR
FOR record_name
record_name IN
IN cursor_name
cursor_name LOOP
LOOP
statement1;
statement1;
statement2;
statement2;
.. .. ..
END
END LOOP;
LOOP;
Wipro Confidential 48
Cursor FOR Loops
Example
DECLARE
DECLARE
CURSOR
CURSOR c1 c1 IS
IS
SELECT
SELECT empno,
empno, ename
ename
FROM
FROM emp;
emp;
BEGIN
BEGIN
FOR
FOR emp_record
emp_record ININ c1
c1 LOOP
LOOP
--
-- implicit open and
implicit open and implicit
implicit fetch
fetch occur
occur
IF
IF emp_record.empno
emp_record.empno == 7839
7839 THEN
THEN
...
...
END
END LOOP;
LOOP; --
-- implicit
implicit close
close occurs
occurs
END;
END;
Wipro Confidential 49
Cursor FOR Loops Using Subqueries
BEGIN
BEGIN
FOR
FOR emp_record
emp_record IN
IN (( SELECT
SELECT empno,
empno, ename
ename
FROM
FROM emp)
emp) LOOP
LOOP
--
-- implicit
implicit open
open and
and implicit
implicit fetch
fetch occur
occur
IF
IF emp_record.empno
emp_record.empno == 7839
7839 THEN
THEN
...
...
END
END LOOP; --
LOOP; -- implicit
implicit close
close occurs
occurs
END;
END;
Wipro Confidential 50
Cursors - Using For Loops
declare
cursor c_emp is
select ename,sal,comm from emp;
total number;
begin
for emp_rec in c_emp loop
total := emp_rec.sal + emp_rec.comm;
dbms_output.put_line(c_emp%rowcount||' '||total);
exit when c_emp%notfound;
end loop;
end;
Wipro Confidential 51
Summary
Cursor types:
Wipro Confidential 52
Advanced Explicit Cursor Concepts
Wipro Confidential 53
Objectives
Wipro Confidential 54
Cursors with Parameters
Syntax
CURSOR
CURSOR cursor_name
cursor_name
[(parameter_name
[(parameter_name datatype,
datatype, ...)]
...)]
IS
IS
select_statement;
select_statement;
Wipro Confidential 55
Cursors with Parameters
Pass the department number and job title to the WHERE clause.
Example
DECLARE
DECLARE
CURSOR
CURSOR c1
c1
(v_deptno
(v_deptno NUMBER,
NUMBER, v_job
v_job VARCHAR2)
VARCHAR2) IS
IS
SELECT
SELECT empno,
empno, ename
ename
FROM
FROM emp
emp
WHERE
WHERE deptno
deptno == v_deptno
v_deptno
AND
AND job
job == v_job;
v_job;
BEGIN
BEGIN
OPEN
OPEN c1(10,
c1(10, 'CLERK');
'CLERK');
...
...
Wipro Confidential 56
The FOR UPDATE Clause
Syntax
SELECT
SELECT ...
...
FROM
FROM ...
...
FOR
FOR UPDATE
UPDATE [OF
[OF column_reference][NOWAIT]
column_reference][NOWAIT]
Wipro Confidential 57
Examples - ‘ FOR UPDATE ‘
Wipro Confidential 58
Examples - ‘ FOR UPDATE ‘
Wipro Confidential 59
Examples - ‘ FOR UPDATE ‘
SQL>COMMIT;
commit complete.
Wipro Confidential 60
Examples - ‘ FOR UPDATE ‘
14 rows updated.
SQL>
Wipro Confidential 61
Examples - ‘ FOR UPDATE - NOWAIT ‘
Wipro Confidential 62
Examples - ‘ FOR UPDATE - NOWAIT ‘
ERROR at line 1:
ORA-00054: resource busy and acquire with NOWAIT specified
Wipro Confidential 63
The FOR UPDATE Clause
DECLARE
DECLARE
CURSOR
CURSOR c1
c1 IS
IS
SELECT
SELECT empno,
empno, ename
ename
FROM
FROM emp
emp
FOR
FOR UPDATE
UPDATE NOWAIT;
NOWAIT;
Wipro Confidential 64
The WHERE CURRENT OF Clause
Syntax
WHERE
WHERE CURRENT
CURRENT OF
OF cursor
cursor
Wipro Confidential 65
The WHERE CURRENT OF Clause
Example
DECLARE
CURSOR c1 IS
SELECT ...
FOR UPDATE NOWAIT;
BEGIN
...
FOR emp_record IN c1 LOOP
UPDATE ...
WHERE CURRENT OF c1;
...
END LOOP;
COMMIT;
END;
Wipro Confidential 66
EXAMPLES - ‘ FOR UPDATE ‘ and ‘ WHERE CURRENT OF ‘
CLAUSE
Wipro Confidential 67
EXAMPLES - ‘ FOR UPDATE ‘ and ‘ WHERE CURRENT OF ‘
CLAUSE
Wipro Confidential 68
Cursors with Subqueries
Example
DECLARE
DECLARE
CURSOR
CURSOR my_cursor
my_cursor IS
IS
SELECT
SELECT t1.deptno,
t1.deptno, dname,
dname, STAFF
STAFF
FROM
FROM dept
dept t1,
t1, (SELECT
(SELECT deptno,
deptno,
count(*)
count(*) STAFF
STAFF
FROM
FROM emp
emp
GROUP
GROUP BY
BY deptno)
deptno) t2
t2
WHERE
WHERE t1.deptno
t1.deptno == t2.deptno
t2.deptno
AND
AND STAFF
STAFF >=
>= 5;
5;
Wipro Confidential 69
Summary
Wipro Confidential 70
Handling Exceptions
Wipro Confidential 71
Objectives
Wipro Confidential 72
Handling Exceptions with PL/SQL
What is an exception?
Identifier in PL/SQL that is raised during execution.
How is it raised?
An Oracle error occurs.
You raise it explicitly.
How do you handle it?
Trap it with a handler.
Propagate it to the calling environment.
Wipro Confidential 73
Handling Exceptions
BEGIN BEGIN
Exception Exception
is raised is raised
EXCEPTION EXCEPTION
Exception Exception is
is trapped END; END; not trapped
Exception
propagates to calling
environment
Wipro Confidential 74
Exception Types
Wipro Confidential 75
Trapping Exceptions
Syntax
EXCEPTION
EXCEPTION
WHEN
WHEN exception1
exception1 [OR
[OR exception2
exception2 .. .. .]
.] THEN
THEN
statement1;
statement1;
statement2;
statement2;
.. .. ..
[WHEN
[WHEN exception3
exception3 [OR
[OR exception4
exception4 .. .. .]
.] THEN
THEN
statement1;
statement1;
statement2;
statement2;
.. .. .]
.]
[WHEN
[WHEN OTHERS
OTHERS THEN
THEN
statement1;
statement1;
statement2;
statement2;
.. .. .]
.]
Wipro Confidential 76
Trapping Exceptions Guidelines
Wipro Confidential 77
Trapping Predefined Oracle Server Errors
Wipro Confidential 78
Predefined Exception
Syntax
BEGIN SELECT ... COMMIT;
EXCEPTION
WHEN NO_DATA_FOUND THEN
statement1;
statement2;
Wipro Confidential 79
When ‘no_data_found’- Examples
DECLARE
a number;
BEGIN
select sal into a from emp where deptno = 11;
dbms_output.put_line(a);
EXCEPTION
when no_data_found then
dbms_output.put_line('there is no department ‘);
END;
Wipro Confidential 80
When ‘to_many_rows’- Examples
DECLARE
a number;
BEGIN
select sal into a from emp;
dbms_output.put_line(a);
EXCEPTION
when too_many_rows then
dbms_output.put_line(’To Many Rows Selected');
END;
Wipro Confidential 81
When ‘zero_divide’- Examples
DECLARE
a number;
b number;
c number := 0;
BEGIN
select deptno into a from dept where deptno = 10;
b := a/c;
dbms_output.put_line(c);
EXCEPTION
when zero_divide then
dbms_output.put_line('Do Not Divide By Zero');
END;
Wipro Confidential 82
Trapping Non-Predefined Oracle Server Errors
Wipro Confidential 83
Non-Predefined Error
DECLARE
DECLARE
e_products_invalid
e_products_invalid EXCEPTION;
EXCEPTION; 1
e_products_invalid EXCEPTION;
PRAGMA
PRAGMA EXCEPTION_INIT
PRAGMA EXCEPTION_INIT
EXCEPTION_INIT (((
e_products_invalid, 2
e_products_invalid, -2292);
-2292);
v_message
v_message VARCHAR2(50);
VARCHAR2(50);
BEGIN
BEGIN
.. .. ..
EXCEPTION
EXCEPTION
WHEN e_products_invalid
WHEN e_products_invalid THEN
THEN 3
:g_message
:g_message :=
:= 'Product
'Product code
code
specified
specified is
is not
not valid.';
valid.';
.. .. ..
END;
END;
Wipro Confidential 84
Trapping Oracle Server Errors
DECLARE
a number;
b number;
c number := 0;
z_d exception;
pragma exception_init(z_d,-1476);
BEGIN
select deptno into a from dept where deptno = 10;
b := a/c;
dbms_output.put_line(c);
EXCEPTION
when z_d then
dbms_output.put_line('Do Not Divide By Zero');
END;
Wipro Confidential 85
Trapping User-Defined Exceptions
Wipro Confidential 86
User-Defined Exception
Example
[DECLARE]
[DECLARE]
e_amount_remaining
e_amount_remaining
e_amount_remaining EXCEPTION;
EXCEPTION;
EXCEPTION; 1
.. .. ..
BEGIN
BEGIN
.. .. ..
RAISE
RAISEe_amount_remaining;
RAISE e_amount_remaining;
e_amount_remaining;
.. .. .. 2
EXCEPTION
EXCEPTION
WHEN e_amount_remaining
WHEN e_amount_remaining
e_amount_remaining THEN
THEN
:g_message
:g_message :=
:= 'There
'There is
is still
still an
an amount
amount 3
in
in stock.';
stock.';
.. .. ..
END;
END;
Wipro Confidential 87
Examples - User Defined Exceptions
DECLARE
a number;
b number;
c number := 0;
z_d exception;
BEGIN
select deptno into a from dept where deptno = 10;
if c = 0 then raise z_d;
else b := a/c;
end if;
dbms_output.put_line(c);
EXCEPTION
when z_d then
dbms_output.put_line('Do Not Divide By Zero');
END;
Wipro Confidential 88
Functions for Trapping Exceptions
SQLCODE
Returns the numeric value for the error code
SQLERRM
Returns the message associated with the error
number
Wipro Confidential 89
Examples - SQLERRM
Wipro Confidential 90
Examples - SQLCODE
DECLARE
my_sqlcode NUMBER;
BEGIN
...
EXCEPTION
WHEN OTHERS THEN
my_sqlcode := SQLCODE;
INSERT INTO errors VALUES (my_sqlcode, ...);
END;
Wipro Confidential 91
Functions for Trapping Exceptions
Example
DECLARE
v_error_code NUMBER;
v_error_message VARCHAR2(255);
BEGIN
...
EXCEPTION
...
WHEN OTHERS THEN
ROLLBACK;
v_error_code := SQLCODE ;
v_error_message := SQLERRM ;
INSERT INTO errors VALUES(v_error_code,
v_error_message);
END;
Wipro Confidential 92
Propagating Exceptions
DECLARE
. . .
e_no_rows exception;
e_integrity exception;
PRAGMA EXCEPTION_INIT (e_integrity, -2292);
BEGIN
FOR c_record IN emp_cursor LOOP
BEGIN
SELECT ...
Sub-blocks can handle UPDATE ...
IF SQL%NOTFOUND THEN
an exception or pass RAISE e_no_rows;
the exception to the END IF;
EXCEPTION
enclosing block. WHEN e_integrity THEN ...
WHEN e_no_rows THEN ...
END;
END LOOP;
EXCEPTION
WHEN NO_DATA_FOUND THEN . . .
WHEN TOO_MANY_ROWS THEN . . .
END;
Wipro Confidential 93
RAISE_APPLICATION_ERROR
Syntax
raise_application_error
raise_application_error (error_number,
(error_number,
message[,
message[, {TRUE
{TRUE || FALSE}]);
FALSE}]);
Wipro Confidential 94
RAISE_APPLICATION_ERROR
Wipro Confidential 95
Summary
Exception types:
Predefined Oracle Server error
Non-predefined Oracle Server error
User-defined error
Trap exceptions
Handle exceptions:
Trap the exception within the PL/SQL block
Propagate the exception
Wipro Confidential 96
Creating Functions
Wipro Confidential
Working with Composite Data types
Wipro Confidential 98
Objectives
Wipro Confidential 99
Composite Datatypes
Types:
PL/SQL RECORDS
PL/SQL TABLES
Contain internal components
Are reusable
Syntax
TYPE
TYPE type_name
type_name IS
IS RECORD
RECORD
(field_declaration[,
(field_declaration[, field_declaration]…);
field_declaration]…);
identifier
identifier type_name;
type_name;
Example
...
...
TYPE
TYPE emp_record_type
emp_record_type IS
IS RECORD
RECORD
(ename
(ename VARCHAR2(10),
VARCHAR2(10),
job
job VARCHAR2(9),
VARCHAR2(9),
sal
sal NUMBER(7,2));
NUMBER(7,2));
emp_record
emp_record emp_record_type;
emp_record_type;
...
...
Example
Examples
Declare a variable to store the same information about a
department as it is stored in the DEPT table.
dept_record
dept_record dept%ROWTYPE;
dept%ROWTYPE;
emp_record
emp_record emp%ROWTYPE;
emp%ROWTYPE;
Syntax
TYPE
TYPE type_name
type_name IS
IS TABLE
TABLE OF
OF
{column_type
{column_type || variable%TYPE
variable%TYPE
|| table.column%TYPE}
table.column%TYPE} [NOT
[NOT NULL]
NULL]
[INDEX
[INDEX BY
BY BINARY_INTEGER];
BINARY_INTEGER];
identifier
identifier type_name;
type_name;
1 Jones
2 Smith
3 Maduro
... ...
BINARY_INTEGER Scalar
DECLARE
TYPE ename_table_type IS TABLE OF emp.ename%TYPE
INDEX BY BINARY_INTEGER;
TYPE hiredate_table_type IS TABLE OF DATE
INDEX BY BINARY_INTEGER;
ename_table ename_table_type;
hiredate_table hiredate_table_type;
BEGIN
ename_table(1) := 'CAMERON';
hiredate_table(8) := SYSDATE + 7;
IF ename_table.EXISTS(1) THEN
INSERT INTO ...
...
END;
Example
DECLARE
DECLARE
TYPE
TYPE dept_table_type
dept_table_type IS
IS TABLE
TABLE OF
OF dept%ROWTYPE
dept%ROWTYPE
INDEX
INDEX BY
BY BINARY_INTEGER;
BINARY_INTEGER;
dept_table
dept_table dept_table_type;
dept_table_type;
--
-- Each
Each element
element of
of dept_table
dept_table is
is aa record
record
Editor
Oracle Code
Procedure SQL*Plus Code
1 Builder
Save 2 SQL> START file.sql
p-code
Execute
Wipro Confidential 120
Creating a Stored Procedure Using SQL*Plus
Procedure
Calling IN parameter
environment OUT parameter
IN OUT parameter
(DECLARE)
BEGIN
EXCEPTION
END;
IN OUT IN OUT
Default Must be specified Must be specified
Value is Returned to calling Passed into
passed into environment subprogram;
subprogram returned to calling
environment
Formal parameter Uninitialized Initialized variable
acts as a constant variable
Actual parameter Must be a variable Must be a variable
can be a literal,
expression,
constant, or
initialized variable
7369 v_id
7654 v_id
MARTIN v_name
1250 v_salary
1400 v_comm
Positional
Named
Combination
SQL> BEGIN
2 add_dept;
3 add_dept ( 'TRAINING', 'NEW YORK');
4 add_dept ( v_loc => 'DALLAS', v_name =>'EDUCATION');
5 add_dept ( v_loc => 'BOSTON') ;
6 END;
7 /
PL/SQL procedure successfully completed.
DECLARE
v_id NUMBER := 7900;
BEGIN
raise_salary(v_id); --invoke procedure
COMMIT;
...
END;
Using SQL*Plus:
Syntax
DROP PROCEDURE procedure_name
Example
SQL> DROP PROCEDURE raise_salary;
Procedure dropped.
RETURN v_salary
Using SQL*Plus
Syntax
DROP FUNCTION function_name
Example
SQL> DROP FUNCTION get_sal;
Function dropped.
Procedure Function
Calling IN argument IN argument
Calling
Environment OUT argument Environment
IN OUT argument
(DECLARE) (DECLARE)
BEGIN BEGIN
EXCEPTION EXCEPTION
END; END;
Procedure Function
Execute as a PL/SQL Invoke as part of an
statement expression
No RETURN datatype Must contain a RETURN
datatype
Can return none, one Must return a single value
or many values
Improved performance
Improved maintenance
Improved data security and integrity
Modularity
Easier application design
Information hiding
Added functionality
Better performance
Overloading
1
Package Procedure A
specification declaration 2
4
Procedure B
definition 3
Package
body
Procedure A
definition 2
5
1
Package Procedure A
specification declaration 2
4
Procedure B
definition 3
Package
body
Procedure A
definition 2
5
Syntax
CREATE
CREATE [OR
[OR REPLACE]
REPLACE] PACKAGE
PACKAGE package_name
package_name
IS|AS
IS|AS
public
public type
type and
and item
item declarations
declarations
subprogram
subprogram specifications
specifications
END
END package_name;
package_name;
COMM_PACKAGE package
G_COMM 1
Package
specification
RESET_COMM
procedure 2
declaration
SQL>EXECUTE comm_package.g_comm := 5
SQL>EXECUTE comm_package.reset_comm(8)
Syntax
CREATE
CREATE [OR
[OR REPLACE]
REPLACE] PACKAGE
PACKAGE BODY
BODY package_name
package_name
IS|AS
IS|AS
private
private type
type and
and item
item declarations
declarations
subprogram
subprogram bodies
bodies
END
END package_name;
package_name;
COMM_PACKAGE package
Package G_COMM 1
specification
RESET_COMM 2
procedure declaration
VALIDATE_COMM
function definition 3
Package
body
RESET_COMM
procedure definition 2
17 PROCEDURE reset_comm
18 (v_comm IN NUMBER)
19 IS
20 BEGIN
21 IF validate_comm(v_comm)
22 THEN g_comm:=v_comm; --reset global variable
23 ELSE
24 RAISE_APPLICATION_ERROR
25 (-20210,'Invalid commission');
26 END IF;
27 END reset_comm;
28 END comm_package;
29 /
Example 1
CREATE OR REPLACE PACKAGE BODY comm_package IS
. . .
PROCEDURE reset_comm
(v_comm IN NUMBER)
IS
BEGIN
IF validate_comm(v_comm);
THEN g_comm := v_comm;
ELSE
RAISE_APPLICATION_ERROR
(-20210, 'Invalid commission');
END IF;
END reset_comm;
END comm_package;
Example 2
CREATE OR REPLACE PROCEDURE hire_emp
(v_ename IN emp.ename%TYPE,
v_mgr IN emp.mgr%TYPE,
v_job IN emp.job%TYPE,
v_sal IN emp.sal%TYPE)
IS
v_comm emp.comm%TYPE;
. . .
BEGIN
. . .
v_comm := comm_package.g_comm;
. . .
END hire_emp;
09:35 EXECUTE -
comm_package.reset_comm-
(170)
10:00 EXECUTE -
comm_package.reset_comm-
(4000)
11:00 ROLLBACK;
11:01 EXIT;
12:00 EXECUTE -
comm_package.reset_comm-
(150)
10 G_COMM 10
120 170
Invalid commission 4000 EXIT
120 10
150
Example
Command Task
Wipro Confidential
More Package Concepts
PROCEDURE calc_rating(. . .)
IS
BEGIN
. . .
END;
. . .
END forward_pack;
PROCEDURE reset_comm
. . .
END reset_comm;
BEGIN
SELECT AVG(comm)
INTO g_comm
FROM emp;
END comm_package;
DBMS_ALERT DBMS_JOB
DBMS_APPLICATION_INFO DBMS_LOCK
DBMS_DDL DBMS_OUTPUT
DBMS_DESCRIBE
DBMS_PIPE DBMS_TRANSACTION
DBMS_SESSION DBMS_UTILITY
DBMS_SHARED_POOL UTL_FILE
DBMS_SQL
Session 1 Session 2
DEMO_PIPE
Pack_message Receive_message
Send_message Unpack_message
UNPACK_MESSAGE
UNPACK_MESSAGE_RAW
UNPACK_MESSAGE_ROWID
NEXT_ITEM_TYPE
UNIQUE_SESSION_NAME
PURGE
DBMS_SQL allows:
Object names to be supplied at runtime rather than at
compilation time
DDL statements to be executed in PL/SQL
open_cursor
PARSE
Use bind No
variables?
Yes
bind_variable
Yes
query?
No
EXECUTE define_column
1 2
1 2
PL/SQL No
EXECUTE
block?
Yes
fetch_rows
variable_value
column_value
variable_value
close_cursor
COLUMN_VALUE
COLUMN_VALUE_CHAR
COLUMN_VALUE_RAW
COLUMN_VALUE_ROWID
VARIABLE_VALUE
VARIABLE_VALUE_CHAR
VARIABLE_VALUE_RAW
VARIABLE_VALUE_ROWID
IS_OPEN
CLOSE_CURSOR
LAST_ERROR_POSITION
LAST_ROW_COUNT
LAST_ROW_ID
LAST_SQL_FUNCTION_CODE
myreturn := DBMS_SQL.EXECUTE(mycursor);
LOOP
myreturn := DBMS_SQL.FETCH_ROWS(mycursor);
EXIT WHEN myreturn = 0;
DBMS_SQL.COLUMN_VALUE(mycursor,1,v_ename);
DBMS_SQL.COLUMN_VALUE(mycursor,2,v_sal);
IF v_row IS NULL
THEN v_row := v_ename||''||v_sal;
ELSE v_row := v_row||CHR(10)||v_ename||' '||v_sal;
END IF;
END LOOP;
DBMS_SQL.CLOSE_CURSOR(mycursor);
EXCEPTION
WHEN others
THEN err_code := SQLCODE;
err_msg := SUBSTR(SQLERRM,1,100);
RAISE_APPLICATION_ERROR ( -20202 ,
'Error number is: '||TO_CHAR(err_code) ||'
Full error is : '||err_msg);
END exec_select;
V_OUT1
--------------------------------------------------
BLAKE 2850
CLARK 2450
JONES 2975
Wipro Confidential
Creating Database Triggers
Triggering event:
What DML operation will cause the trigger to execute?
INSERT
UPDATE
DELETE
Any combination of the above
Trigger type:
Trigger body:
What action should the trigger perform?
The trigger body is defined with an anonymous PL/SQL
block.
[DECLARE]
BEGIN
[EXCEPTION]
END;
Example 1
SQL>
SQL> INSERT
INSERT INTO
INTO dept
dept (deptno,
(deptno, dname,
dname, loc)
loc)
22 VALUES
VALUES (50,
(50, 'EDUCATION',
'EDUCATION', 'NEW
'NEW YORK');
YORK');
Example 2
SQL>
SQL> UPDATE
UPDATE emp
emp
22 SET
SET sal
sal == sal
sal ** 1.1
1.1
33 WHERE
WHERE deptno
deptno == 30;
30;
CREATE
CREATE [OR
[OR REPLACE]
REPLACE] TRIGGER
TRIGGER trigger_name
trigger_name
timing
timing event1
event1 [OR
[OR event2
event2 OR
OR event3]
event3]
ON
ON table_name
table_name
PL/SQL
PL/SQL block;
block;
SQL>
SQL> CREATE
CREATE OR
OR REPLACE
REPLACE TRIGGER
TRIGGER secure_emp
secure_emp
22 BEFORE
BEFORE INSERT
INSERT ON
ON emp
emp
33 BEGIN
BEGIN
44 IF
IF (TO_CHAR
(TO_CHAR (sysdate,'DY')
(sysdate,'DY') ININ ('SAT','SUN'))
('SAT','SUN')) OR
OR
55 (TO_CHAR(sysdate,'HH24')
(TO_CHAR(sysdate,'HH24') NOT
NOT BETWEEN
BETWEEN
66 '08'
'08' AND
AND '18')
'18')
77 THEN
THEN RAISE_APPLICATION_ERROR
RAISE_APPLICATION_ERROR (-20500,
(-20500,
88 'You
'You may
may only
only insert
insert into
into EMP
EMP during
during normal
normal hours.');
hours.');
99 END
END IF;
IF;
10
10 END;
END;
11
11 //
SQL>
SQL> INSERT
INSERT INTO
INTO emp
emp (empno,
(empno, ename,
ename, deptno)
deptno)
22 VALUES
VALUES (7777,
(7777, 'BAUWENS',
'BAUWENS', 40);
40);
INSERT
INSERT INTO
INTO emp
emp (empno,
(empno, ename,
ename, deptno)
deptno)
**
ERROR
ERROR at
at line
line 1:
1:
ORA-20500:
ORA-20500: You
You may
may only
only insert
insert into
into EMP
EMP during
during normal
normal hours.
hours.
ORA-06512:
ORA-06512: at
at "SCOTT.SECURE_EMP",
"SCOTT.SECURE_EMP", line
line 44
ORA-04088:
ORA-04088: error
error during
during execution
execution of
of trigger
trigger
'SCOTT.SECURE_EMP'
'SCOTT.SECURE_EMP'
SQL>CREATE
SQL>CREATE OR OR REPLACE
REPLACE TRIGGER
TRIGGER check_salary_count
check_salary_count
22 AFTER
AFTER UPDATE
UPDATE OF
OF sal
sal ON
ON emp
emp
33 DECLARE
DECLARE
44 v_salary_changes
v_salary_changes NUMBER;
NUMBER;
55 v_max_changes
v_max_changes NUMBER;
NUMBER;
66 BEGIN
BEGIN
77 SELECT
SELECT upd,
upd, max_upd
max_upd
88 INTO
INTO v_salary_changes,
v_salary_changes, v_max_changes
v_max_changes
99 FROM
FROM audit_table
audit_table
10
10 WHERE
WHERE user_name
user_name == user
user
11
11 AND
AND tablename
tablename == 'EMP'
'EMP'
12
12 AND
AND column_name
column_name == 'SAL';
'SAL';
13
13 IF
IF v_salary_changes
v_salary_changes >> v_max_changes
v_max_changes THEN
THEN
14
14 RAISE_APPLICATION_ERROR
RAISE_APPLICATION_ERROR (-20501,
(-20501,
15
15 'You
'You may only make a maximum of
may only make a maximum of '||
'||
16
16 TO_CHAR
TO_CHAR (v_max_changes)
(v_max_changes) ||||
17
17 '' changes
changes to
to the
the SAL
SAL column');
column');
18
18 END
END IF;
IF;
19
19 END;
END;
20
20 //
Continuation
MAX_INS MAX_UPD MAX_DEL
5 5 5
5
5 0 0
CREATE
CREATE [OR
[OR REPLACE]
REPLACE] TRIGGER
TRIGGER trigger_name
trigger_name
timing
timing event1
event1 [OR
[OR event2
event2 OROR event3]
event3]
ON
ON table_name
table_name
[REFERENCING
[REFERENCING OLD
OLD AS
AS old
old || NEW
NEW AS
AS new]
new]
FOR
FOR EACH
EACH ROW
ROW
[WHEN
[WHEN condition]
condition]
PL/SQL
PL/SQL block;
block;
Continuation
OLD_TITLE NEW_TITLE OLD_SALARY NEW_SALARY
NULL ANALYST NULL 3500
Triggers Procedure
To remove a trigger from the database, use the DROP TRIGGER
syntax:
DROP
DROP TRIGGER
TRIGGER trigger_name
trigger_name
• Example
SQL>
SQL> DROP
DROP TRIGGER
TRIGGER secure_emp;
secure_emp;
Trigger
Trigger dropped
dropped
Triggering event
SQL>
SQL> UPDATE
UPDATE dept
dept
Trigger action
22 SET
SET id
id == 11
33 WHERE
WHERE id
id == 30;
30;
SQL>
SQL> CREATE
CREATE OR
OR REPLACE
REPLACE TRIGGER
TRIGGER cascade_updates
cascade_updates
22 AFTER
AFTER UPDATE
UPDATE OF
OF deptno
deptno on
on DEPT
DEPT
33 FOR
FOR EACH
EACH ROW
ROW
44 BEGIN
BEGIN
55 UPDATE
UPDATE emp
emp
66 SET
SET emp.deptno
emp.deptno == :new.deptno
:new.deptno
77 WHERE
WHERE emp.deptno
emp.deptno == :old.deptno;
:old.deptno;
88 END;
END;
99 //
SQL>
SQL> UPDATE
UPDATE dept
dept
22 SET
SET deptno
deptno == 11
33 WHERE
WHERE deptno
deptno == 30;
30;
**
ERROR
ERROR at
at line
line 1:
1:
ORA-04091:
ORA-04091: table
table DEPT
DEPT is is mutating,
mutating, trigger/function
trigger/function
may
may not
not see
see it
it
ORA-06512:
ORA-06512: at
at "CASCADE_UPDATES",
"CASCADE_UPDATES", line
line 22
ORA-04088:
ORA-04088: error
error during
during execution
execution of
of trigger
trigger
'CASCADE_UPDATES'
'CASCADE_UPDATES'
SQL>
SQL> UPDATE
UPDATE emp
emp
22 SET
SET sal
sal == 1500
1500
33 WHERE
WHERE ename
ename == 'SMITH';
'SMITH';
Failure CHECK_SALARY
EMP table trigger
EMPNO ENAME JOB SAL
7369 SMITH CLERK 1500
7698 BLAKE MANAGER 2850
7788 SCOTT ANALYST 3000
BEFORE
Trigged table/
UPDATE
mutating table
row
Trigger event
SQL>
SQL> CREATE
CREATE OR
OR REPLACE
REPLACE TRIGGER
TRIGGER check_salary
check_salary
22 BEFORE
BEFORE INSERT
INSERT OROR UPDATE
UPDATE OF
OF sal,
sal, job
job ON
ON emp
emp
33 FOR
FOR EACH
EACH ROW
ROW
44 WHEN
WHEN (new.job
(new.job <><> 'PRESIDENT')
'PRESIDENT')
55 DECLARE
DECLARE
66 v_minsalary
v_minsalary emp.sal%TYPE;
emp.sal%TYPE;
77 v_maxsalary
v_maxsalary emp.sal%TYPE;
emp.sal%TYPE;
88 BEGIN
BEGIN
99 SELECT
SELECT MIN(sal),
MIN(sal), MAX(sal)
MAX(sal)
10
10 INTO
INTO v_minsalary,
v_minsalary, v_maxsalary
v_maxsalary
11
11 FROM
FROM emp
emp
12
12 WHERE
WHERE jobjob == :new.job;
:new.job;
13
13 IF
IF :new.sal
:new.sal << v_minsalary
v_minsalary OR
OR
14
14 :new.sal
:new.sal >> v_maxsalary
v_maxsalary THEN
THEN
15
15 RAISE_APPLICATION_ERROR(-20505,'Out
RAISE_APPLICATION_ERROR(-20505,'Out of of range');
range');
16
16 END
END IF;
IF;
17
17 END;
END;
18
18 //
SQL>
SQL> UPDATE
UPDATE emp
emp
22 SET
SET sal
sal == 1500
1500
33 WHERE
WHERE ename
ename == 'SMITH';
'SMITH';
**
ERROR
ERROR at
at line
line 2:
2:
ORA-04091:
ORA-04091: table
table EMP
EMP is
is mutating,
mutating, trigger/function
trigger/function
may
may not
not see
see it
it
ORA-06512:
ORA-06512: at
at "CHECK_SALARY",
"CHECK_SALARY", line
line 55
ORA-04088:
ORA-04088: error
error during
during execution
execution of
of trigger
trigger
'CHECK_SALARY'
'CHECK_SALARY'
Security
Auditing
Data integrity
Referential integrity
Table replication
Derived data
Event logging
Wipro Confidential
Managing Subprograms
System privileges
CREATE (ANY) PROCEDURE
TRIGGER
ALTER ANY PROCEDURE
TRIGGER
DROP ANY PROCEDURE
DBA grants TRIGGER
EXECUTE ANY PROCEDURE
Object privilege
Owner grants EXECUTE
EXECUTE
DIRECT ACCESS
SQL>
SQL> GRANT
GRANT select
select
22 ON
ON emp
emp
33 TO
TO scott;
scott;
Grant
Grant Succeeded.
Succeeded.
INDIRECT ACCESS
SQL>
SQL> GRANT
GRANT execute
execute
22 ON
ON query_emp
query_emp
33 TO
TO green;
green;
Grant
Grant Succeeded.
Succeeded.
Data dictionary
General
Source code
information
Editor
Parameters p-code
Procedure Builder
View/
Procedure procedure Table
xxxxxxxxxxxxxx
vvvvvvvvvvvvvv
xxxxxxxxxxxxxx
Direct Direct
vvvvvvvvvvvvvv
xxxxxxxxxxxxxx dependency dependency
vvvvvvvvvvvvvv
xxxxxxxxxxxxxx
vvvvvvvvvvvvvv
xxxxxxxxxxxxxx
vvvvvvvvvvvvvv Referenced
Dependent
Local references
xxxxxxxxxxxxxxxxxxxxx
vvvvvvvvvvvvvvvvvvvvv
REDUCE_SAL vvvvvvvvvvvvvvvvv
vvvvvvvvvvvvvvvvvvvvv
vvvvvvvvvvvvvvvvvvvvv
procedure vvvvvvxxxxxxxxxxxxxxx
xxxxxxxxxxxxxxxxxxxxx
vvvvvvvvvvvvvvvvvvvvv
RAISE_SAL
procedure xxxxxxxxxxxxxxxxxxxxx
vvvvvvvvvvvvvvvvvvvvv
vvvvvvvvvvvvvvvvv
EMP table
vvvvvvvvvvvvvvvvvvvvv
vvvvvvvvvvvvvvvvvvvvv
vvvvvvxxxxxxxxxxxxxxx
xxxxxxxxxxxxxxxxxxxxx
vvvvvvvvvvvvvvvvvvvvv
EMPNO ENAME HIREDATE JOB
7839 KING 07-NOV-81 PRESIDENT
7698 BLAKE 01-MAY-81 MANAGER
7782 CLARK 09-JUN-81 MANAGER
7566 JONES 02-APR-81 MANAGER
X
vvvvvvvvvvvvvvvvv 7698 BLAKE 01-MAY-81 MANAGER
vvvvvvvvvvvvvvvvvvvvv
vvvvvvvvvvvvvvvvvvvvv 7782 CLARK 09-JUN-81 MANAGER
vvvvvvxxxxxxxxxxxxxxx
xxxxxxxxxxxxxxxxxxxxx 7566 JONES 02-APR-81 MANAGER
vvvvvvvvvvvvvvvvvvvvv
EMP
table
EMPNO ENAME HIREDATE JOB
7839 KING 17-NOV-81 PRESIDENT
7698 BLAKE 01-MAY-81 MANAGER
7782 CLARK 09-JUN-81 MANAGER
7566 JONES 02-APR-81 MANAGER
Setting REMOTE_DEPENDENCIES_MODE
As an init.ora parameter
REMOTE_DEPENDENCIES_MODE = value
At system level
ALTER SYSTEM SET REMOTE_DEPENDENCIES_MODE = value
At session level
ALTER SESSION SET REMOTE_DEPENDENCIES_MODE = value
Network Definition
change
Remote procedure B
Compiles
Valid
Valid Valid
Timestamp
comparison
Timestamp Timestamp Timestamp
of A of B of B
Execute B
Valid Valid
Timestamp
comparison
Timestamp Timestamp Timestamp
of A of B of B
ERROR
ALTER
ALTER PROCEDURE
PROCEDURE [SCHEMA.]
[SCHEMA.] procedure_name
procedure_name COMPILE
COMPILE
ALTER
ALTER FUNCTION
FUNCTION [SCHEMA.]
[SCHEMA.] function_name
function_name COMPILE
COMPILE
ALTER
ALTER PACKAGE
PACKAGE [SCHEMA.]
[SCHEMA.] package_name
package_name COMPILE
COMPILE PACKAGE
PACKAGE
ALTER
ALTER PACKAGE
PACKAGE [SCHEMA.]
[SCHEMA.] package_name
package_name COMPILE
COMPILE BODY
BODY
ALTER
ALTER TRIGGER
TRIGGER trigger_name
trigger_name [ENABLE|DISABLE|COMPILE[DEBUG]]
[ENABLE|DISABLE|COMPILE[DEBUG]]
Package specification
Standalone
Procedure A Valid
procedure declaration
Valid
Package body
Procedure A
definition
Definition changed
Package specification
Procedure A Valid
declaration
Package body
Invalid
Standalone Procedure A
definition
procedure
Definition
changed
1. Enable SERVEROUTPUT
SQL>
SQL> SET
SET SERVEROUTPUT
SERVEROUTPUT ON
ON
2.
2. Put
Put text
text into
into the
the buffer
buffer
SQL>
SQL> EXECUTE
EXECUTE DBMS_OUTPUT.PUT
DBMS_OUTPUT.PUT ('testing
('testing 11 22 33 ')
')
PL/SQL
PL/SQL procedure
procedure successfully
successfully completed.
completed
completed.
completed
3.
3. Display
Display from
from the
the buffer
buffer
SQL>
SQL> EXECUTE
EXECUTE DBMS_OUTPUT.NEW_LINE
DBMS_OUTPUT.NEW_LINE
testing
testing 11 22 33
PL/SQL
PL/SQL procedure
procedure successfully
successfully completed.
completed.
or
or put
put text
text into
into the
the buffer
buffer and
and display
display
SQL>
SQL> EXECUTE
EXECUTE DBMS_OUTPUT.PUT_LINE('Another
DBMS_OUTPUT.PUT_LINE('Another test
test 44 55 6')
6')
testing
testing 11 22 33 Another
Another test
test 44 55 66
PL/SQL
PL/SQL procedure
procedure successfully
successfully completed.
completed.
USER_SOURCE
System table
Source
code
Compile USER_ERRORS
Compile System table
p-code
errors
Execute
Debug
information
Ship
CheckStatus
Attribute order_no
Cancel
cust_info
line_items
Method amount
Hold
Specification
Body
Private
implementation
Method bodies
Syntax
CREATE
CREATE [OR [OR REPLACE]
REPLACE] TYPE
TYPE type_name
type_name IS|AS
IS|AS OBJECT
OBJECT
(attribute1
(attribute1 datatype,
datatype,
attribute2
attribute2 datatype,
datatype,
.. .. ..
[MEMBER
[MEMBER procedure1|function1
procedure1|function1 spec,
spec,
MEMBER
MEMBER procedure2|function2
procedure2|function2 spec,
spec,
.. .. ..
[PRAGMA
[PRAGMA RESTRICT_REFERENCES
RESTRICT_REFERENCES
(procedure1|function1,
(procedure1|function1, WNDSWNDS [,
[, RNDS,
RNDS, WNPS,
WNPS, RNPS])
RNPS])
.. .. .. ]]
]]
)[;]
)[;]
Syntax
CREATE
CREATE [OR
[OR REPLACE]
REPLACE] TYPE
TYPE BODY
BODY type_name
type_name IS|AS
IS|AS
[MEMBER
[MEMBER procedure1|function1
procedure1|function1 body,
body,
procedure2|function2
procedure2|function2 body,
body,
.. .. .];
.];
DECLARE
v_new_tv tv_type := tv_type('WEB tv', 32);
v_alt_tv tv_type;
BEGIN
v_alt_tv := tv_type('Big Screen', 72);
END;
SQL> SELECT *
2 FROM person_tab;
SQL> SELECT *
2 FROM person_tab p
3 WHERE p.name.f_name like '%ll%';
Wipro Confidential
Thank you