Академический Документы
Профессиональный Документы
Культура Документы
Oracle9i.programare in PL - SQL
Oracle9i.programare in PL - SQL
OSBORNE
PL/SQL
) PL/SQL
OFFICIAL AUTHORIZED
Oracle Press
ONLY
F R O M O S li R N 1-
ORACLG
Oracle Press
Oracle9/ PL/SQL
Programming
Scott Urman
McGraw-Hill/Osborne
New York Chicago San Francisco
Lisbon London Madrid Mexico City Milan
New Delhi San Juan Seoul Singapore Sydney Toronto
Oracle?/
PL/SQL
""
OracleQ PL/SQL
Programming
Scott Urman
Copyright 2002
All rights reserved
Oracle 9
PL/SQL
.
.
.
.
Copyright 2002 by The McGraw-Hill Companies. All rights reserved.
McGraw-Hill/Osborne
2600 Tenht Street
Berkeley, California 94710
U.S.A.
ISBN 0-07-219147-3
"", 2004
. N : OAI (03)
N : 070612 30.09.97 .
ISBN 5-85582-225-7
15.09.2004 70x100/16
N1 -
.. 34 1500 N f9/
""
123100, , ., . 13/6, . 1 (. )
: (095)256-02-83
: (95)259-01-62
WWW.LORY-PRESS.RU
PL/SQL
Oracle. JSP Oracle Text,
JDBC, PL/SQL OCI. , Oracle,
Oracle. , . "OracleS PL/SQL
Programming" "OracleSi Advanced PL/SQL Programming".
, , . .
.
.
, .
, Osborne,
. , ,
, .
Scott.Urman@oracle.com.
.
.
Oracle .
, , .
Oracle , , Oracle , .
PL/SQL ,' ""
Oracle, "", .. . PL/SQL .
, PL/SQL ("Oracle PL/SQL Programming", 1996 .), PL/SQL 2.3 Oracle? Release 7.3, PL/SQL.
("OracleS PL/SQL Programming", 1997 .) , , OracleS Release
8.0. ("OracleSz Advanced PL/SQL Programming")
2000 . ,
PL/SQL.
, 19. "OracleS i Advanced PL/SQL Programming"
PL/SQL.
? ,
19. , 3
CASE ( 19) PL/SQL. .
PL/SQL. , ,
PL/SQL .
12, "OracleS . PL/SQL" (. "").
12 3 . : " ", " PL/SQL" " PL/SQL".
viii
I.
PL/SQL , . PL/SQL.
1. PL/SQL
PL/SQL . , PL/SQL
, . ,
.
2.
PL/SQL ,
.
PL/SQL, . .
II. PL/SQL
PL/SQL, , , SQL,
SQL, , .
3. PL/SQL
.
, PL/SQL, .
4. SQL PL/SQL
PL/SQL . SQL - .
SQL DML,
.
5. SQL
SQL , .
6.
.
. . , .
ix
7.
, . PL/SQL
( Java),
. , , .
8.
PL/SQL.
,
(varray).
. 6 , ,
.
Hi. PL/SQL
, , , PL/SQL.
9. ,
( ) PL/SQL ,
, .
.
10. ,
10 . SQL-
. .
11.
PL/SQL,
: DML-onepa, INSERT, DDL-, .
DDL. .
12.
PL/SQL: , SQL, LOB
.
: DBMS_ALERT, DBMS_JOB, DBMS_LOB,
DBMS_PIPE, DBMS_SQL UTL_FILE.
PL/SQL.
.
, Oracle PL/SQL.
. PL/SQL
, PL/SQL.
PL/SQL.
.
,
, PL/SQL.
1 PL/SQL
PL/SQL Oracle
Oracle
2
SQL'Plus
Rapid SQL
SQL Navigator . . . .'
TOAD
SQL-Programmer
PL/SQL Developer
II
PL/SQL
3 PL/SQL
LOB
%TYPE
IF-THEN-ELSE
CASE. .
'
7
7
8
9
9
10
10
11
12
13
13
15
16
25
26
31
32
33
39
47
52
56
59
63
65
67
73
76
78
79
81
83
84
85
94
95
95
95
95
97
99
102
102
106
110
xii
GOTO
%ROWTYPE
4 SQL PL/SQL
SQL PL/SQL
SQL
SELECT
INSERT
UPDATE
DELETE
WHERE
RETURNING
CURRVAL NEXTVAL
LEVEL '
ROWID
ROWNUM
GRANT REVOKE
. . . . .
COMMIT ROLLBACK
5 SQL
SUBSTR, SUBSTRB, SUBSTRC, SUBSTR2 SUBSTR4
SOUNDEX
INSTR, INSTRB, INSTRC, INSTR2 INSTR4
LENGTH, LENGTHS, LENGTHC, LENGTH2 LENGTH4
WIDTH.BUCKET
-
CHAR ( -)
TO~CHAR ()
DATE
NUMBER
TIMESTAMPnTO TIMESTAMPJZ
DUMP
ISERENV
6
114
117
120
122
123
125
126
126
127
127
'
......
129
131
.132
134
136
138
138
139
142
144
145
146
147
147
149
149
149
150
152
153
155
156
157
158
163
167
168
170
171
176
179
183
185
187
187
188
193
194
197
199
207
xiii
WHILE
FOR
NO DATA FOUND %NOTFOUND
SELECT FOR UPDATE
209
211
212
213
214
219
220
221
222
222
'224
226
. 227
230
234
236
EXCEPTION INIT
242
RAISE_APPLICATION_ERROR
243
,
246
,
249
, . . . . 251
253
254
255
265
EXISTS
COUNT
LIMIT
FIRST LAST
NEXT PRIOR
EXTEND
TRIM
DELETE
267
271
274
277
278
280
285
290
297
299
300
300
300
301
304
306
III PL/SQL
9 ,
.
CALL. .
.
309
311
313
318
337
340
340
xiy
10 ,
KEEP
UNKEEP .
SIZES
ABORTED_REQUEST_THRESHOLD
11
DML
, . .
342
344
347
350
353
354
.357
362
363
374
380
390
398
402
402
403
403
405
410
420
426
432
437
441
442
12
447
SQL
DBMS SQL
DBMS PIPE
DBMS ALERT
UTL TCP
UTL SMTP
UTL HTTP
UTL INADDR
DBMS JOB
DBMSJ.OB
448
451
456
463
468
470
472
473
474
477
477
478
479
479
480
IV
485
. . 487
DBMS ALERT
DBMS APPLICATION INFO
DBMS AQ
DBMS AQADM
DMBS AQELM
DBMS BACKUP RESTORE .
488
488
489
489
489
. 489
DBMS DDL
DBMS DEBUG
DBMS DEFER
DBMS DEFER QUERY
DBMS DEFER SYS
DBMS DESCRIBE
DBMS DISTRIBUTED TRUST.ADMIN
DBMS FGA
DBMS FLASHBACK
DBMS HS
DBMS HS PASSTHROUGH
DBMS'lOf
DBMS~JAVA
DBMS JOB
DBMS LDAP
DBMS LIBCACHE
DBMS'LOB
DBMS LOCK
DBMSJ.OGMNR
DBMS LOGMNR CDC PUBLISH
DBMS LOGMNR CDC SUBSCRIBE
DBMS LOGMNR_D
DBMS METADATA
xv
489
490
490
490
490
491
491
491
491
492
492
492
492
492
493
493
493
493
494
494
494
494
494
494
495
DBMS'OFFLINE OG
DBMS OFFLINE SNAPSHOT
DBMS OLAP
DBMS ORACLE TRACE AGENT
DBMS ORACLE TRACE USER
495
495
495
496
496
DBMS ODCI
495
DBMS'OUTLN "...".
496
DBMS PIPE
DBMS'PROFILER
497
.497
DBMS'RANDOM
DBMS'RECITIFIER DIFF
DBMS REDIFINITION
DBMS REFRESH
496
496
496
497
497
497
498
DBMS REPAIR'
DBMS REPCAT, DBMS REPCAT ADMIN, DBMS REPCAT INSTANTIATE,
DBMS REPCAT RGTuDBMS REPUTIL
DBMS RESOURCE MANAGER
DBMS RESOURCE MANAGER PRIVS
498
DBMS'RLS
499
DBMS RESUMABLE
DBMSlROWID
DBMS_SESSION
DBMS SHARED POOL
DBMS SPACE DBMS SPACE ADMIN
DBMS SQL
498
498
499
499
499
499
500
500
xvi
DBMS'TYPES
DBMS UTILITY
500
500
500
501
501
501
501
DBMS WM
DBMS'XMLQUERY, DBMS XMLSAVE XMLGEN
DEBUG EXTPROC. . . . 7
SDO CS, SDO GEOM, SDE LRS, SDO MIGRATE SDO TUNE . . . . . .
UTL COLL
"
"
UUENCODE
'
UTL FILE
UTL HTTP
501
501
502
502
502
502
502
503
UTLRAW
UTL_REF
UTL.SMTP
UTL TCP
UTLJJRL
503
503
503
504
504
UTL'INADDR
UTL'PG
PL/SQL
,
, LOB,
OracleS/ 19/
, .
,
,
sos
sos
505
509
510
511
511
512
514
515
518
519
521
522
524
525
526
527
527
1
PL/SQL
L/SQL ,
Oracle . PL/SQL
, PL/SQL
. Oracle. PL/SQL ,
. PL/SQL, . ,
.
PL/SQL
Oracle . , ,
(SQL, Structured Query Language; ""). SQL ,
. , SQL-
(students),
(major) (nutrition):
[_J DELETE FROM students
WHERE major = 'Nutrition';
(, , s t u d e n t s ,
.)
SQL . , , , , .
DELETE () ,
, . , , , , ,
.
, COBOL, . ,
(3GL, third generation language), . , DELETE :
)
LOOP ( )
IF () major = 'Nutrition' THEN ()
DELETE () ;
END IF ( );
END LOOP ( );
PL/SQL
- , C++
Java, . - , .
. , SQL, ,
( )
. , , . 3GL
. PL/SQL,
SQL ( 4GL)
3GL.
PL/SQL Procedural Language/SQL ( /SQL).
, PL/SQL SQL,
, :
( ,
)
,
(OracleS )
Oracle SQL, .
, . , .
PL/SQL:
) - 3gl_4gl.sql
DECLARE
/* , SQL- */
v_NewMajor VARCHAR2(10) := 'History';
v_FirstName VARCHAR2(10) := 'Scott';
v_LastName VARCHAR2(10) := 'Urman';
BEGIN
/* students */
UPDATE students
SET major = v_NewMajor
WHERE first_name = v_FirstName
AND last_name = v_LastName;
/* , . , . */
IF SQL%NOTFOUND THEN
INSERT INTO students (ID, first_name, last_name, major)
VALUES (student_sequence.NEXTVAL, v_FirstName, v_LastNatne,
v_NewMajor);
END IF;
END;
,
,
( students
student_sequence).
tables, sql, ""
: www. lory-press, ru.
" ".
PL/SQL
/ .
/
.
Oracle
SQL
SQL
Oracle
SQL
SQL
PL/SQL
. 1.1. PL/SQL /
PL/SQL
SQL,
, SQL- (.
. 1.1). SQL-
PL/SQL (.
. 1.1). ,
.
, . SQL- ,
.
PL/SQL
. ( HTML-) ,
.
PL/SQL (. 2).
PL/SQL
PL/SQL . .
PL/SQL (block).
PL/SQL , .
, , . :
Q DECLARE
/* - , ,
PL/SQL. */
BEGIN
/* - SQL-.
. */
EXCEPTION
/* -
. */
END;
. .
PL/SQL
.
PL/SQL Ada. , Ada, PL/SQL.
. Ada , , .
,
. ,
,
. PL/SQL,
, , ,
:
Q -- Error.sql
DECLARE
v_ErrorCode NUMBER;
v_ErrorMsg VARCHAR2(200);
v_Currentllser VARCHAR2(8);
v_Information VARCHAR2(100);
BEGIN
/* */
EXCEPTION
WHEN OTHERS THEN
-
- .
v_ErrorCode := SQLCODE;
v_ErrorMsg := SQLERRM;
v_CurrentUser := USER;
v_Information := ' Error encountered on ' ||
TO_CHAR(SYSDATE) || ' by database user ' || v_CurrentUser;
- log_table.
INSERT INTO log_table (code, message, info)
VALUES (v_ErrorCode, v_ErrorMsg, v_Information);
END;
, ,
,
(. " ").
PL/SQL
PL/SQL
. (variable) , . v _ C u r r e n t l l s e r , v _ E r r o r C o d e v _ I n f o r m a t i o n .
.
(type). , . PL/SQL
, :
Q DECLARE
v_StudentName
VARCHAR2(20);
v_CurrentDate DATE;
v_NumberCredits NUMBER(3);
- :
[_J
DECLARE
v_LoopCounter BINARY_INTEGER;
v_CurrentlyRegistered BOOLEAN;
PL/SQL , : .
, :
)
DECLARE
PL/SQL .
. IF. ,
tempjtable:
Q Conditional.sql
DECLARE
v_TotalStudents NUMBER;
BEGIN
-
SELECT COUNT(*)
INTO v_TotalStudents
FROM students;
10
1
- temp_table
IF v_TotalStudents = THEN
INSERT INTO temp.table (char_col)
VALUESC ');
ELSEIF v_TotalStudents < 5 THEN
INSERT INTO tempjtable (char_col)
VALUESC' ');
ELSEIF v_TotalStudents < 10 THEN
INSERT INTO temp_table (char_col)
VALUES(' ');
ELSE
INSERT INTO temp_table (char_col)
VALUES(' ');
END IF;
END;
PL/SQL . (loop) . ,
1 50 temp_table:
Q Simple Loop, sql
DECLARE
v_LoopCounter BINARY_INTEGER := 1;
BEGIN
LOOP
INSERT INTO temp_table (num_col)
VALUES (v_LoopCounter);
v_LoopCounter := v_LoopCounter + 1;
EXIT WHEN v_LoopCounter > 50;
END LOOP;
END;
FOR. . , , :
)
NumericLoop.sql
BEGIN
FOR v_LoopCounter IN 1..50 LOOP
INSERT INTO temp_table (num_col)
VALUES (v_LoopCounter);
END LOOP;
END;
(cursor) ,
SELECT ().
PL/SQL
11
. , ,
:
[_| CursorLoop.sql
DECLARE
v_FirstName VARCHAR2(20);
v_LastName VARCHAR2(20);
- .
SQL-,
- .
CURSOR c_Students IS
SELECT first_name, last_name
FROM students;
BEGIN
- .
OPEN c_Students;
LOOP
- .
FETCH c_Students INTO v_FirstName, v_LastName;
-- , .
EXIT WHEN c_Students%NOTFOUND;
/* */
END LOOP;
-- .
CLOSE c_Students;
END;
( (subprograms)) PL/SQL,
, . ,
PrintStudents,
DBMS_OUTPUT.
(_] PrintStudents.sql
CREATE OR REPLACE PROCEDURE PrintStudents(
pjtejor IN students.major%TYPE) AS
CURSOR c_Students IS
SELECT first_name, last_name
FROM students
WHERE major = p_Major;
BEGIN
FOR v_StudentRec IN c_Students LOOP
DBMS_OUTPUT.PUT_LINE(v_StudentRec.first_name|| ' ' |l
v_StudentRec.last_name);
END LOOP;
END;
12
, , :
Q - PrintStudents.sql
SQL> BEGIN
2
PrintStudents ('Computer Science');
3 END;
4/
Scott Smith
Joanne Junebug
Shay Shariatpanahy
DBMS_OUTPUT. PUTJ.INE
SQL*Plus, set serveroutput on
(. 2).
, . (package) : () .
, . , RoomsPkg ,
rooms:
RoomsPkg.sql
CREATE OR REPLACE PACKAGE RoomsPkg AS
PL/SQL
13
PL/SQL
. PL/SQL
: , (OracleS ) (OracleS ).
:
Q Collections, sql
DECLARE
,
. , PL/SQL, Oracle
.
PL/SQL Oracle
PL/SQL Oracle. PL/SQL, 1.0, Oracle 6. Oracle? PL/SQL 2.x OracleS PL/SQL 8,
OracleSi ( OracleS.1) PL/SQL 8.1, a OracleQi PL/SQL 9.0. PL/SQL ,
1.1.
. PL/SQL 2.0
9.1. , ,
:
, PL/SQL 8.0 ,
, .
14
, PL/SQL 8.1 ,
, SQL.
, PL/SQL 9.1 ,
, .
1.1. Oracle PL/SQL
Oracle
PL/SQL
1.0
7.0
2.0
CHAR .
(, , ).
, : .
DBMS_PIPE
DBMS.ALERT.
SQL*Plus Server Manager
DBMS_OUTPUT.
7.1
2.1
, .
SQL- ,
.
PL/SOL DBMS_SQL
7.2
2.2
7.3
2.3
(
).
/ UTL_FILE.
PL/SQL .
, .
8.0
8.0
.
: .
Advanced Queuing ( ).
.
LOB ( ).
8.1
8.1
SQL.
Java.
.
NOCOPY.
.
.
9.0
9.0
.
CASE..
DATETIME TIMESTAMP.
.
.
, .
PL/SQL
- DBMSJOB.
PL/SQL
15
PL/SQL,
. . ,
:
Connected to:
Connected to:
Oracle8i Enterprise Edition Release 8.1.7.1.0 - Production
With the Partitioning and Java options
PL/SQL Release 8.1.7.1.0 - Production
Connected to:
Oracle9i Enterprise Edition Release 9 . 0 . 1 . 0 . 0 - Production
With the Partitioning option
JServer Release 9.0.1.0.0 - Production
, PL/SQL
. OracleQi .
v$version, PL/SQL Oracle,
SQL*Plus:
SQL> SELECT * FROM v$version;
BANNER
Oracle9i Enterprise Edition Release 9 . 0 . 1 . 0 . 0 - Production
PL/SQL Release 9 . 0 . 1 . 0 . 0 - Production
CORE
9.0.1.0.0
Production
TNS for Solaris: Version 9 . 0 . 1 . 0 . 0 - Production
NLSRTL Version 9.0.1.0.0 - Production
, , Oracle 8.1.7, Solaris. 19 19 9.0.1, Solaris.
Windows NT,
Solaris.
Oracle
Oracle, .
, , , . , "Oracle Server Reference"
16
web- "" (www.lory-press.ru) :
.
web- Osborne/McGraw-Hill Oracle Press:
www.osborne.com.
. Development Tools (. 2).
, , readme, html, .
, ,
. ( web-)
cocfe, . , :
SimpleLoop.sql
DECLARE
v_LoopCounter BINARY_INTEGER := 1;
BEGIN
LOOP
INSERT INTO temp_table (num_col)
VALUES (v_LoopCounter);
v_LoopCounter := v_LoopCounter+ 1;
EXIT WHEN v_LoopCounter > 50;
END LOOP;
END;
code/ch01/SimpleLoop. sql.
code/readme, html .
,
, , ,
. : students (), classes (_) rooms (). , registered_students (_)
, .
SQL-, .
PL/SQL
17
tables, sql, code
"" : ww. lory-press, ru.
(
NUMBER(5) PRIMARY KEY,
VARCHAR2(20),
VARCHAR2(20),
VARCHAR2(30),
NUMBER(3)
18
1
'Economies', 8);
INSERT INTO students(id, first_name, last_name, major,
current_credits)
VALUES(student_sequence.NEXTVAL, 'Patrick', 'Poll',
'History', 4);
INSERT INTO students(id, first_name, last_name, major,
current_credits)
VALUES (student_sequence.NEXTVAL, 'Timothy', 'Taller',
'History', 4);
INSERT INTO students(id, first_name, last_name, major,
current_credits)
VALUES (student_sequence.NEXTVAL, 'Barbara', 'Blues',
'Economies', 7);
INSERT INTO students(id, first_name, last_name, major,
current_credits)
VALUES (student_sequence.NEXTVAL, 'David', 'Dinsmore',
'Music', 4);
INSERT INTO students(id, first_name, last_name, major,
current_credits)
VALUES (student_sequence.NEXTVAL, 'Ester', 'Elegant',
'Nutrition', 8);
INSERT INTO students(id, first_name, last_name, major,
current_credits)
VALUES (student_sequence.NEXTVAL, 'Rose', 'Riznit',
'Music', 7);
INSERT INTO students(id, first_name, last_name, major,
current_credits)
VALUES (student_sequence.NEXTVAL, 'Rita', 'Razmataz',
'Nutrition', 8);
INSERT INTO students(id, fir.st_name, last_name, major,
current_credits)
VALUES (student_sequence.NEXTVAL, 'Shay', 'Shariatpanahy',
'Computer Science', 3);
major_stats
m a j o r _ s t a t s
. ( total_credits , total_students .)
CREATE TABLE major.stats (
major
VARCHAR2(30),
total.credits NUMBER,
total_students NUMBER);
PL/SQL
19
rooms
rooms . ( room_id , b u i l d i n g , room_number , number_seats , d e s c r i p t i o n .)
| CREATE TABLE rooms
room_id
building
room_number
number_seats
description
);
(
NUMBER(5) PRIMARY KEY,
VARCHAR2(15),
NUMBER(4),
NUMBER(4),
VARCHAR2(50)
20
classes
classes , . ( department , course , max_students
, current_students , num_credits .)
) CREATE TABLE classes (
department
CHAR.(3),
course
NUMBER(3),
description
VARCHAR2(2000),
max_students
NUMBER(3),
current_students
NUMBER(3),
num_credits
NUMBER(1),. .
room_id
NUMBER(5),
CONSTRAINT classes_department_course
PRIMARY KEY (department, course),
CONSTRAINT classes_room_id
FOREIGN KEY (room_id) REFERENCES rooms (room_id)
);
INSERT INTO classes(department, course, description, max_students,
current_students, num_credits, room_id)
VALUES ('HIS', 101, 'History 101', 30, 11, 4, 20000);
INSERT INTO classes(department, course, description, max_students,
current_students, num_credits, room_id)
VALUES ('HIS', 301, 'History 30V, 30, 0, 4, 20004);
INSERT INTO classes(department, course, description, max_students,
current_students, num_credits, room_id)
VALUES C C S ' , 101, 'Computer Science 101', 50, 0, 4, 20001);
INSERT INTO classes(department, course, description, max_students,
current_students, num_credits, room_id)
VALUES ('ECN 1 , 203, 'Economics 203', 15, 0, 3, 20002);
INSERT INTO classes(department, course, description, max_students,
current_students, num_credits, room_id)
VALUES ( ' C S ' , 102, 'Computer Science 102', 35, 3, 4, 20003);
INSERT INTO classes(department, course, description, max_students,
current_students, num_credits, room_id)
VALUES ('MUS', 410, ''Music 410', 5, 4, 3, 20005);
INSERT INTO classes(department, course, description, max_students,
current_students, num_credits, room_id)
VALUES ( ' E C N ' , 101, 'Economics 101', 50, 0, 4, 20007);
INSERT INTO classesCdepartment, course, description, max_students,
current_students, num_credits, room_id)
VALUES NUT 1 , 307, 'Nutrition 307', 20, 2, 4, 20008);
PL/SQL
21
registered_students
registered_students ,
. ( student_id , g rade .)
)
student_id NUMBER(5)
NOT NULL,
department
CHAR(3)
NOT NULL,
course
NUMBER(3)
NOT NULL,
grade
CHAR(1),
CONSTRAINT rs_grade
CHECK (grade I N ( ' ' , ' ' , ' C ' , ' D ' , ' ' ) ) ,
CONSTRAINT rs_student_id
FOREIGN KEY (student_id) REFERENCES students (id),
CONSTRAINT rs_department_course
FOREIGN KEY (department, course)
REFERENCES classes (department, course)
);
INSERT INTO registered_students (student_id, department, course, grade)
VALUES (10000, - C S ' , 102, ' A ' ) ;
INSERT INTO registered_students (student_id, department, course, grade)
VALUES (10002, ' C S ' , 102, ' B ' ) ;
INSERT INTO registered_students (student_id, department, course, grade)
VALUES (10003, 'CS:, 102, ' C ' ) ;
INSERT INTO registered_students (student_id, department, course, grade)
VALUES (10000, 'HIS', 101, ' A ' ) ;
INSERT INTO registered_students (student_id, department, course, grade)
VALUES (10001, 'HIS', 101, ' B ' ) ;
INSERT INTO registered_students (student_id, department, course, grade)
VALUES (10002, 'HIS', 101, ' B ' ) ;
INSERT INTO registered_students (student_id, department, course, grade)
VALUES (10003, 'HIS', 101, ' A ' ) ;
INSERT INTO registered_students (student_id, department, course, grade)
VALUES (10004, 'HIS', 101, ' C ' ) ;
INSERT INTO registered_students (student_id, department, course, grade)
VALUES (10005, 'HIS', 101, ' C ' ) ;
INSERT INTO registered_students (student_id, department, course, grade)
VALUES (10006, 'HIS', 101, ' ' ) ;
INSERT INTO registered_students (student_id, department, course, grade)
22
RS_audit
RS_audit , registered_students. ( change_type , changed_by , timestamp , o l d _ s t u d e n t _ i d
, old_department , old_course
, old_grade , new_student_id
, new_department , new_course
, new_grade .)
[J CREATE TABLE RS_audit (
change_type
changed_by
timestamp
old_student__id
old_department
old_course
old_grade
new_student__id
new_department
new_course
new_grade
CHAR(1)
NOT NULL,
VARCHAR2(8) NOT NULL,
DATE
NOT NULL,
NUMBER(5),
CHAR(3),
NUMBER(3),
CHAR(1),
NUMBER(5),
CHAR(3),
NUMBER(3),
CHAR(1)
PL/SQL
23
log_table
log_table Oracle. ( code , message , i n f o .)
)
info
);
VARCHAR2(100)
temp_table
temp_table . (
num_col , char_col .)
Q CREATE TABLE terap_table (
num_col NUMBER,
char_col VARCHAR2(60)
);
PL/SQL,
. ,
PL/SQL , , . ,
. PL/SQL 3.
26
* PL/SQL , .
,
PL/SQL. ,
PL/SQL, Oracle
.
PL/SQL
, ,
:
, . .
, .
,
.
.
PL/SQL, PL/SQL. Java,
PL/SQL (PL/SQL engine) . ,
Oracle , PL/SQL
,
PL/SQL .
, /, .
: . , . .
, .
PL/SQL
Oracle 6, PL/SQL ,
PL/SQL.
SQL, , SQL-, PL/SQL. , : Oracle
, SQL-,
27
PL/SQL. , SQL-
PL/SQL
SQL, , SQL*Plus.
SQL*Plus. SQL>, a SQL*Plus .
, SQL*Plus.
PL/SQL SQL, CREATE OR REPLACE PROCEDURE.
SQL_PLSQL.sql
SQL> CREATE OR REPLACE PROCEDURE ServerProcedure AS
2 BEGIN
3
NULL;
4 END ServerProcedure;
5 /
Procedure created.
SQL> DECLARE
2
v_StudentRecord students%ROWTYPE;
3 v_Counter BINARY_INTEGER;
4 BEGIN
5 v_Counter := 7;
6
7 SELECT *
H
INTO v_StudentRecord
9
FROM students
10
WHERE id = 10001;
11
12
13
ServerProcedure;
14 END;
15 /
PL/SQL procedure successfully completed.
SQL> UPDATE classes
2
SET max_students = 70
3
WHERE department = 'HIS'
4 AND course = 101;
1 row updated.
, ,
"" : mw. lory-press, ru.
"- -
_aa.sql". ,
,
readme.html code.
28
. 2.1. (
SQL*Plus) PL/SQL (
, SQL-, ) SQL-. SQL- SQL-,
PL/SQL PL/SQL, . PL/SQL (,
), SQL- (,
SELECT) SQL-.
DECLARE
v_StudentRecord students%ROWTYPE;
v_Counter BINARY_INTEGER;
BEGIN
v_Counter := 7;
SELECT *
INTO v_StudentRecord
FROM students
WHERE id = 10001;
UPDATE classes
SET max_students = 70
WHERE department = 'HIS'
AND course =101;
Serve rProcedureQ;
END;
PL/SQL
(
)
PL/SQL
SQL-
PL/SQL
PL/SQL
SQL-
PL/SQL
SQL-
Oracle
. 2.1. PL/SQL
SQL-,
,
SQL-
29
, PL/SQL,
PL/SQL , . ( Pro*C, JDBC, OCI
)
SQL, PL/SQL. , PL/SQL
, SQL, .
PL/SQL
Oracle.
PL/SQL
PL/SQL, ,
Oracle (Forms Reports) PL/SQL. , croporfe .
PL/SQL. PL/SQL, PL/SQL .
PL/SQL , . PL/SQL ,
. , Oracle
Forms .
, SQL- .
PL/SQL, (. 2.2).
, SQL-,
( UPDATE), , SQL- . PL/SQL . (,
) , . SQL- PL/SQL (, SELECT) ,
PL/SQL.
ORACLE Oracle, */++
Pro*COBOL, ,
PL/SQL . PL/SQL. , SQL-,
PL/SQL-, ,
.
PL/SQL.
.
Oracle.
30
DECLARE
v_StudentRecord students%ROWTYPE;
v_Counter BINARY_INTEGER;
BEGIN
v_Counter := 7;
UPDATE classes
SET max_students = 7 0
WHERE department = 'HIS'
AND course = 101;
SELECT *
INTO v_StudentRecord
FROM students
WHERE id = 10001;
ServerProcedure();
END;
PL/SQL
PL/SQL,
PL/SQL
PL/SQL
SQL-
PL/SQL
PL/SQL
SQL-
SQL-,
,
SQL-
PL/SQL
SQL-
Oracle
. 2.2. PL/SQL
. 2.2 PL/SQL, . , ( PL/SQL)
( PL/SQL).
31
, . , , ""; , , -. ,
, . PL/SQL
. , ,
,
, . ,
, .
Oracle Internet Application Server (IAS) . PL/SQL
.Web-
PL/SQL
HTML
PL/SQL
\
4
\
**
Oracle
/
PL/SQL
PL/SQL
SQL-
. 2.3.
SQL-
32
,
HTML-. web- PL/SQL (PL/SQL Web Toolkit), IAS (. 2.3).
web- PL/SQL Oracle.
, PL/SQL ( SQL)
. , .
, ,
.
PL/SQL
. ,
PL/SQL. , SQL*Plus connect. (. ).
PL/ SQL.
( ), (,
Oracle Forms) PL/SQL
.
PL/SQL
, PL/SQL, .
, 2.1. ,
SQL*Plus Oracle , . "" : www. lory-press, ru.
Development
Tools.
readme, html .
33
2.1. PL/SQL
SQL*Plus
Oracle Corporation
www.oracle.com
""
Rapid SQL
Embarcadero
Technologies
www.embarcadero.com
DBPartner
Compuware
www.compuware.com
SQL Navigator
Quest Software
www.quest.com
TOAD
Quest Software
Www.quest.com
www.toadsoft.com
www.bmc.com
Web-
, ,
PL/SQL.
Windows
NT, 19 Solaris.
(. 1) PL/SQL Java. , .
setup, sql.
,
,
AddNewStudent
AlmostFull
ModeTest
ClassPackage
Point
SimpleClass
Java
tables.sql
ch09/AddNewStudent.sql
ch09/AlmostFull.sql
ch09/ModeTest.sql
ch09/ClassPackage.sql
ch12/Point.sql
ch02/SimpleClass
SQL'Plus
SQL*Plus, , PL/SQL. SQL- PL/SQL .
,
. ,
PL/SQL .
34
SQL*Plus - SQL PL/SQL .
:
(, , ) SQL*Plus
connect SQL*Plus
( Windows iSQL*Plus)
, , , Log On
, ,
SQL*Plus , . Windows Log On . 2.4.
$ sqlplus example/example
SQL*Plus: Release 9 . 0 . 1 , 0 . 0 - Production on Tue Oct 9 16:32:22 2001
(c) Copyright 2001 Oracle Corporation. All rights reserved.
Connected to:
Oracle9i Enterprise Edition Release 9 . 0 . 1 , 0 . 0 - Production
With the Partitioning option
JServer Release 9 . 0 . 1 . 0 . 0 - Production
35
SQL> exit
Disconnected from Oracle9i Enterprise Edition Release 9.0.1.0,0 - Production
With the Partitioning option
JServer Release 9.0.1.0.0 - Production
$ sqlplus example
SQL*Plus: Release 9.0.1.0.0 - Production on Tue Oct 9 16:33:23 2001
(c) Copyright 2001 Oracle Corporation. All'rights reserved.
Enter password:
Connected to:
Oracle9i Enterprise Edition Release 9.0.1.0.0 - Production
With the Partitioning option
JServer Release 9.0.1.0.0 - Production
SQL> connect example/example
Connected.
SQL> connect exanple/example@v806_tcp
Connected.
User Name:
Password:
Host String:
OK
Cancel
36
ii
5
6
7
8
9
10
11
12
13
14
FROM registered_students
WHERE department - 'MUS1 AND course = 4
FOR UPDATE OF grade;
BEGIN
FOR c_Student IN c_Music410Students LOOP
UPDATE registered_students
SET grade - 'a 1
WHERE CURRENT OF Music41Students;
END LOOP;
END;
/
SELECT
FROM registered_students
WHERE department - 'MUS 1 course - 41B;
STUDENT ID DEP
10009
1B006
10011
10000
MUS
MUS
MUS
MUS
COURSE G
lt1B
410
410
410
ft
SQL>
SQL*Plus PL/SQL SQL , . , PL/SQL,
. , CREATE OR
REPLACE, ,
. SQL*Plus. .
start, SQL*Plus, (
19 Web URL). , , , . @
start. , F i l e . s q l :
Q - File.sql
BEGIN
37
_d
6 END;
7
Hello
Hello
Hello
Hello
Hello
Hello
Hello
Hello
Hello
Hello
World!
World!
World!
World!
World!
World!
World!
World!
World!
World!
10 rows selected.
J
. 2.6.
,
.
DBMS_OUTPUT
PL/SQL /. UTL_FILE
(. 12) ,
38
, . ,
SOJL*Plus DBMS_OUTPUT . :
1. SQL*Plus set
serveroutput. :
SETSERVEROUTPUT{ON|OFF} [SIZE n]
. n , 2000 . 1 000 000
. ON OFF .
2. PL/SQL DBMS_OUTPUT.PUT_
LINE, .
SQL*Plus
.
DBMS_OUTPUT.PUT_LINE. SQL*Plus , SQL*Plus, .. .
DBMS_OUTPUTn UTL_FILE .
9 10,
, .
. 2.7 DBMS_OUTPUT.PUT_
LINE.
, Oiacle SQL'Plus
file
SQL>
SQL>
2
3
1
5
6
Edit
J
11
39
Rapid SQL
Rapid SQL Embarcadero Technologies
.
:
PL/SQL SQL
PL/SQL
Java OracleS i
PL/SQL
SQL
Windows Active Scripting
,
Rapid
SQL .
Rapid SQL , ,
. 2.8.
file Qatasource froiect growse
jiSsl S. ;:!;
!| !|1|18 Selected)
ftfffe'u;'*!-*'|-jif
Oracle Servers
Gal V817 (Oracle 8.1.7.0.0)
gll V901 (Oracle 3.0.1.0.0)
1>|
0
IBFavorilts
{Catalog: Local
{Workspace 1
NUM ;iNS
40
, .
, . (datasource) ,
: ,
, .
Rapid SQL , SQL*Net .
, (. . 2.9).
Datasource.
Login to V301
Login id:
[example
Password:
Cancel
. 2.9.
, Rapid SQL , . .
SQL PL/SQL
SQL- PL/SQL
SQL. SQL File | New | SQL.
SQL PL/SQL ( /),
SQL. , Execute (. . 2.10).
Results (. . 2.11). PL/SQL (, ) SQL. DBMS_OUTPUT.PUT_LINE
.
Rapid SQL ,
PL/SQL. , Rapid
SQL ,
, .
41
[SQL 1 -J
]E] Ete
Browse
Edit QatasoufCe
Project
ju
-UJxl
ii
"!^^
V817
^S
i|-"*J*
ft-
'fj-*^
-
fW
DECLASE
R Husic410Students 12
SSL *
IROH regisCcred_students
i
J OR UPDATE OF grade;
BEGIH
FOR Student IS Hus i 410 Students LOOP
UPDATE registered students
1
0
5 IT grade - 'li
1
JERE COWEIT OF Hu3ic4103tudents;
2
LOOP;
3 OD;
4 /
S
6 SELECT * TROH registered^students
7
departnent *(' ASD course - 410;
OL0
1&^
FundlOm
ift-
-{>
i^-^'
$-j|^
4-21
-W
4^
S-^
Indexes
Java Classes
JavaSouces
Java Resources
Uxaries
Packages
PLVSQlCodePtofiJing
Primary Keys
Piocedutet
i|rft
'
-''
-.
:*?
Roles
Rofcack Segments
Sequences
HateiiaEzedViews(5napshot
MatenaizedVieMLogslSnaF*
.1
iectoai
f
- '
Check Constraints
Oustes
Database LJnki
DiKloie.
FcxeignKeys
^T
9
0
1
2
BEGIH
DBHS_ OUTPuT.PTJT LIHE('Kello froa PL./KOL!'); .
DBHS"OUTPUT. PUTJ-IHEt1 Today is ' | 1
^-', ' D&-HOH-nTY ' ) J ;
LLU
J
jVSOlVeiiropie
xecuteSQLttatemnts
jVSOIVenamdle
ICaiakS'Eocal
Lira 24 Col 4
jWcSsiace'l" \
6 Ron(si (
(NUM'jiNS'^s
. 2.10. SQL
>
E
^Jxt
.l*PlgL'-lg Object Type...
M raged Dataiaicet
l Oracle Sefveit
- Vfl17(0radeat.7.0.0)
f^ Check Conttieinti
- Qutte
ff^i Database Links
-W
VA
-gp
'
*K^
ForgnKeys
Funcbons
Indexes
-JavaOassci
JavaSouice*
il |
ji-'W
L*'-Q,
/
f-ITi
fr^
fft
i>-Al
i-'2$
Lbtviet
Peckege*
PL/SQL Code Piofifcig
PrimetyKay.
Pioceduret
PioBe
Ftofei
Rofcack Segments
Sequences
la,
The command executed successfully win no resuts returned.
'_
STUDEHT ID .......
!DARti.4r|cO.JRSEfcRAMf
MUS
i410
\A
idobe'
10011
VOOOO "
; Waioff'Lociii
. 2.11. Results
42
2
.
. AlmostFull
. 2.12.
fatf;w-A<ftfff*rp/tf$ffl 571
fXAMPLE E I J00080046I1001 l|
Q i cS H ! S a i "
\ j SQ w | ^ ' : f: ^ H^ ^ ^ v . H i - M t f ^ j x i ^ ^ ^
5
6
7
8
9
10
u_CurrentStudents HUHBSR;
v_Hax Students
UUHBER;
v_Re CurnVal ue
EOO LEAH ;
v_rullPercent
COK3TAHT SOMBER :- 80;
BEGIH
12
-- course.
13 SELECT cutrent_student3, ax__studenta
14
IMTO v_Current3tudents, v_Hax3tudents
15
FROE classes
16
VHEPZ deparcmenc = p_Depactment,
17
) course p Course;
'- Privileges
4 Indexes
& Javfl Classes
^ Java Sources
MamelValuel
J9 i1* tf s1 1 i * 0 ! ^ i& 1 I *i
1
2
- Functions (1)
| - EXAMPLEALMOSTFUL
~l3l x|
jj |f
HHE3I
MJ
^T
:
jVSCri'^'ample
Type
_y_
jj
Name
|Valiicl
!Su!.rWkje__!NyU-jBgpLE
Louise
llbT
CLASS!
-5J EXAMPLE.ALMOSTFULL{)Ur,e:
*
41.008060001{
iL ""T"
""
"T 1 .1
ear*.
"'
!ORow(si
fljjj'
Name
Tf 3| Dependences
L-pg FXAMPLE FTSflnnfltrMfimn
U/
" EX4MPLE.ALMOSTFULL
[Catalog Loc5~"~
i
Voi'kspace 1 ' ;
JNUM'JNS
/f
Rapid SQL
, Rapid SQL
:
.
.
; ,
.
PL/SQL.
, PL/SQL, , . ,
.
PL/SQL. PL/SQL (OracleSz ) PL/SQL. Rapid SQL GUI-
,
.
43
.
. email.
. , .
SQL PL/SQL, HTML Java.
. DDL SQL
.
. .
DBPartner Debugger
DBPartner Debugger Compuware Corporation. , :
SQL PL/ SQL
PL/SQL Java
Java OracleS
DBPartner Debugger DBPartner. SQL Tuner Viewer. DBParner Debugger
.
DBPartner Debugger . ,
. "userid/password",
. . 2.13.
.
DBPartner Debugger, . , , DBPartner
Debugger. (Database
Setup Wizard),- . 2.14. , . Database |
Setup Wizard. DBA,
. DBA .
44
|V901.US.ORACLE.COM/exajj|
- ORACLE
Server
QcQpnect J
1
JV901.US.ORACLE.COM J
Cancel
Save
(EXAMPLE
Delete
Password:
Default
-DBPattriei OebuggeiLbec
Help
(t Install / upgrade
Uninstal
Help
Next
Cancel
. 2.14.
SQL PL/SQL
SQL PL/SQL SQL Notepad, File | New SQL Notepad . SQL Notepad PL/SQL ( /),
SQL. SQL Notepad
Execute (. . 2.15).
SQL SQL Output (. . 2.15). DBMS_OUTPUT.PUT_LINE
DBMS Output SDL Notepad (. . 2.16).
45
?i ^-^j
* ^ ?--' .
&- i' ss ' ss* .' ra1 : P - '
1
7 ji"{" '
Course
Gl
Grade
''.^^^..
10000 MUS
10006MUS
10009MUS
BHD;
SELECT
FROM registered students
WHERE department - 'HITS' JUTD course - -Ku;
410A
410A
410A
BEGIH
DBH3_OUTPOT.PyT_LIME('Hello l'ra PL/ SQL ! ' ) .DBKS^OUTPOT.PUT^INECToday 1* ' ||
1
TO CHAR(SYSAATK, ' DD-HCW-YYYY ] ) ;
26:1
Rii*
j
A
DBPartner Debugger PL/SQL . File | New Debugger
Debug. , DBPartner Debugger
. . 2.17.
PL/SQL, DBPartner Debugger
Java- (18 ). Java-, PL/SQL, .
DBPartner Debugger. Java
. 2.18.
46
Eto dt Database
'
_.._ . . .
"Help
"
Qobuff Qpfor*
BEGIM
0011
0012
0013
1.
,-
^ii-r^V.
J=Tid
1-.|
*3^
'-se.
SELECT current students, tnax_atudencs
FROM classes
WHERE department - p__Departioent
8 - p_Course;
0015
0016
0017
Li l.' I H
Dij !'J
0020
0022
0023
0024
UlO
[<NUL
;EXAMPLE.ALMOSTFULL
js>|
. 2.17. PL/SQL
" "
e|rel>i
SMUK J&
III...
v ^j Hdlo d(!
* U <inb
type
J _ Name
V.ywe
. 2.18. Java
47
DBPartner Debugger ,
. , , . , SQL PL/SQL
, , DBPartner Debugger.
DBPartner Debugger
, DBPartner Debugger
:
. , .
, . .
. , . DBPartner Debugger
SQL /. SQL
SQL, PL/SQL
Java.
PL/SQL. , PL/SQL,
, .
, .
.
.
.
SQL.
. DBPartner :
SQL Tuner,
SQL, ; SQL Viewer, SQL PL/SQL
.
SQL Navigator
SQL Navigator Quest Software.
,
:
PL/SQL SQL
PL/SQL
()
48
OracleS OracleS
DBPartner Debugger, SQL Navigator . ,
. , , . 2.19.
,
. SQL Navigator .
Connect to Database
Connection Prof
OK
JV901 - EXAMPLE
Cancel
Delete
Username: EXAMPLE
Password: "
I"'
'
Connect String: |V901
. 2.19. SQL Navigator
BQL Navigator Seiver Side Installation
Next
llmllifmiirilliiniiTii
. 2.20.
|K
i"ni
Cancel
49
SQL Navigator ,
SQLNAV. (Server Side Installation Wizard) .
,
Tools | Server Side Installation Wizard.
, ,
SQL Navigator Tuner. . 2.20 .
SQL PL/SQL
SQL PL/SQL SQL.
, . PL/SQL, , /.
(
SQL*Plus).
. . 2.21 SQL
.
( ),
SQL PL/SQL.
DBMS_OUTPUT.PUT_LINE
Server Output ON Tools [ Server
Fte
:j.,t|v90!
EEi E-
\\ Interval: [2 ^C] j
lyC SQL EdilM-VSOl EXAMPLE:! File:UnNamedl
Single SQL
SQL Script
***
* HI
&
DECLAKE
CURSOR c_Husic4iOScudencs I2
SELECT '
TR9K cegiscered_3tudent3
WHERE department - ! H U ' 1; course UP DATS: OF grade;
BEGIH
FOR c_Student IH c_Huaic410Scudents L*X!P
UPPATE regiscered_students
SET grade ' A 1
UHEPE CURRENT OF c_Husic4103tudents;
EKD LOOP;
END;
SELECT '
FROH registered students
[Processing
ID DEP COURSE
IJ10009
||l0006
HUS 410
HDS 410
(fop:! ""
JByteT584"
|inSBrt
50
**i
StxfcSO.
,41*?!
SOLScript
S' ?
SET grade = ' A '
HERE CUSKEMT Of c_Husic410Student=;
EMU LOOP;
END;
SELECT '*
FROM registered_3tudent3
1
!
HERE depaccmeni: - - R U S course "
BEGIN
DBHS_OUTPUT.PUT_LIHE!'H^lJo Stow PL/'SC
DBHS_OUTPUT.PUT_LINEi'Today is ' ! I
TO_CHAH i;3Y3DATE,
EHC;
4 rows retrieved
Processing ...
HeUo (ton PI/SQL!
Today is 26-OCT-2Q01
Statement processed
26: 1
'Wodilied
. 2.22. DBMS_OUTPUT.PUT_LINE
Output. DBMS_OUTPUT.PUT_LINE
(. . 2.22).
PL/SQL ,
Debug, Debug ON
Debug | PL/SQL Debugging.
, , . . 2.23.
SQL Navigator ^
PL/SQL. , DBMS_DEBUG , SQL Navigator .
SQL Navigator
, SQL Navigator :
PL/SQL. .
SQL Navigator; ,
51
*,11*,1*,
f fte
Search
Eebug IDC*
ufcw
Help
tp! |
x.? "
% \A EXAMPLE
*4aij
Name:
|fl) ALMOSTFULL
*(|11:[5:44:3?
Revert j g a v e
| Agjkyi j
Ctose j
^ f^ (iff
delp
FROM classes
HERE department - p_Department
AHi: course -- p_Course;
1 if;
call staac
FETBRM v_RetuirnValue;
END A l m o s t F u l l ;
?
1
EXAMPLE ALMOSIFULL
Watches | Breakpoints j
v_FullPercent: 80
v_MoxStuder<s: 5
p_0epartment: MUS
p_Course: 410
iLJ
~ Ones: 29
" |fop1S
jAPt v2.4
. 2.23.
. .
.
. DB Navigator ,
(
, ).
. Java
SQL Navigator, DB Navigator.
.
, , , SQL, PL/SQL, , .
,
SQL .
.
, WHERE SELECT.
DML.
52
PL/SQL. PL/SQL
,
.
, , Oracle.
. Code Assistant, Tools,
PL/SQL SQL. Code Assistant,
, .
.
, SQL.
TOAD
TOAD (Tool for Oracle Application Developers
Oracle)
SQL Navigator, Quest Software .
, . . TOAD :
PL/SQL SQL
PL/SQL
OracleS OracleS
,
TOAD ,
. ,
.
TOAD . , . 2.24.
File | New Connection.
, , File | Close Connection.
.
53
I User
V301.US.ORACLE.COM
VS17.US.ORACLE.COM
V901.US.ORAaE.COM
V901.US.OHAOE.COM
EXAMPLE/EXAMPLE
EXAMPLE
EXAMPLE
SYSTEM
<
1 Last Connect
10/26/2001 2:22:49 PM
10/14/2001 11:02:57PM
104/2001 6:08:12 PM
10/8/2001 5: 16: 52PM
Database:
( userOdatabase )
-I
Usei/Schema
EXOMPLE
Eassword
Shew connection options
SQL-Net Help
Qk
Cancel
. 2.24. TOAD
TOAD , , - , .
, .
.
SQL PL/SQL
SQL PL/SQL SQL.
SQL SQL
PL/SQL,
1 SQL-Window Deate Djiubase lools View DBA Detss Window Help
B .0 * i* a - <i 41 is -
>[XAMPLti2>V301.US ORACLE.COM/
i ^! "3 ; * I g1 - ^ : f*'
CURSOR c_Musi.c410Students 13
SELECT *
FKOM registered_students
WHERE departant ' AND course - 410
FOR UPDATE OF grade :
EEGIH
FOK o_Studcnt IH c_Husic410Studcnts LOOP
UPDATE registared_students
SET grade ' E\ '
HERE CDRBEHT OF c_Music4105tudents:
EHD LOOP.
ESD.
SELECT
FROM registered_students
I'HERE departnent K'jS AHD course 410;
| ExptaPlailAuKTracel DSMSOummj CodeSlatistia SaiplOilpul |
410 A
|1@01.5. f :Scnp(
. 2.25. SQL
54
EMD:
X
Data j Explain Plan ] Auto Trace DBMS Output j Code Statistics j Scipl Output ]
25 2
jEXAMPLE(!>V9m.US.ORACLE.COM i
Commit is OFF i
,f.
4
. 2.26. DBMS_OUTPUT.PUT_LINE
Step Into
Debug | Step Into. Set Parameters. ,
,
.
, . . 2.27.
55
HUHBER;
NUH0ER ;
BG01EAH;
CONSTANT ' :- 8
TraceQut
Hat Execution
Add Breakpoint al * F5
Add Welch alCuisor
CM.F5
Evaluate/Modify
CtrkAlt+E
Watchet
DBMS Output
Ctri+Aln-W
**0
v_ReturnValue
ELSE
v ReturnValue
END IF;
TRUE;
FALSE;
RETURN v ReturnValue;
END Almostfull;
Expiesiion
p_Depaitrrer)t
.FulPeicM
MJS
BO
1 Break! Scope
Local
I ocal
I Dwne'
. 2.27. TOAD
TOAD
, TOAD
:
. TOAD :
.
, , . , , .
. .
OracleS .
. TOAD : SQL (. )
. SQL
SQL SQL,
, , . , ,
.
.
56
. TOAD
PL/SQL SQL .
DBA. TOAD , DBA.
/.
SQL-Programmer
SQL-Programmer, .
:
PL/SQL SQL
PL/SQL
OracleS OracleS
,
SQL-Programmer
.
V-'SQL Programmer by Soflwale Evaluation Edition - Login
etvei
Help
1 Name
V817
| Connected as
EXAMPLE
1 Connect Server
3
|ofile:
JV901
Setter:
[vsoi
jj
Fipe:
.oginID:
jexample
~"\
Disconnect Server
Kxamsd
p Options
|
j
Connect
|>IIKXI
!:
Sh:
3tiom:
f^terii)
. 2.28. SQL-Programmer
Done
5?
. 2.28. , .
.
SQL PL/SQL
SQL-Programmer PL/SQL. ,
SPDW ( SQL-Programmer). SPDW
.
, . 2.29 AddNewStudent SPDW. SQL PL/SQL.
, , ,
, .
.
!' file Edit Vie w PDW P_efai;g T.ocfs Windows Help
! x s ; e I
ADDNEWSTUDENT
-O Functions
Bj Piocedues
| | Ml ADDNEWS1
JMODETEST
SIMPLEV/R/
S6) UPOATECLT-1
IS -^ Packages
"& Objecl Types
^ Java Sources
J
if) dB Views
Tables
!
i> Clustets
- Materialized Vtew:
9 Materialized VievJ
^ff Sequences
*j
!
Edit
Ptoiogue
Epiogue
Argumenls
'
]1
' '
VALID
j Code Metrics |
Results
^-*-
pjlajor
INSERT
tT
Fie*
Favorkes
CodeFregs
To Do List
,'.
Module
<NctAveiable>
l,r,l
1
1 Statemer*
Debugger not running
sT
i ,: V/aich Variable
Vabe
|
=SS
tii'
! -1
*|5^ 2001-l6-Ufi550.4n ^82bytes l.ine:U ot.13 19 [Np Cnangtl U?er. EXAMPLE
. 2.27. SQL-Programmer
SPDW, , , . SQL-Programmer .
AddNewStudent . 2.30.
DBMS_OUTPUT.PUT_LINE,
( ) . Result SPDW,
58
Edit
Prologue
Name
p_FirstMame
p_LastName
p_Major
Epilogue
Arguments
] Code Metrics]
I In/Out
Type
students.first_n IH
students.last na IN
students.raajoritT) IN
Results
| User Privileges)
Execute Ualue
Chuck
Clmouly
Computer Science
Auditing
SjJ_t
Has Ualue
True
True
True
. 2.30. AddNewStudents
Step In
Debug | Step In. .
, . . 2.31
.
SQL-Programmer
, SQL-Programmer
:
. SQL-Explorer
, .
, SQL-Explorer
.
. ,
SPDW .
.
. SQL-Explorer
. Option.
. .
. ,
.
59
n"Byj'mi^Ti:riKiianiMlllilHilili
Database Objects
.LMOSTFULL
2^1^1^11
^ G$ 5- ] X SJ S
Edit
:
:
j
!
Functions
ALMOSTFUI
- Procedures
i - S ADDNEWST
t -BlMODETEST
!
S SIMREWR/J
Ptdoaue
CurrentStudents
a ItexStudents
ReturnUalue
1> FullPercent
BEGIN
i- J. Object Types
-^ Java Sources
Epiogue
Arguments
Results
ijj"i>auslei>
SB- Matela;edV"ewl.|
^j
HUNBEH;
HUMBLR;
001;
CONSTeHT NUMBER
:- 8;
' ^- i
-r
Fies
Favorites
I.I
Code Frags
.1
1
To Do List
7
Auditing J_Li.
i - - Tables
RETURN BOOLEflN IS
.
1
Module
| Type
<*> EXAMPLE.ALMOSTFULL
.SQL-Piograrrme*
Function
| Statement
|^ Watch Variable
p_Coutse
[Lne21] IFJv_CuirentStudent
p_0eprjnent
<source not avaiablo
v.CutrentStuderts
| Value
41 0
MUS
4
|
^
i
11
j|
dlt
Remove
|il_
1 -Ulj,
Remove&l
Watches]
DebugginaFunctioniLaslSaveiZOul-IO^IS^^SlTSSbyleslUne:^ o(:29 Cot! JNo Change] ; User: EX4MR.E ;,:;:: :,, NUM. INS , :
J
]
J
EXAMPLE
. 2.3-1.
PL/SQL Developer
PL/SQL Developer Allround Authomations. :
PL/SQL SQL
PL/SQL
OracleS OracleS
( )
SQL*Plus
PL/SQL Developer . 2.32.
, .
,
. .
60
Oracle Logon
Username j example
1
Password """""
Database JV901.US.ORACLE.COM
Connect as [Notmal
OK
Cancel
o; o* - . |
Documents itfndow
i -
EH
EH
+ - /
All obpcis
- Recent objects
_J Functions
' CJ Procedures
Q Packages
ffi Package botfes
ll Types
it Q Type bodies
CJ Triggers
C3 Java sources
CJ Libraries
Directories
CJ Tables
ffl CJ Viens
CJ Sequences
S6-CJ Us"
Rote.
* CJ Synonyms
BE Q Tablespaces
Ousters
; J
fffl Packaoe
. 2.33.
SQL PL/SQL
SQL PL/SQL
PL/SQL Developer.
edit,
. SQL
61
SQL PL/SQL (
). SQL>, SQL*Plus.
SQL*Plus PL/SQL Developer. . 2.34 SQL .
Fife Edit
fcjaao
Dgcuments ^indow
tt < - I ,
| <* % e i *. a * e e ; ^ * .
*'j>j&A|sse-s|?
< * - **!/
Al obiecls
B-ta Procedures
3
S ADDNEWSTL i
:
: Ei-<5) MODEIEST
i
- Paameter
; Cl Reference I
Refetence-J
! ' U3 Synonyms
! I S-CJ Granted Ic
! : ' Cl Granted EC
' SIMPLEWRAI
! & SYS.ODCICOl
It)- SYS.ODdEW
:
i ffl SYS.ODQIND
;
iS <D 3YS.ODOIND
f
SQL
.... daar
BUferstze [lOCOO
[^
|v Enabled
Dialog
14
Editor ]
_d
SQL> SEbBCT *
SDoneindsee
avasource
Packaoe
-d
"'-fS
^ ''
1000 HUS
410 A
10011 HUS
10000 HU3
410 A
410 A
SQL> 21
^BHCll
Output | Statute* j
m nnrjiignd
<J) ModeTest |
"'. APR .HDG fi'M ;PL/SQL procedure success!* c;CTnp!eted in 0.01 se-^J
. 2.34.
DBMS_OUTPUT.PUT_LINE
Output SQL .
.
.
Start Debugging. , ,
. . 2.35 .
PL/SQL Developer
, PL/SQL Developer :
.
.
, .
62
*^-:1
-
" - /
Al objects
Macro
- _J Functions
.1
' - ALMOSTFULL I
' iti-Cj Parameter 1
\ iS"Cj Reference
i 'ii-Q Reference
: Cj Synonjms
Help
fin
a &
| li-O Gtarted tc
MDSYS.SOO.
MDSYS.SDO.
MDSYS.SDO.
i MDSYS.SDO,
MDSYS.SDO. ^
Documents Wtidow
'
NU1IBEB ;
BOOLEW.';
CONSTANT K1IUBER := 80;
J;
Templates
Package etementtd
-DPLSQLT,pes
3 Q Program units
J
j
L
< Function
1
i Java source
: Packaoe
J
.
^\Script^a!mOtfujly'
p_Course
Variable
v_CufientStudenfs
Jy^8
4
!
-
Call stack
ALMOST"nJll[Line221
v_RetumValue:-~TRUET
410
IP
feeoiing...
. 2.35.
. PL/SQL,
SQL. , .
. PL/SQL Developer . web-
Allround Automations, .
PL/SQL.
.
Profiler
.
.
,
.
PL/SQL. PL/SQL .
,
Oracle.
63
2.2
PL/SQL. , , .
.
2.2.
PL/SQL
SQL
Navigator
TOAD
SQLPL/SQL
Programmer Developer
Her
Hei
Java OracleSi
Her
Her
PL/SQL
Java
PL/SQL
SQL,
PL/SQL
SQL'Plus
Rapid SQL
DBPartner
SQL, PL/SQL
64
,
PL/SQL, .
PL/SQL,
PL/SQL. 3 PL/SQL.
PL/SQL
3
PL/SQL
68
,
PL/SQL. , PL/SQL.
PL/SQL, , ,
. ,
PL/SQL ,
.
PL/SQL , SQL-. ( : (operator) ,
, SQL- (statement)
( ),
PL/SQL. , .)
, . SQL-
. 7
PL/SQL, 4, 5 6 SQL-.
PL/SQL
, PL/SQL,
. PL/SQL,
() .
: . . , ,
, . , .
:
(labeled block) , .
.
, , , .
(subprogram) . , .
.
.
, , .
PL/SQL
69
(triggers) ,
, . , ,
. , , (DML, data manipulation language) .
DML INSERT (), UPDATE ()
' DELETE (). (DDL, data definition language), CREATE
DROP, , .
PL/SQL,
temp_table , . SQL*Plus:
;_J -- AnonymousBlock.sql
SQL> DECLARE
2 /* , . */
3
v_Num1
NUMBER := 1;
4 v_Num2
NUMBER := 2;
5
v_String1
VARCHAR2(50) := 'Hello World!';
6
v_String2
VARCHAR2(50) :=
7
- This message brought to you by PL/SQL!';
8
v_OutputStr VARCHAR2(50);
9 BEGIN
10 /* ,
11
temp_table. */
12 INSERT INTO tempjtable (num_col, char_col)
13
VALUES (v_Num1, v_String1);
14 INSERT INTO tempjtable (num_col, char_col)
15
VALUES (v_Num2, v_String2);
16
17 /* temp_table
18
DBMS_OUTPUT . */
19 SELECT char_col
20
INTO vJMputStr
21
FROM tempjtable
22
WHERE num_col = v_Num1;
23
OBMS_OUTPUT.PUT_LINE(v_OutputStr);
24
25
SELECT char_col
26
INTO v_OutputStr
27
FROM temp_table
28
WHERE num_col = v_Num2;
29
DBMSJ)UTPUT.PUT_LINE(v_OutputStr);
30
31 /* */
32 ROLLBACK;
33 END;
70
3
34/
Hello World!
- This message brought to you by PL/SQL!
PL/SQL procedure successfully completed.
,
,
, temp_table.
tables, sql.
,
README. DBMS_OUTPUT
2.
, DECIv\RE
, .
END.
Q - LabeledBlock.sql
SQL> !_InsertIntoTemp
2 DECLARE
3
/* , . */
4
v_Num1
NUMBER := 1;
5
v_Num2
NUMBER := 2;
6
v_String1
VARCHAR2(50) := 'Hello World!';
25
26
28
29
30
SELECT char._col
INTO v_OutputStr
FROM temp_table
WHERE num_col = v_Num2;
DBMS_OUTPUT.PUT_LINE(v_OutputStr);
PL/SQL
71
31
32 /* */
33 ROLLBACK;
34
35 END l_InsertIntoTemp;
36 /
Hello World!
- This message brought to you by PL/SQL!
PL/SQL procedure successfully completed.
,
DECLARE CREATE OR REPLACE
PROCEDURE (. 9 10). ,
END.
)
-- Procedure.sql
CREATE OR REPLACE PROCEDURE InsertlntoTemp AS
/* , . */
v_Num1
NUMBER := 1;
v_Num2
NUMBER := 2;
v_String1
VARCHAR2(50) := 'Hello World! - ;
v_String2
VARCHAR2(50) :=
'-- This message brought to you by PL/SQL!';
v_OutputStr VARCHAR2(50);
BEGIN
/* ,
temp_table. */
INSERT INTO temp_table (num_col, char_col)
VALUES (v_Num1, v_String1);
INSERT INTO temp_table (num_col, char_col)
VALUES (v_Num2, v_String2);
/* temp_table
DBMS_OUTPUT . */
SELECT char_col
INTO v_OutputStr
FROM temp_table
WHERE num_col = v_Num1;
DBMS_OUTPUT.PUT_LINE(v_OutputStr);
SELECT char_col
INTO v_OutputStr
FROM temp_table
WHERE num_col = v_Num2;
DBMS_OUTPUT.PUT_LINE(v_OutputStr);
/* */
ROLLBACK;
END InsertlntoTemp;
72
:
I
FJ -- Procedure.sql
SQL> BEGIN
2 InsertlntoTemp;
3 END;
4/
Hello World!
- This message brought to you by PL/SQL!
PL/SQL procedure successfully completed.
9 10.
temp_table , num_col . ( 11.)
, temp_table .
) - trigger.sql
CREATE OR REPLACE TRIGGER OnlyPositive
BEFORE INSERT OR UPDATE OF num_col
ON temp_table
FOR EACH ROW
BEGIN
IF :new.num_col < 0 THEN
RAISE_APPLICATION_ERROR(-20100. 'Please insert a positive v a l u e ' ) ;
END IF;
END OnlyPositive;
, INSERT
UPDATE temp_table. SQL*Plus :
] - trigger.sql
SQL> -- INSERT ,
SQL> INSERT INTO tempjtable (num_col, char_col)
2
VALUE(1, 'This is row );
1 row created
SQL> - INSERT ,
SQL> INSERT INTO temp_table (num_col, char_col)
2
VALUES (-1, 'This is row -);
INSERT INTO temp_table(num_col, char_col)
ERROR at line 1;
ORA-20100: Please insert a positive value
ORA-06512: at "DEMO.ONLYPOSITIVE", line 3
ORA-04088: error during execution of trigger 'DEMO.ONLYPOSITIVE'
PL/SQL
73
: ,
.
; . ,
, :
f_j -- allthree.sql
DECLARE
/* */
v_StudentID NUMBER(5) := 10000;
v_FirstName VARCHAR2(20);
-
- 10000.
-
- 20.
BEGIN
/* */
-- , 10000.
SELECT first_name
INTO v_FirstName
FROM students
WHERE id = v_StudentID;
EXCEPTION
/* */
WHEN NO_DATA_FOUND THEN
- .
INSERT INTO log_table (info)
VALUES ('Student 10,000 does not exist!');
END;
,
tables, sql: students
log_table. , ,
, 1.
, , .
.
. . ,
SQL-.
. ; ,
.
4 6. , 7.
DECLARE (), BEGIN (), EXCEPTION ( ) END
(). , ,
. ,
:
74
DECLARE
/* */
BEGIN
/* */
EXCEPTION
/* */
END;
DECLARE
. ,
. DECLARE
(. 9 11).
,
BEGIN. , EXCEPTION
END . ,
, , :
BEGIN
/* */
END;
,
:
DECLARE
/* */
BEGIN
/* */
END;
|
/"
,,* /* */,
(. ).
, :
Q - nested.sql
DECLARE
/* */
v_StudentID NUMBER(5) := 10000; --
- 10000
v_FirstName VARCHAR2(20);
-
-- 20
BEGIN
/* */
PL/SQL
75
- , 10000
SELECT first_name
INTO v_FirstName
FROM students
WHERE id = v_StudentID;
- ,
BEGIN
INSERT INTO log_table(info)
VALUECHello from a nested block! ');
END;
EXCEPTION
/* */
WHEN NO DATA_FOUND THEN
- ,
-
BEGIN
-
INSERT INTO log_table(info)
VALUESCStudent 10,000 does not exist! ');
EXCEPTION
WHEN OTHERS THEN
- - INSERT
DBMS_OUTPUT.PUT_LINECError inserting into log_table! ');
END;
END;
PL/SQL . , , , PL/SQL.
:
: Z z
: 0-9
: ,
: + - * / < > =
: () {} [] ? ! - ; : . "' @ # % $ & _ |
PL/SQL , . SQL, PL/SQL . , .
,
.
, , .
76
PL/SQL,
, , . ,
, , , , #. . 30 , .
:
Q *
v_StudentID
TempVar
v1
v2_
social_security_#.
:
G
_temp_
First Name
This_is_a_really_long_identifier
1_variable
'~ +
-
- ,
-
- 30
-
-
PL/SQL , PL/SQL :
)
Room_Description
room_description
ROOM_DESCRIPTION
rOOm_DEscriPTIOn
(. ).
, ( ) , PL/SQL .
. , BEGIN END
PL/SQL, .
, begin . :
)
DECLARE
begin NUMBER;
PL/SQL
77
,
. ,
:
Q
DECLARE
v_BeginDate DATE;
,
. .
, , , ,
.
:
(_] "A number"
"Linda's variable"
"/"
"X/Y"
30 ( ).
, .
PL/SQL SQL-. PL/SQL , SQL (. ). ,
, exception ( ), :
)
DECLARE
v_Exception
VARCHAR2(10);
BEGIN
SELECT "EXCEPTION"
INTO v_Exception
FROM exception_table;
END;
, "EXCEPTION"
. Oracle , (
CREATE)
. , "EXCEPTION" .
, .
78
, PL/SQL
. PL/SQL
, SQL, , PL/SQL,
SQL.
exception_table .
except!on_table
PL/SQL,
. ,
,
.
PL/SOL.
, exception_table
:
CREATE TABLE exceptionable (
exception
VARCHAR2(20),
date_occured DATE);
:
CREATE VIEW exception_view AS
SELECT exception exception_description,
date_occured
FROM exception_table;
exception..table
exception_view,
exception_description,
.
( ),
PL/SQL.
.
PL/SQL 3.1.
3.1. PL/SQL
""
""
""
79
PL/SQL
3.1. PL/SQL ()
"
**
" "
!=
" "
( <>)
" "
( "=)
" "
( !=)
<=
"
"
>=
"
"
:=
=>
11
()
/*
*/
<space>
<tab>
<>
, ,
, -23.456 NULL. ,
"
PL/SQL".
( ) , . (
, SQL.) , CHAR VARCHAR2, . , :
'12345'
80
. , "Mike's string" :
'Mike''s string'
, PL/SQL ,
, :
,
,
. ,
. PL/SQL NULL-.
, . ,
'12345' , '01-JAN-2001'
(. ).
,
. , NUMBER. , .
, +
-. .
:
Q 123
_j
+12
(
), + -. :
-17.1
23.0
3.
23.0 3. ,
PL/SQL . . :
]
1.3457
9.87-3
-7.12+12
PL/SQL
81
6 NLS
(, ).
Oracle NLS. NLS Oracle9\
.
: TRUE (), FALSE
() NULL. () .
IF LOOP.
. PL/SQL .
: . -.
( ).
PL/SQL:
;
- comments.sql
DECLARE
v_Department
CHAR(3);
v_Course
NUMBER;
BEGIN
INSERT INTO classes (department, course)
VALUES (v_Department, v_Course);
END;
, :
Q comments.sql
DECLARE
82
v
v_Department CHAR(3); --
-
v_Course NUMBER;
-
BEGIN
- classes ,
- v_Department v_Course.
INSERT INTO classes (department, course)
VALUES (v_Department, v_Course);
END;
,
()
.
/* */, .
:
| comments.sql
DECLARE
v_Department
CHAR(3);
/*
*/
v_Course
NUMBER;
/* */
BEGIN
/* classes ,
v_Department v_Course. */
INSERT INTO classes (department, course)
VALUES (v_Department, v_Course);
END;
, , ..
. :
) -- comments.sql
BEGIN
/* .
/* */, . */
NULL;
END;
,
/*.
*/, .
PL/SQL
83
PL/SQL . * (variables) ,
. .
, ,
.
PL/SQL.
. , .
. :
_ [CONSTANT] [NOT NULL] [:= };
_ , , .
:
Q
DECLARE
v_Description VARCHAR2(50);
v_NuinberSeats NUMBER := 45;
v_Counter
BINARY_INTEGER := 0;
DECLARE
vJempVar NUMBER NOT NULL;
, v_TempVar , :
)
DECLARE
vJempVar NUMBER NOT NULL := 0;
CONSTANT,
84
.
" ". , ,
:
_)
DECLARE
cJunimumStudentlD CONSTANT NUMBER(5) := 10000;
v
Q
:=
DEFAULT ( ). :
DECLARE
v_NumberSeats
NUMBER DEFAULT 45;
v_Counter
BINARY_INTEGER DEFAULT 0;
v_FirstName
VARCHAR2(20) DEFAULT 'Scott 1 ;
. ,
:
)
DECLARE
v_FirstName, v_LastName VARCHAR2(20);
:
] DECLARE
v_FirstName VARCHAR2(20);
v_LastName
VARCHAR2(20);
, . .
;
, .
PL/SQL , , NULL.
NULL " ", , NULL . PL/SQL.
( Ada) . (, Java) .
PL/SQL
Oracle? PL/SQL : ,
. OracleS LOB
. , .
85
PL/SQL
: :
BINARY INTEGER
CHAR
DEC
CHARCTER
DECIMAL
LONG
1
DOUBLE PRECISION
NCHAR
1
FLOAT
NVARCHAR2
INT
STRING
INTEGER
VARCHAR
NATURAL
VARCHAR2
NATURALN
NUMBER
Rowid:
ROWID
NUMERIC
2
UROWID
PLS INTEGER
POSITIVE
POSITIVEN
Trusted:
REAL
MLSLABEL
SIGNTYPE
SMALLJNT
RECORD
NESTED TABLE1
INDEX-BY TABLE
VARRAY1
1
2
3
LOB
BFILE1
LOB1
CLOB1
NLOB1
:
DATE
3
INTERVAL DAY TO SECOND
3
INTERVAL YEAR TO MONTH
3
TIMESTAMP
3
TIMESTAMP WITH TIME ZONE
3
TIMESTAMP WITH LOCAL TIME ZONE
:
BOOLEAN
Raw:
RAW
LONG RAW
REF CURSOR
REF1
3
SYS.ANYTYPE3
SYS.ANYDATA3
SYS.ANYDATASET3
OracleS
OracleSi
Oracle9i
. 3.1. PL/SQL
. . 3.1
PL/SQL.
PL/SQL STANDARD. PL/SQL. , STANDARD SQL-
, PL/SQL.
, ,
,
. : , , RAW, ,
ROWID, Trusted.
. : NUMBER, PLS_INTEGER
BINARY_INTEGER. , NUMBER,
86
, ,
BINARYJNTEGER PLSJNTEGER - .
NUMBER , ,
. NUMBER, . :
NUMBER (P,S);
(precision), a 5 (scale). ,
. , , .
3.2.
3.2.
NUMBER
1234.5678
1234.5678
NUMBER(3)
123
123
NUMBER(3)
1234
NUMBER(4,3)
123.4567
NUMBER(4,3)
1.234567
1.235'
NUMBER(7,2)
12345.67
12345.67
NUMBER(3, -3)
1234
10002
NUMBER(3, -1)
1234
12302
' , ,
.
2
, , ,
.
38 ,
-84 127.
(subtype) .
,
(. ). NUMBER
, , , ,
NUMBER, .
, . NUMBER :
DEC
DECIMAL
DOUBLE PRECISION
FLOAT
PL/SQL
87
NUMERIC
REAL
, ,
DEC, DECIMAL NUMERIC 38 . DOUBLE PRECISION FLOAT 126 , 38 .
REAL 63 , 18 .
, INTEGER, INT SMALINT 38 .
BINARY_INTEGER , NUMBER, ,
. NUMBER.
, NUMBER
. , NUMBER,
PL/SQL , ( ) NUMBER .
, ,
BINARYJNTEGER. , -2 147 483 647 +2 147 483 647.
, ,
. BINARYJNTEGER .
NUMBER, BINARYJNTEGER . NUMBER BINARYJNTEGER , ..
. BINARYJNTEGER 3.3.
3.3. BINARYJNTEGER
NATURAL
NATURALN
POSITIVE
POSITIVEN
SIGNTYPE
PLS_INTEGER PLSJNTEGER ,
BINARYJNTEGER -. -2 147 483 647 +2 147 483 647, . ,
PLSJNTEGER, .
88
, BINARY_INTEGER, NUMBER ( )
. SQL*Plus (. "
"):
| -- integers, sql
SQL> DECLARE
2
v_Bin!nt BINARY_INTEGER;
3 BEGIN
4
- v_Bin!nt
5
vBinlnt := 2147483647;
6
/'
-- 1 v_Bin!nt ( ),
8 -- .
9
- BINARY_INTEGER,
10 -- .
11 v_Bin!nt := v_Bin!nt + 1 - 1 ;
12 END;
13 /
PL/SQL procedure successfully completed.
SQL DECLARE
2
v_PLSInt PLS_INTEGER;
3 BEGIN
4
- v_PLSInt
5 v_PLSInt := 2147483647;
6
7
- 1 v_PLSInt ( ),
8
- .
9
- PLS_INTEGER,
10
, ORA-1426.
11 v_PLSInt := v_PLSInt + 1 - 1 ;
12 END;
13 /
DECLARE
ERROR at line 1:
ORA-01416: numeric overflow
ORA-06512: at line 11
. VARCHAR2, CHAR
LONG, NCHAR NVARCHAR2 ( OracleS ).
VARCHAR2 VARCHAR2, . VARCHAR2
. , VARCHAR2, :
PL/SQL
89
VARCHAR2(L)
L (length) . . VARCHAR2 32 767 . ,
, VARCHAR2, 4000 . PL/SQL- VARCHAR2
4000 , , LONG, 2
GLOB (4 ). , LONG CLOB
VARCHAR2, 32 767 .
Oracle? ,
VARCHAR2, 2000 . ,
PL/SQL- VARCHAR2
Oracle? VARCHAR2,
2000 .
VARCHAR2 , .
, ASCII, EBCDIC Code Page 500 , Unicode.
,
,
VARCHAR2, , .
, .
VARCHAR STRING VARCHAR2.
: VARCHAR VARCHAR2?
VARCHAR ANSI, VARCHAR2 Oracle.
. ANSI
VARCHAR , Oracle VARCHAR2
,
19 VARCHAR2
VARCHAR2(L[CHAR|BYTE])
L . CHAR
BYTE , L
( CHAR). , , - 32 767 . ,
UTF8, .
UTF8 3 . , ,
VARCHAR2(300 BYTE), 100 .
90
CHAR
. CHAR :
CHAR[(L)]
L . VARCHAR2
. , , 1, . CHAR ,
.
, CHAR
(. 4).
CHAR 32 767 . , CHAR,
2000 . , CHAR 2000 ,
VARCHAR2 ( <= 4000 ) LONG. , LONG CHAR , 32 767 .
Oracle? , CHAR,
255 .
VARCHAR2, CHAR
, . , , VARCHAR2, ,
.
CHAR, , CHARACTER.
VARCHAR2 CHAR
(. 4).
19 CHAR
CHAR[(L[CHAR|BYTE])]
L . CHAR BYTE
, L
( CHAR). , , - 32 767 . ,
UTF8,
. UTF8 3 . , ,
CHAR(300 BYTE), 100 ( )
.
PL/SQL
91
RAW
. Oracle ,
. , ,
. , (raw
type), .
RAW RAW CHAR, .
RAW :
RAW(L) ,
L . RAW
. , RAW
.
92
3
RAW 32 767 .
RAW 2000 (255 Oracle?), ,
2000 , RAW .
, LONG RAW, 2 . , LONG RAW 32 767 , PL/SOJL- RAW.
LONG RAW LONG RAW LONG
, PL/SQL
.
LONG RAW 32 760 . LONG RAW
2 , , 32 760 , PL/SQL- LONG
RAW . PL/SQL- LONG RAW
LONG RAW ,
PL/SQL- LONG RAW LONG
RAW .
(/)
: DATE, TIMESTAMP
INTERVAL. TIMESTAMP INTERVAL OracleQ .
DATE PL/SQL DATE DATE, . DATE
, , , , , ,
. . DATE 7 ,
( ).
DATE DATE.
. TO_DATE
TO_CHAR . " "
5.
TIMESTAMP TIMESTAMP DATE ,
, , , ,
. . TIMESTAMP :
TIMESTAMP [(P)]
, 6.
TIMESTAMP WITH TIME ZONE
.
:
PL/SQL
93
ROWID
: ROWTD UROWID. UROWID
18 .
ROWID PL/SQL ROWID ,
ROWID .
(rowid),
, . ,
.
ROWTDTOCHAR. 18- , Oracle?
:
)
BBBBBBBB.RRRR.FFFF
, RRRR
, a FFFF .
. ,
Q
0000001E.OOFF.0001
30- , 255- ,
1. OracleS rowid
, 18-
, base-64.
94
rowid
DBMS_ROWID, .
PL/SQL;
ROWID . WHERE UPDATE DELETE.
UROWID , Oracle, , . ,
- rowid,
. ,
Oracle, ,
rowid. UROWID rowid
(.. ROWID), rowid. Oracle UROWID , .
rowid - "Oracle Concepts".
BOOLEAN.
PL/SQL, IF-THEN-ELSE LOOP. BOOLEAN: TRUE, FALSE NULL.
, 0
BOOLEAN:
DECLARE
v_ContinueFlag BOOLEAN := 0;
Trusted
MLSLABEL,
Trusted Oracle . Oracle , MLSLABEL, NULL-.
MLSLABEL 2 5
, , .
MLSLABEL
255 .
MLSLABEL Orac/eSi.
PL/SQL : , ( ) .
. , ,
( ).
PL/SQL
95
" PL/SQL", a
8.
PL/SQL , .
.
, (. ). .
PL/SQL , . , ,
.
Oracle 7 REF CURSOR, (. 4). OracleS
REF, .
LOB
LOB . (large object) , 4 .
, , LONG LONG RAW,
. LOB DBMSJLOB
(. 12).
,
( ) (). OracleS
. OracleQz ,
(. 12).
%TYPE
,
, PL/SQL. , , , . , first_name students
VARCHAR2(20). :
)
DECLARE
v_FirstName VARCHAR2(20);
96
, , first_name . , first_name
VARCHAR2(25). PL/SQL,
, :
Q
DECLARE
v_FirstName VARCHAR2(25);
PL/SQL ,
, , , . %TYPE.
. :
| DECLARE
v_FirstName students.first_name%TYPE;
%TYPE v'_FirstName
, first_name students. , (,
..). %TYPE
PL/SQL, .
%TYPE:
]
DECLARE
v_RoomID
v_RoomID2
v_TempVar
v_AnotherVar
%TYPE (),
() NOT NULL (, classes. room_id
v_TempVar), . , v_RoomID, v_RoomID2
v_AnotherVar . ,
NULL-.
%TYPE , PL/SQL ,
.
,
(subtype) PL/SQL, . , . PL/SQL
(, DECIMAL INTEGER - NUMBER) STANDARD.
:
SUBTYPE _ IS _;
97
PL/SQL
_ , _
. , , %TYPE. :
j_)
DECLARE
SUBTYPE.
:
U
DECLARE
SUBTYPE T_LoopCounter IS NUMBER (4);
--
: ( ) SUBTYPE %TYPE:
Q
DECLARE
v_DummyVar NUMBER (4);
- ,
--
SUBTYPE t_LoopCounter is v_DummyVar%TYPE;
- NUMBER(4)
v_Counter t_LoopCounter;
OracleSz. :
]
DECLARE
DECLARE
SUBTYPE t_Nutneric IS NUMBER; -- ,
v_Counter is t_Numeric (5);
-
, .
PL/SQL . , ,
. , CHAR(IO) VARCHAR2(1),
. , ,
NUMBER(3,2) NUMBER(3) . PL/SQL ,
.
98
:
.
, SQL,
PL/SQL. 3.4.
, .
5.
3.4. PL/SQL SQL
TO_CHAR
VARCHAR2
( )
TO_DATE
DATE
( )
TOJIMESTAMP"
TIMESTAMP
( )
TOJIMESTAMPJZ* TIMESTAMP
WITH TIMEZONE
( )
TO_DSINTERVAL*
INTERVAL DAY
SECOND
( )
TO_YMINTERVAL*
INTERVAL YEAR
MONTH
( )
TO_NUMBER
NUMBER
( )
RAWTOHEX
RAW
HEXTORAW
CHARTOROWID
ROWID
ROWIDTOCHAR
ROWID 18-
OracleSi .
,
,
RAW
(
)
(
18-
)
ROWID
PL/SQL
99
PL/SQL
, . , ,
, 10002:
_|
DECLARE
v_CurrentCredits VARCHAR2(5);
BEGIN
SELECT current_credits
INTO v_Currenteredits
FROM students
WHERE id = 10002;
END;
,
TO_CHAR. .
PL/SQL (. " "). : .
(scope) , .
PL/SQL .
100
, PL/SQL
, , . . 3.2 , v_Character ;
END . v_Number END
. .
fDECLARE
v Number NUMBER(3,2);
BEGIN
v_Number2 ^
DECLARE
v Character VARCHAR2( 10);
BEGIN
v_Character
END;
. 3.2.
(visibility) ,
. ; ,
. . 3.3. 1 v_AvailableFlag
v_SSN . 2
, v_AvailableFlag.
DECLARE
v AvailableFlag BOOLEAN;
v_SSN
NUMBER(9);
BEGIN
DECLARE
v_SSN
CHAR(11);
v_StartDate DATE;
BEGIN
END;
v_AvailableFlag
v_SSN NUMBER(9)
v_AvailableFlag,
v_StartDate v_SSN CHAR(11)
v_AvailableFlag
v_SSN NUMBER(9)
. 3.3.
101
PL/SQL
BOOLEAN;
NUMBER(9);
v AvailableFlag
v SSN NUMBER(9)
4"
DECLARE
v SSN
v StartDate
BEGIN
CHAR(H)'
DATE;
v_AvailableFlag, v_Stari:Date
v_SSN CHAR(11),
1 Outer.v SSN
v_SSN NUMBER(9)
END;
'
*-__
END;
^^~____
-_ v AvailableFlag
v_SSN NUMBER(9)
. 3.4.
PL/SQL.
. (expression)
, , (operator). , ,
.
102
(assignment).
:
:= ;
PL/SQL,
PL/SQL.
. :
Q
DECLARE
v_String1
VARCHAR2(10);
v_String2
VARCHAR2(15);
v_Numeric NUMBER;
BEGIN
v_String1 := 'Hello';
v_Strlng2 := v_String1;
v_Numeric := -12.4;
END;
, , (lvalue), ,
, (rvalue). , . , ,
. PL/SQL , 'Hello' -12. 4
. , , .
: 'Hello' , a v_String~l . , .
, .
, ,
(statement) PL/SQL . , :
Q
DECLARE
v_Va11 NUMBER;
v_Va12 NUMBER;
v_Va13 NUMBER;
BEGIN
v_Va11 := v_Va12 := v_Va13 := 0;
END;
PL/SQL (rvalues),
103
PL/SQL
. ,
SQL-. .
. PL/SQL
(, , ), (, , ). , (-) , (*) .
.
:
3 + 5*7
, 38 (3+35), 56 (8*7).
, , . , 56:
(3 + 5) * 7
3.5. PL/SQL
", NOT
*,/
,
,
, ,
(
IS NULL,
)
AND
OR
,
(| |).
( , ). ,
'Hello' || 'World' || ' i '
104
CHAR,
CHAR.
VARCHAR2, VARCHAR2. ,
CHAR, CHAR. v_Result , VARCHAR2:
]
DECLARE
VARCHAR2(10) := 'PL';
VARCHAR2(20);
v_Result
BEGIN
'/SQL';
v_Result := v_TempVar
v_TempVar
END;
PL/SQL ( GOTO) , . ,
, ,
(TRUE (), FALSE () NULL).
:
X > Y
NULL
(4 > 5) OR (-1 != Z)
AND
OR
TRUE FALSE NULL
TRUE TRUE TRUE TRUE
FALSE TRUE FALSE NULL
NULL TRUE NULL NULL
. .5.
PL/SQL
105
NULL- (,
NULL ).
NULL, , .
"NULL-".
, , , , .
, .
<
>
()
()
>=
IS NULL TRUE ,
NULL. NULL-
,
, NULL, NULL.
LIKE () , , Unix. (_)
, (%) . TRUE:
Q
TRUE:
)
IN () TRUE,
, . ,
FALSE:
[_] 'Scott' IN ('Mike', 'Pamela', 'Fred')
106
NULL-, ,
NULL
NULL.
PL/SQL
PL/SQL, ,
, .
.
PL/SQL.
IF-THEN-ELSE
IF-THEN-ELSE (--):
IF _! THEN
_1;
[ELSIF _2 THEN
_2; ]
[ELSE
_; ]
END IF;
_ , (. ). ELSIF ELSE , ELSIF . ,
, IFTHEN-ELSE ELSIF ELSE:
FJ if 1. sql
DECLARE
v_NumberSeats rooms.number_seats%TYPE;
v_Comment VARCHAR2(35);
BEGIN
/* , 20008.
v_NumberSeats. */
SELECT number_seats
INTO v_NumberSeats
FROM rooms
WHERE room_id = 20008;
IF v_NumberSeats < 50 THEN
v_Comment := 'Fairly small';
ELSIF v_NumberSeats < 100 THEN
v_Comment := 'A little bigger';
ELSE
v_Comment := 'Lots of room';
END IF;
END;
PL/SQL
107
,
. , .
Q v_NumberSeats < 50
FJ v_Comment := 'Fairly small';
50, :
) v_NumberSeats < 100
, :
) v_Comment := 'A little bigger';
, 100,
:
_} v_Comment := 'Lots of room';
.
. ( SQL-).
:
Q if2.sql
DECLARE
v_NumberSeats rooms.number_seats%TYPE;
v_Comment VARCHAR2(35);
BEGIN
/* , 20008.
v_NumberSeats. */
SELECT number_seats
INTO v_NumberSeats
FROM rooms
WHERE room_id = 20008;
IF v_NumberSeats < 50 THEN
v_Comment := 'Fairly small';
INSERT INTO temp_table (char_.col)
VALUES ('Nice and cozy');
ELSIF v_NumberSeats < 100 THEN
v_Comment := ' A little bigger';
INSERT INTO temp_table (char_col)
VALUES ('Some breathing room');
ELSE
v_Comment := 'Lots of room';
END IF;
END;
108
I
| ELSIF
.
Ada.
NULL
IF-THEN-ELSE
.
FALSE NULL,
. :
Q
/* 1 */
DECLARE
v_Number1
v_Number2
v_Result
BEGIN
NUMBER;
NUMBER;
VARCHAR2(7);
v_Result := 'Yes';
ELSE
v_Result := 'No';
END IF;
END;
/* 2 */
DECLARE
v_Number1 NUMBER;
v_Number2 NUMBER;
v_Result VARCHAR2(7);
BEGIN
IF v_Number1 >= v_Number2 THEN
v_Result := 'No';
ELSE
v_Result ;= 'Yes';
END IF;
END;
? ,
v_Number1 = 3, a v_Number2 = 7. 1 (3 < 7) , v_Result 'Yes'. 2
(3 >= 7), v_Result
'Yes'. v_Number1 v_Number2, NULL,
.
, v_Number1 = 3, a v_Number2 NULL.
? 1 (3 < NULL) NULL, ELSE v_Result 'No'. 2 (3 >= NULL )
NULL, ELSE
PL/SQL
109
END;
/* 2 */
DECLARE
v_Number1 NUMBER;
v_Number2 NUMBER;
vjtesult VARCHAR2(7);
BEGIN
IF v_Number"l IS NULL OR
v_Number2 IS NULL THEN
v_Result := 'Unknown'
ELSIF v_Number1 >= v_Number2 THEN
v_Result := ' N o ' ;
ELSE
v_Result := ' Y e s ' ;
END IF;
END;
IS NULL ,
NULL-. . NULL v_Result
'Unknown' (),
v_Number NULL- . v_Number1
v_Number2 , ,
NULL- ;
.
110
CASE
IF-THEN-ELSE
.
, ,
:
)
case.sql
DECLARE
v_Major students.major%TYPE;
v_CourseName VARCHAR2(10);
BEGIN
-
SELECT major
INTO v_Major
FROM students
WHERE ID = 10011;
-
IF v_Major = 'Computer Science' THEN
v_CourseName = 'CS 101';
ELSIF v_Major = 'Economies' THEN
v_CourseName = 'ECN 203';
ELSIF v_Major = 'History' THEN
v_CourseName = 'HIS 101';
ELSIF v_Major= 'Music' THEN
v_CourseName = 'MUS 100';
ELSIF v_Major = 'Nutrition' THEN
v_CourseName = 'NUT 307';
ELSE
v_CourseName = 'Unknown';
END IF;
DBMS_OUTPUT.PUT_LINE(v_CourseName);
END;
v_Major
ELSIF. OracleQ , . CASE. , CASE :
CASE test_var
WHEN _1 THEN __1;
WHEN _2 THEN __2;
WHEN _ THEN __;
[ELSE _1$;]
END CASE;
test_var , _1... _ , __1 ... __ .
PL/SQL
111
test_var, CASE,
, .
,
. test_var
, CASE. ,
_1... test_var.
, CASE. He
break, .
CASE ELSE
ELSE CASE .
,
112
A3
BEGIN
1
- WHEN 1,
5
- ORA-6592.
6
CASE v_TestVar
7
WHEN 2 THEN DBMS_OUTPUT.PUT_LINE('Two!');
8
WHEN 3 THEN DBMS_OUTPUT.PUT_LINE('Three!');
9
WHEN 4 THEN DBMS_OUTPUT. PUT_LINEC Four! ');
10 END CASE;
11 END;
12 /
DECLARE
*
ERROR at line 1:
ORA-06592; CASE not found while executing CASE statement
ORA-06512: at line 6
ELSE:
]
, , 7.
CASE
PL/SQL, CASE . (. ). CASE , END CASE,
:
rj case.sql
DECLARE
v_TestVar NUMBER := 1;
BEGIN
- CASE
MyCase
CASE v_TestVar
WHEN 1 THEN DBMS_OUTPUT.PUT_LINE('One! ');
WHEN 2 THEN DBMS_OUTPUT.PUT_LINE('Two!');
WHEN 3 THEN DBMS_OUTPUT.PUT_LINE('Three!');
WHEN 4 THEN DBMS_OUTPUT.PUT_LINE('Four!');
END CASE MyCase;
END;
END CASE ,
CASE , .
PL/SQL
113
CASE
CASE WHEN
. CASE ,
:
CASE
WHEN testl THEN __1;
WHEN fest2THEN __2;
WHEN testa THEN __;
[ELSE _1;]
END CASE;
;
WHEN . IF-THEN,
TRUE, . CASE . ,
.
Q
case.sql
SQL> DECLARE
2
v_Test1 NUMBER := 2;
3
v_Test2 VARCHAR2(20) := ' G o o d b y e ' ;
4 BEGIN
5
CASE
6
7
8
9
10
11
12
WHEN v_Test2 = 'Goodbye!' THEN
13
DBMS_OUTPUT.PUT_LINEfGoodbye! ');
14
DBMS_OUTPUT.PUT_LINE('Adios! ');
15
ELSE
16
DBMS_OUTPUT.PUT_LINE('No match');
17
END CASE;
18 END;
19 /
> 1!
Still > 1!
A3
114
( ) :
LOOP
_;
END LOOP;
, . , EXIT (),
:
EXIT [WHEN ]
, temp_table
50 :
) simple.sql
DECLARE
v_Counter BINARY_INTEGER := 1;
BEGIN
LOOP
- temp_table
- .
INSERT INTO temp_table
VALUES (v_Counter, 'LOOP index');
v_Counter := v_Counter + 1;
- : : > 50,
- .
IF v_Counter > 50 THEN
EXIT;
END IF;
END LOOP;
END;
EXIT WHEN
IF THEN
EXIT;
END IF;
PL/SQL
115
, :
} exitwhen.sql
DECLARE
v_Counter BINARY_INTEGER := 1;
BEGIN
LOOP
- temp_table
- .
INSERT INTO temp_table
VALUES (v_Counter, 'Loop index');
v_Counter := v_Counter + 1;
- : > 50,
- .
WHILE
WHILE ( ) :
WHILE LOOP
_ ;
END LOOP;
() .
, .
NULL-,
, END LOOP. ,
WHILE:
| while"!. sql
DECLARE
v_Counter BINARY_INTEGER := 1;
BEGIN
-
- , 50.
WHILE v_Counter <= 50 LOOP
INSERT INTO temp_table
VALUES (v_Counter, 'Loop index');
v_Counter ;= v_Counter + 1;
END LOOP;
END;
116
v_Counter BINARY_INTEGER;
BEGIN
- NULL,
- v_Counter NULL-.
WHILE v_Counter <= 50 LOOP
INSERT INTO temp_table
VALUES (v_Counter, 'Loop index');
v_Counter := v_Counter + 1;
END LOOP;
END;
FOR
WHILE , .
FOR . FOR :
FOR _IN [REVERSE] _,.. _1)
_ ;
END LOOP;
_ , _
'_ , _ .
, . 1 ,
. FOR:
[_) forloop.sql
BEGIN
FOR v_Counter IN 1 . . 5 0 LOOP
INSERT INTO temp_table
VALUES (v_Counter, 'Loop Index');
END LOOP;
END;
, ()
FOR BINARY_INTEGER. . , ,
:
rj forscope.sql
DECLARE
v_Counter NUMBER := 7;
PL/SQL
117
BEGIN
- 7 temp_table.
INSERT INTO temp_table (num_col)
VALUES (v_Counter);
- v_Counter BINARY_INTEGER,
- v_Counter NUMBER.
FOR v_Counter IN 20..30 LOOP
- v_Counter 20 30.
INSERT INTO temp_table (num_col)
VALUES (v_Counter);
END LOOP;
- 7 temp_table.
INSERT INTO temp_table (num_col)
VALUES (v_Counter);
END;
REVERSE FOR
REVERSE ( ), . , -
:
Q
BEGIN
END;
. , . :
Q DECLARE
v_LowValue NUMBER := 10;
v_HighValue NUMBER := 40;
BEGIN
FOR v_Counter IN REVERSE v_LowValue . . vJHighValue LOOP
INSERT INTO temp_table
VALUES (v_Counter, 'Dynamically specified loop ranges');
END LOOP;
END;
GOTO
PL/SQL GOTO (
). :
GOTO
118
, PL/SQL. . GOTO ,
. :
Q - goto.sql
DECLARE
v_Counter BINARY_INTEGER := 1;
BEGIN
LOOP
INSERT INTO temp_table
VALUES (v_Cour,ter, ' Loop count');
v_Counter := v_Counter + 1;
IF v_Counter > 50 THEN
GOTO !_EndOfLoop:
END IF;
END LOOP;
!_EndOfLoop
END;
GOTO
PL/SQL GOTO
.
, IF. :
Q BEGIN
GOTO l_InnerBlock; -- ,
-
BEGIN
l_InnerBlock
END;
GOTO l_lnsidelf;
- ,
- IF
IF > 3 THEN
l_lnsidelf
INSERT INTO . . .
END IF;
END;
, IF
, IF . ,
, INSERT , = 2.
, IF :
PL/SQL
119
BEGIN
IF x > 3 THEN
GOTO l_NextCondition;
ELSE
l_NextCondition
END IF;
END;
,
. 7.
Q
DECLARE
v_Room rooms%ROWTYPE;
BEGIN
- rooms.
SELECT *
INTO v_Room
FROM rooms
WHERE rowid = 1;
l_Insert
INSERT INTO temp_table (char_col)
VALUES ('Found a row! ');
EXCEPTION
WHEN NO_DATA F*OUND THEN
GOTO l_Insert; - ,
-
END;
. EXIT , . :
Q
BEGIN
l_0uter
FOR v_0uterlndex IN 1.. 50 LOOP
l_Inner
FOR v_lnnerlndex IN 2.. 10 LOOP
IF v_0uterlriex > 40 THEN
EXIT l_0uter; -
END IF;
END LOOP l_Inner;
END LOOP l_0uter;
, END
LOOP, .
120
A 3
GOTO
GOTO .
GOTO :
, .
GOTO
PL/SQL,
.
.
.
NULL
,
. NULL,
;
. :
| - null.sql
DECLARE
v_TempVar NUMBER := 7;
BEGIN
IF v_TempVar < 5 THEN
INSERT INTO tempjtable (char_col)
VALUES ('Too small1);
ELSIF vJTempVar < 20 THEN
NULL; --
ELSE
INSERT INTO temp_table (char_col)
VALUES (Too big 1 );
END IF;
END;
(pragma) ,
#def ine .
PL/SQL, . , RESTRICT_REFERENCES ( )
SQL- (. 10). , , .
,
PL/SQL Ada.
PL/SQL
(NUMBER, VARCHAR2, DATE ..) STANDARD.
PL/SQL
121
. , .
,
(. ).
PL/SQL . ,
. :
[_J
DECLARE
v_StudentID NUMBER(5);
v_FirstName VARCHAR(20);
v_LastName
VARCHAR2(20);
, students.
, . :
[_j
DECLARE
/* */
TYPE t_StudentRecord IS RECORD (
StudentID
NUMBER(5),
FirstName VARCHAR2(20),
LastName
VARCHAR2(20));
/* */
v_Student!nfo t_StudentRecord;
:
TYPE recvrd_typeIS RECORD (
fieldl typel [NOT NULL] [:= exprl],
field2 type2 [NOT NULL] [:= exprZ],
fieldn typen [NOT NULL] [:= exprn],
record_type , fieldl ... fieldn ,
type! ... typen .
.
, , NOT
NULL . exprl ... exprn
. ,
NOT NULL . ^SampleRecord :
) DECLARE
TYPE t_SampleRecord IS RECORD (
Count
NUMBER(4),
Name
VARCHAR(IO) := 'Scott',
EffectiveDate
DATE,
Description
VARCHAR2(45) NOT NULL := 'Unknown');
122
v_Sample1
v_Sample2
t_.SampleRecord;
t_.SampleRecord;
, ,
NOT NULL,
.
NULL. DEFAULT, :=
.
:
_. _
, v_Sample1 v_Sample2:
F_j BEGIN
/* SYSDATE ,
*/
v_Sample1.EffectiveDate := SYSDATE;
v_Sample2.Description := 'Pesto Pizza';
END;
(rvalue)
.
,
. , v_Sample1 v_Sample2 :
3 v_Sample1 := v_Sample2;
v_Sample1 v_Sample2. ,
, .
"PLS-382: expression is of wrong
type" ( ):
Q - RecordAssignment. sql
DECLARE
TYPE t_Rec1Type IS RECORD (
Field! NUMBER;
Field2 VARCHAR2(5));
TYPE t_Rec2Type IS RECORD (
Field"! NUMBER;
Field2 VARCHAR2(5));
v_Rec1 t_Rec1Type;
v_Rec2 t_Rec2Type;
BEGIN
/* v_Rec1 v_Rec2 ;
. ,
PL/SQL
123
PLS-382. */
v_Rec~l := v_Rec2;
/* ,
. */
v_Rec1.Field1 := v_Rec2.Field1;
v_Rec2.Field2 := v_Rec2. Field2;
END;
SELECT.
. , .
:
RecordSelect.sql
DECLARE
- students.
- %TYPE .
TYPE t_StudentRecord IS RECORD (
FirstName students.first_name%TYPE;
LastName students.last_name%TYPE;
Major students.major%TYPE);
-
v_Student t_StudentRecord;
BEGIN
- ID, 10000.
- , ,
-- v_Student.
SELECT first_name, last_name, major
INTO v_Student
FROM students
WHERE ID = 10000;
END;
Oracle9z INSERT
UPDATE (. 4).
%ROWTYPE
PL/SQL
, . PL/SQL
%ROWTYPE. %TYPE, %ROWTYPE
. , ,
[_j DECLARE
v_RoomRecord rooms%ROWTYPE;
, rooms.
, v_RoomRecord :
124
(room_id
building
Voom_number
number_seats
description
NUMBER(5),
VARCHAR2(15),
NUMBER(4),
NUMBER(4),
VARCHAR2(50))
PL/SQL
- . ,
, , , .
, , .
, , .
, , , . ,
,
.
,
.
PJ declare
number;
number;
begin if < 10 then := 7; else := 3; end if; end;
DECLARE
v_Test NUMBER;
-,
v_Result NUMBER;
-
BEGIN
- v_Test. v_Result 7, v_Test < 10.
IF v_Test < 10 THEN
v_Result := 7;
ELSE
v_Result := 3;
END IF;
END;
, .
PL/SQL
125
, .
. PL/SQL.
,
. :
/ . , (). , ,
( )
( ).
, , . .
. ,
. ,
:
[_J
V_SSN CHAR(11);
, . , , .
, , .
, .
:
" , ?" ,
- !
,
. , , , PL/SQL, :
3 DECLARE
v_Temp NUMBER := 0; -- v_Temp
,
v_Temp:
]
DECLARE
126
v_Temp NUMBER := 0;
- ,
.
_)
number;
, .
)
v_StudentID NUMBER(5);
, , ,
. , PL/SQL 30
.
.
. : , . :
] v_VariableName
e_ExceptionName
t_TypeName
p_ParameterName
c_ConstantValue
,
,
, CONSTANT ()
PL/SQL . . :
(, BEGIN, DECLARE, ELSIF).
(SUBSTR,
COUNT, TO_CHAR).
(NUMBER(7,2), BOOLEAN, DATE).
SQL (SELECT,
INTO, UPDATE, WHERE).
(log_table, classes,
students).
'.
; (v_HireDate,
e_TooManyStudents, t_StudentRecordType).
PL/SQL
127
, , ( , ). .
IF-THEN-ELSE:
)
:
; DECLARE..END; . , SQL-,
, :
_| SELECT id, first_name, last_name
INTO v_StudentID, V_FirstName, v_LastName
FROM STUDENTS
WHERE id = 10002;
PL/SQL , ,
. . . ,
, , .
, ,
, , , PL/SQL. PL/SQL.
-
, , , PL/SQL.
128
PL/SQL:
PL/SQL, (, -,
), , . ,
PL/SQL, . SQL- .
8.
4
SQL PL/SQL
ABA 4
130
SQL
SQL . 4.1
, .
SQL- "Server SQL
Reference".
(DML,
Data Manipulation Language) , , .
(DDL, Data Definition Language) ,
. DDL , .
. SQL- , ,
.
, ,
SQL .
, , ,
.
SQL PL/SQL
131
.
. , SQL *Plus
, spool ( )
set serveroutput (
DBMS_OUTPUT ). *
SQL, allocate (
) connect (
).
2.
4.1. SQL-
SQL-
(DML)
(DDL)
ALTER SYSTEM
SQL PL/SQL
SQL- PL/SQL
DML .
DDL . EXPLAIN PLAN ( )
DML . , PL/SQL.
, . (binding)
, .
PL/SQL , .
, (early binding), , , (late binding),
. ,
( ), ,
. , .
PL/SQL
,
. , PL/SQL
132
, , . , ..
(. 9 -^ 11). DDL. DDL , ,
.
,
.
PL/SQL:
Q
BEGIN
SQL
,
PL/SQL SQL, DDL. SQL. SQL ,
,
. , PL/SQL , .
SQL PL/SQL: SQL (18' )
DBMS_SQL. ,
SQL CREATE TABLE, . INSERT ,
.
SQL. SQL temp_table
:
)
BEGIN
133
SQL PL/SQL
char_value CHAR(10))';
EXECUTE IMMEDIATE 'INSERT INTO temp_table (num_value, char_value)
1
VALUE(10, "Hello") ;
END;
SQL
12.
DML PL/SQL
DML SELECT (), INSERT
(), UPDATE () DELETE ().
: SELECT , WHERE;
INSERT ; UPDATE
, WHERE;
DELETE . WHERE, (. ).
SQL- SQL*Plus,
(. . 4.1). UPDATE, INSERT DELETE
SQL*Plus , SELECT
, .
l4kOiacleSQL"Plus
HHQI
*.^^^^^^^^^^^^^*^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
File Edit Search Options Help
jd
LAST_NAME
MAJOR
Scott
Joanne
Manish
Barbara
Margaret
Patrick
Timothy
Dauid
Rose
Ester
Rita
Smith
Junebug
Murgratroid
Blues
Mason
Poll
Taller
Dinsmore
Riznit
Elegant
Razmataz
Computer Science
Computer Science
Economics
Economics
History
History
History
Music
Music
Nutrition
Nutrition
11 rows selected.
SQL> UPDATE CLASSES
2
3
1 row updated.
SQL> commit;
Commit complete.
SQL>
JLJJ
. 4.1. SQL- SQL*Plus
134
UPDATE, . 4.1:
UPDATE CLASSES
SET num_credits = 3
WHERE department = 'HIS'
AND course = 101;
, classes,
, .. . PL/SQL .
SQL-, . , , (bind variable).
, UPDATE
, , :
- BindVariable.sql
DECLARE
v_NumCredits classes.num_credits%TYPE;
BEGIN
/* v_NumCredits */
v_NumCredits := 3;
UPDATE CLASSES
SET num_credits = v_NumCredits
WHERE department = 'HIS'
AND course = 101;
END;
.
SQL- .
, .
, Oracle
. , . , SQL.
SELECT
SELECT PL/SQL. SELECT
.
SELECT
> INTO
-jf- __ -i
, -4
.I
<--> __ ^J
t
.
1
1
* 3arwcb_PL/SQL ,
1
Lw WHERE
WUCRF
* FROM
j>
k.
*-
M/HFBFJ
WHERE-
SQL PL/SQL
135
.
SELECT
__ ( ).
.
(select list).
* .
, .
PL/SQL, .
.
.
3anncb_PL/SQL
.
, .
.
,
(. 3).
*,
__%\.
__
, .
,
.
. __
.
, ,
, ,
(!/ ) inline- (.
" "),
WHERE
, ,
. WHERE
,
(. " WHERE").
SELECT
, ORDER BY ( ) GROUP
BY ( ). SELECT
, UNION MINUS.
Server SQL Reference".
SELECT, ,
.
,
, PL/SQL :
136
(. 6).
SELECT:
)
-- select.sql
DECLARE
v_StudentRecord
students%ROWTYPE;
v_Department
classes.department%TYPE;
v_Course
classes.course%TYPE;
BEGIN
- students
- v_StudentRecord. ,
- WHERE .
-
- students ( *), ,
- , students%ROWTYPE.
SELECT *
INTO v_StudentRecord
FROM students
WHERE id = 10000;
- classes
- v_Department v_Course. WHERE
- .
SELECT department, course
INTO v_Department, v_Course
FROM classes
WHERE room_id = 20003;
END;
INSERT
INSERT . ,
WHERE.
-> INSERT
( . > _
VALUES
* INTO
* __-
SQL PL/SQL
137
___ Oracle, _
, SQL
PL/SQL, . . INSERT
_, ,
. , SQL.
-:"
SELECT, INSERT .
,
VALUES (. "Server SQL Reference").
INSERT:
- insert, sql
DECLARE
v_StudentID students.id%TYPE;
BEGIN
- .
SELECT student_sequence.NEXTVAL
INTO v_StudentID
FROM dual;
- students.
INSERT INTO students (id, first_name, last_name)
VALUES (v_StudentID, 'Timothy', 'Taller');
- ,
- INSERT.
INSERT INTO students (id, first_name, last_natne)
VALUES (student_sequence.NEXTVAL, 'Patrick', 'Poll');
END;
INSERT,
, . : "ORA-913:
Too many values" ( ).
INSERT INTO rooms
SELECT * FROM classes;
. temp_table:
INSERT INTO temp_table
SELECT * FROM temp_table
OracleS, ,
INSERT REF INTO.
, (. 12).
138
UPDATE
UPDATE :
* UPDATE
* __
>=
WHERE |
> SET
>
>
> _
> ycnoene_where
CURRENT OF
'
__ ( ), _ , , SQL, 3.
_, SET (). 'CURRENT OF '
(. 6).
UPDATE:
Q update.sql
DECLARE
v_Major
students.majr%TYPE;
v_Credit!ncrease NUMBER := 3;
BEGIN
- UPDATE
- current_credits ,
- , 3.
v_Major := 'History';
UPDATE students
SET current_credits = current_credits + v_Credit!ncrease
WHERE major = V_Major;
- UPDATE temp_table
-
UPDATE temp_table
SET num_col = 1, char_col = 'abed';
END;
DELETE
DELETE . WHERE , . DELETE
.
SQL PL/SQL
139
-> DELETE |
1
WHERE
> FROM
> __ -
* ycnoene_where
'* CURRENT OF
__, Oracle (
), a ycAoeue_where ,
. 'CURRENT OF '
(. 6).
WHERE .
,
DELETE:
- delete.sql
DECLARE
v_StudentCutoff NUMBER;
BEGIN
v_StudentCutoff := 10;
- ,
-- .
DELETE FROM classes
WHERE current_students < v_StudentCutoff;
- -,
-- .
DELETE FROM students
WHERE current_credits = 0
AND major = 'Economies';
END;
DELETE ,
,
tables, sql.
classes.
"Server SQL Reference".
WHERE
SELECT, UPDATE DELETE WHERE. (active set) , SELECT UPDATE DELETE.
WHERE ,
AND (), OR () NOT ().
, :
140
Q -- WhereClause.sql
DECLARE
v_Department CHAR(3);
BEGIN
v_Department := ' C S ' ;
-
DELETE FROM classes
WHERE department = v_Department;
END;
,
v_Department department:
PJ WhereClause.sql
DECLARE
Department CHAR(3);
BEGIN
Department := ' C S ' ;
-
DELETE FROM classes
WHERE department = Department;
END;
: classes ,
, 'CS'! SQL- . PL/SQL
Q 1 = 2
,
.
PL/SQL . PL/SQL , department, Department classes, .
, .
, , ,
. ,
, .. , department = 'CS'.
Q - WhereClause.sql
l_DeleteBlock
DECLARE
SQL PL/SQL
141
Department CHAR(3);
BEGIN
Department := ' C S ' ;
-
DELETE FROM classes
WHERE department = l_DeleteBlock.Department;
END;
,
PL/SQL
(. 3).
Oracle
: .
. ,
s t r i n g l string2. :
1. ,
, .
2. , . ,
c h a r l stringl char2 string2.
3. ASCII(charl) < ASCII(char2), s t r i n g l < s t r i n g 2 .
ASCII(charl) > ASCII(char2), s t r i n g l > string2. ASCII(charl) =
ASCII(char2), s t r i n g l string2.
4. , .
:
)
- ,
:
1. , . ,
charl s t r i n g l c h a r 2 string2.
2. ASCII(charl) < ASCII(char2), s t r i n g l < s t r i n g 2 .
ASCII(charl) > ASCII(char2), s t r i n g l > string2. ASCII(charl)
= ASCII(char2), s t r i n g l string2.
3. s t r i n g l string2, s t r i n g l <
string2. s t r i n g 2 s t r i n g l ,
stringl > string2.
4. , .
142
:
_|
'abc' = 'abc'
' a b ' < 'abc'
'abed' > 'abcc'
, , ,
. .
) 'abc
' = 'abc'
- .
? PL/SQL ,
.
, . CHAR , VARCHAR2 . ,
( ) .
, , . WHERE.
, ,
v_Department VARCHAR2, CHAR.
)
WhereClause.sql
DECLARE
v_Department VARCHAR2(3);
BEGIN
v_Department := ' C S ' ;
-
DELETE FROM classes
WHERE department = v_Department;
END;
SQL PL/SQL SQL.
SQL
PL/SQL. , :
SQL PL/SQL
143
-- bulkDeno.sql
DECLARE
TYPE t_Numbers IS TABLE OF temp_table. num_col%TYPE
INDEX BY BINARY_INTEGER;
TYPE t_Chars IS TABLE OF temp_table.char_col%TYPE
INDEX BY BINARY_INTEGER;
v_Numbers t_Numbers;
v_Chars t_Chars;
BEGIN
-- 500
FOR v_Count IN 1..500 LOOP
v_Numbers(v_Count) := v_Count;
v_Chars(v_Count) := 'Row number' || v_Count;
END LOOP;
-
FOR v_Count IN 1..500 LOOP
INSERT INTO temp_table VALUES
(v_Numbers(v_Count), v_Chars(v_Count));
END LOOP;
END;
PL/SQL,
Java.
8.
temp_table 500 .
INSERT . 500
PL/SQL SQL.
OracleSi , PL/SQL SQL ,
(bulk bind).
FORALL, :
bulkOemo.sql
DECLARE
TYPE t_Numbers IS TABLE OF temp_table. num_col%TYPE
INDEX BY BINARY_INTEGER;
TYPE t_Chars IS TABLE OF temp_table. char_col%TYPE
INDEX BY BINARY_INTEGER;
v_Numbers t_Numbers;
v_Chars t_Chars;
BEGIN
- 500
FOR v_Count IN 1. .500 LOOP
v_Numbers(v_Count) := v_Count;
v_Chars(v_Count) := 'Row number ' || v_Count;
END LOOP;
144
FORALL v_Count IN 1..500
INSERT INTO temp_table VALUES
(v_Numbers(v_Count), v_Chars(v_Count));
END; '
(. 12).
RETURNING
,
DML, , rowid .
. SELECT
DML. SQL
RDBMS. OracleS : RETURNING.
DML, . RETURNING:
> RETURNING!
- , *|
^*
"-->
'4 INTO *
->
2
v_NewRowid ROWID;
3 v_FirstName students. first_name%TYPE;
4 v_Last_Name students. last_name%TYPE;
5 v_ID students. ID%TYPE;
6 BEGIN
- students
8
- rowid .
9
INSERT INTO students
10
(ID, first_name, last_name, major, current_credits)
11
12
13
14
15
16
VALUES
(student_sequence.NEXTVAL, ' X a v i e r ' , 'Xemes', 'Nutrition', 0)
RETURNING rowid INTO v_NewRowid;
17
Iff
- , ,
-
SQL PL/SQL
19
145
UPDATE students
20
21
22
23
DML . :
[.] \@ __]
, ___ ,
.
,
. SQL-, ,
. , :
)
UPDATE students
SET major = 'Music'
WHERE id = 10005;
( students) , , .
, :
] ORA-942: table or view does not exist
( )
146
,
- SQL PL/SQL.
,
, :
UPDATE example.students
SET major = 'Music'
WHERE id = 10005;
Orac/eSi
TABLEf),
(. 8). Oracle9't
(. 12).
SQL*Net,
. (database link) , , .
DDL:
CREATE DATABASE LINK _
CONNECT TO _ IDENTIFIED BY
USING sqlnet_cmpoKa;
, . , a sqlnet_cmpoK(i
. , , SQL*Net .
:
CREATE DATABASE LINK example_backup
CONNECT TO example IDENTIFIED BY example
USING 'backup_database';
SQL*Net "SQL*Net User's Guide and Reference". students:
UPDATE students@exarople_backup
SET major = 'Music'
WHERE id = 10005;
SQL PL/SQL
147
, (distributed transaction),
. ,
"Server SQL
Reference".
,
/ . Oracle . (synonym), , ,
, (alias) .
DDL- CREATE SYNONYM:
CREATE SYNONYM _ FOR ',
_ ,
. , , . :
) CREATE SYNONYM backup_students
FOR students@example_backup;
UPDATE:
Q UPDATE backup_students
SET major = 'Music'
WHERE id = 10005;
>:
- ,
;
.
(pseudocolumns) ,
SQL-. , .
SQL-.
CURRVAL NEXTVAL
CURRVAL ( ) NEXTVAL (
) . (sequence) Oracle,
148
nocnedoeamenbHocmb.NEKTVAL
. CURRVAL , a NEXTVAL
. CURRVAL, NEXTVAL , NUMBER. CURRVAL NEXTVAL.
, VALUES INSERT SET UPDATE.
WHERE PL/SQL. CURRVAL NEXTVAL:
] tables.sql
CREATE SEQUENCE student_sequence
START WITH 10000
INCREMENT BY 1;
-
10000.
INSERT INTO students (id, first_name, last_name, major,
current_credits)
VALUES (student_sequence.NEXTVAL, ' S c o t t 1 , 'Smith',
'Computer Science', 11);
-
-- 10001.
INSERT INTO students (id, first_name, last_name, major,
current_credits)
VALUES (student_sequence.NEXTVAL, 'Margaret', 'Mason',
'History', 4);
SQL*Plus CURRVAL
(, 12- students tables, sql):
Q SQL> SELECT student_sequence.CURRVAL
2
FROM dual;
CURRVAL
10011
SQL PL/SQL
149
LEVEL
LEVEL () SELECT , START WITH ( ) CONNECT BY ( ).
LEVEL NUMBER.
"Server SQL Reference".
ROWID
ROWID ( )
.
ROWID (. 3). ROWTD ROWID. , rooms:
Q
ROWNUM
ROWNUM .
WHERE SET
UPDATE. , ROWNUM, NUMBER. , students:
SELECT *
FROM students
150
ROWNUM 1, ROWNUM 2 ..
ROWNUM
( ORDER BY).
ROWNUM ,
. :
rj SELECT first_name, last_name
FROM students
WHERE ROWNUM < 3
ORDER BY first_name;
students, first_name.
, . , (. 6).
(inline) ORDER
BY (. "Server SQL Reference").
GRANT, REVOKE
DDL, GRANT () REVOKE (),
PL/SQL, SQL-. Oracle , INSERT
DELETE, , SQL- GRANT REVOKE.
: .
(object privilege) (, ). (system privilege)
.
4.2 .
DDL ALTER (), INDEX (), REFERENCES ()
PL/SQL ( SQL),
DDL .
,
DDL. ,
CREATE TABLE .
CREATE ANY TABLE
. "Server SQL Reference".
151
SQL PL/SQL
4.2. SQL
ALTER
DELETE
, ,
ALTER
(, ALTER TABLE).
DELETE.
PL/SQL
(. 9 11).
CREATE INDEX.
INSERT.
EXECUTE
INDEX
INSERT
ON COMMIT
REFRESH2
QUERY
REWRITE2
READ1
REFERENCES
SELECT
UNDER3
UPDATE
, ,
,
OracleS
Oracleffi
Oracle9i
,
commit.
,
.
.
,
.
SELECT.
,
.
UPDATE.
152
GRANT REVOKE
GRANT ,
REVOKE , GRANT.
, .
GRANT
GRANT :
GRANT ON _
[WITH GRANT OPTION];
, ,
, _ ,
. , userA . GRANT :
| GRANT SELECT ON classes TO userA;
GRANT :
GRANT _ [WITH ADMIN OPTION];
, _ , .
WITH ADMIN OPTION ( ), _ . :
] GRANT CREATE TABLE, ALTER ANY PROCEDURE TO userA;
,
GRANT .
GRANT DDL,
, ,
(COMMIT) .
REVOKE
REVOKE :
REVOKE ON FROM _
[CASCADE CONSTRAINTS] [FORCE];
, , , _ , . :
SQL PL/SQL
153
REVOKE :
REVOKE FROM _;
, _ , .
:
| REVOKE ALTER TABLE, EXECUTE ANY PROCEDURE FROM userA;
Oracle, , . Oracle, .
(role) , , , ,
. :
| CREATE ROLE table_query;
GRANT SELECT ON students TO table_query;
GRANT SELECT ON classes TO table_query;
GRANT SELECT ON rooms TO table_query;
table_query SELECT .
:
Q GRANT table_query TO userA;
GRANT table_query TO userB;
SELECT userA
userB. : .
Oracle PUBLIC (), .
Q
GRANT PUBLIC;
Oracle.
Oracle ,
. OracleQz 4.3. Oracle SYSTEM .
154
4.3.
CONNECT
RESOURCE
DBA
( ADMIN OPTION;
), EXP FULL DATABASE
IMP_FULL_DATABASE
Oracle ,
.
CONNECT () RESOURCE () , ,
, ,
CONNECT. , .
(transaction) SQL-, ( ) .
, . . SQL-,
, transaction_amount, (f rom_acct) (to_acct).
(_J UPDATE accounts
SET balance = balance - transaction_amount
WHERE account_no = from_acct;
UPDATE accounts
SET balance = balance + transaction_amount
WHERE account_no = to_acct;
, UPDATE , (, - ).
f rom_acct,
155
SQL PL/SQL
to_acct. He , ( f rom_acct ).
, . , , .
SQL-,
. COMMIT ROLLBACK.
COMMIT ROLLBACK
COMMIT (),
:
, , .
,
.
, , .
COMMIT:
COMMIT [WORK];
WORK () . , ,
(. 4.2).
INSERT. rooms, , , INSERT .
, SELECT
.
COMMIT
. 4.2.
SELECT .
FROM rooms
WHERE building = 'Building 7'
SELECT *
FROM rooms
WHERE building = 'Building 7'
156
ROLLBACK (),
:
, , ,
.
, ', .
ROLLBACK:
ROLLBACK [WORK]
COMMIT, WORK
. ROLLBACK
,
.
COMMIT
ROLLBACK, .
SQL*Plus COMMIT,
. ,
(autocommit) COMMIT
SQL-.
SQL- PL/SQL, SOL*Plus
.
SQL*Plus , COMMIT
. ,
SQL*Plus .
, ROLLBACK . SAVEPOINT ( )
. SAVEPOINT:
SAVEPOINT ;
.
,
SQL (. 3). , ,
, .
, :
ROLLBACK [WORK] TO SAVEPOINT ;
ROLLBACK TO SAVEPOINT
:
SQL PL/SQL
157
, , . .
.
, SQL- , , ,
SQL- .
, SQL-
.
PL/SQL:
Q
BEGIN
INSERT INTO temp_table (char_col) VALUES ('Insert O n e ' ) ;
SAVEPOINT A;
INSERT INTO temp_table (char_col) VALUES ('Insert T w o ' ) ;
SAVEPOINT B;
INSERT INTO temp_table (char_col) VALUES ('Insert T h r e e ' ) ;
SAVEPOINT C;
/* */
COMMIT;
END;
ROLLBACK TO ;
INSERT . INSERT .
rj
ROLLBACK TO ;
INSERT
.
SAVEPOINT
. , ,
.
PL/SQL. ,
, . , . ,
SQL*Plus:
Q
158
INSERT,
PL/SQL. , UPDATE
ROLLBACK. ROLLBACK UPDATE, INSERT, , ,
.
PL/SQL
:
DECLARE
v_Num!terations NUMBER;
BEGIN
- 1 500 temp_table.
- 50 .
FOR v_LoopCounter IN 1 . . 5 0 0 LOOP
INSERT INTO temp_table (num_col) VALUES (v_LoopCounter);
v_NumIterations := v_NumIterations + 1;
IF v_NumIterations = 50 THEN
COMMIT;
v_Num!terations := 0;
END IF;
END LOOP;
END;
temp_table
1 500, 50 .
, 10
.
18 ,
SQL
. OracleSz . ,
(-), .
-.
AUTONOMOUSJTRANSACTION
PL/SQL.
, :
- autoTrans.sql
CREATE OR REPLACE PROCEDURE Autonomous AS
SQL PL/SQL
159
PRAGMA
AUTONOMOUS_TRANSACTION;
BEGIN
INSERT INTO temp_table VALUES (-10, 'Hello from Autonomous!');
COMMIT;
END Autonomous;
9.
PL/SQL , . Autonomous
PL/SQL:
Q - autoTrans.sql
BEGIN
- temp_table -
INSERT INTO temp_table VALUES (-10, 'Hello from the parent! ');
- Autonomous,
-
Autonomous;
-- - Autonomous
--
ROLLBACK;
END;
AUTONOMOUSJTRANSACTION ,
. ,
.
.
:
,
160
, PL/SQL .
.
SQL*Plus . ,
, PLS-710.
-- autoPragna.sql
SQL> -- :
SQL> DECLARE
2
PRAGMA AUTONOMOUS_TRANSACTION;
3 BEGIN
4
COMMIT;
5 END;
6 /
PL/SQL procedure successfully completed.
SQL> -- ;
SQL> BEGIN
2
DECLARE
3
PRAGMA AUTONOMOUS_TRANSACTION;
4
BEGIN
5
COMMIT;
6 END;
7 END;
8 /
PRAGMA AUTONOMOUSJTRANSACTION;
*
ERROR at line 3:
ORA-06550: line 3, column 12:
PLS-00710: PRAGMA AUTONOMOUS_TRANSACTION cannot be declared here
SQL> -- , :
SQL> CREATE OR REPLACE PROCEDURE Autol AS
2
PRAGMA AUTONOMOUS_TRANSACTION;
3
4
PROCEDURE Local IS
5
PRAGMA AUTONOMOUS_TRANSACTION;
6
BEGIN
7
ROLLBACK;
8
END Local;
9 BEGIN
10
Local;
11 COMMIT;
12 END Autol;
13 /
Procedure created.
SQL> show errors
No errors.
SQL> -- :
SQL PL/SQL
161
Package created.
SQL> show errors
No errors.
END P;
7 END Auto2;
8 /
Package body created.
SQL> show errors
No errors.
SQL> -- :
SOL> CREATE OR REPLACE PACKAGE Auto3 AS
2
3
4
5
PRAGMA AUTONOMOUS_TRANSACTION;
PROCEDURE P;
PROCEDURE Q;
ENDAutoS;
6/
ERROR
2/10
'' '.' 9.
SQL COMMIT ROLLBACK.
, COMMIT, ROLLBACK, SAVEPOINT, ROLLBACK
TO SAVEPOINT SET TRANSACTION.
.
, -, :
Q
-- autoSavepoints.sql
SQL> CREATE OR REPLACE PROCEDURE AutoProc AS
2
PRAGMA AUTONOMOUS_TRANSACTION;
162
BEGIN
4
ROLLBACK TO SAVEPOINT A;
5 END AutoProc;
6 /
Procedure created.
SQL> BEGIN
2
SAVEPOINT A;
3
INSERT INTO temp_table (char_col)
A
VALUESCSavepoint A!');
5
- -,
6
- ,
7
- .
8
AutoProc;
9 END;
/
BEGIN
*
ERROR at line 1:
ORA-01086: savepoint ' A ' never established
ORA-06512: at "EXAMPLE.AUTOPROC", line 4
ORA-06512: at line 8
COMMIT ROLLBACK.
. ,
ORA-6519 .
]
- autoTrans.sql
SQL> DECLARE
2
PRAGMA AUTONOMOUS_TRANSACTION;
3 BEGIN
4
INSERT INTO temp_table (num_col) VALUES (1);
5 END;
6 /
DECLARE
*
ERROR at line 1:
ORA-06519: active autonomous transaction detected and rolled back
ORA-06512: at line 4
SQL , DML
, , ,
PL/SQL. , , ,
.
SQL, 6 , .
ids
s vavi/j
|
164
' SQL, 4, .
.
SQL ,
SQL- . , SELECT,
UPPER ( ) , , ,
:
SELECT UPPER(first_name)
FROM students;
DECLARE
v_FirstName students.first_name%TYPE;
BEGIN
v_FirstName := UPPER('Charlie');
END;
SQL- . , UPPER
. ,
PL/SQL (. 3). , SQL-
.
.
HAVING . PL/SQL . COUNT ( ).
, UPPER,
. SQL-, , PL/SQL.
. .
. ([]) .
SQL
165
Oracle?, OracleS,
OracleSl Orac/e9i.
(.. 7.3 Oracle? 8.1.7 OracleSl).
.
,
( CHR NCHR) .
, VARCHAR2; , , . , , ,
, .. VARCHAR2
4000 (2000 Oracle?), CHAR 2000
(255 Oracle?). PL/SQL,
VARCHAR2, CHAR.
Oracle?
SQL-.
Oracle?
SQL-.
, ,
. -
. , , .
, string.
LOWER(strmg)
Oracle?
SQL-.
, . , ,
. string CHAR, CHAR. string
VARCHAR2, VARCHAR2.
LDAPfstring/, x[, string?])
Oracle?
SQL-.
166
string 7, string2.
string? , . string2
, sfring2. string2 ,
. ,
, .
, .
LDAP RDAP , , .
LTRIM(string/, sfring2)
Oracle?
SQL-.
string/ , string2.
string2 .
string?, . ,
sfring2, . LTRIM RTRIM ,
, .
REPLACE(string, searcn_sfr Oracle?
[, replacejstr])
SQL-.
, searcn_str replace_str.
replacejtr , searchjtr . REPLACE
, TRANSLATE.
RPAD(sfring/, x[, string2J)
Oracle?
SQL-.
string/ string?.
string2 , . string2 ,
. string? ,
. , ,
. ,
. RPAD LPAD
, , .
RTRIM(string/ [,stringh2])
Oracle?
SQL-.
string/ ,
string?. string? .
string/, . ,
string?, . RTRIM LTRIM
, , .
SOUNDEX(sfring)
Oracle?
SQL-.
string (. ).
SUBSTR(sfring, a [,b])
Oracle?
SQL-.
string; b (. ).
SUBSTRB(string, a[,b])
Oracle?
SQL-.
string; b (. ).
SUBSTRCfsfring, a[,b])
!9/
SQL-.
string; b Unicode (. ).
SUBSTR2(string, a[,bj)
Oracle9/
SQL-.
string; b UCS2 (. ).
SQL
SUBSTR4(string, a[,b])
Oracle9i
SQL-.
167
string; b UCS4 (. ).
TRANSLATE(sfring,
fromjtr, tojtr)
Oracle?
SQL-.
sfring, from_str
fo_sfr. TRANSLATE
, REPLACE. fromjtr fo_sfr,
fromjstr, fo_sfr, sfring,
. fo_sfr . Oracle NULL,
- TRANSLATE NULL, NULL.
TRIM([{{LEADING|TRAILING OracleSi
|BOTH}[frim_char]) |
trim_char} FROM] sfring)
SQL-.
Oracle?
SQL-.
, .
CHAR, CHAR. VARCHAR2,
VARCHAR2. , ,
.
SUKSTR(string, [,
,
string,
b . = 0, , = 1 ( ). , . ,
, , .
b , . b 1, NULL-.
b , .
, string.
SUBSTR b ,
.
168
SUBSTR
SUBSTRB
SUBSTRC
UNICODE
SUBSTR2
USC2
SUBSTR4
USC4
123d
SOUNDEX
SOUNDEX(s*nng)
string.
, , .
. "The Art of Computer Programming, Volume 3:
Sorting and Searching".
:
, , h, i, ,
wviy.
:
1. b,f,p,v
2. , g,j, k, q, s, x, z
3. d,t
4. /
SQL
169
5. ,
6.
(, j) h w,
, .
4 , .
,
. CHAR, VARCHAR2.
,
NUMBER . :
170
ASCII(sfring)
Oracle?
SQL-
string
. , - ASCII,
7- ASCII. CHR ASCII
. CHR , a ASCII
.
INSTR(sfring/, string2 [,a][,b]) Oracle?
SQL-
string? string/; b
(. ).
INSTRB(sfringf, sfring2 [,a][,b]) Oracle?
SQL-
string2 string/; b
(. ).
INSTRC(sfring/, string? [,a][,b]) OracleS/
SQL-
string? string/; b
Unicode (. ).
INSTR2(sfring/, string? [,a][,b]) OracleQ/
SQL-
string? string/; b
UCS2 (. ).
INSTR4(string/, string? [,a][,b]) OracleQ/
SQL-
string? string?; b
UCS4 (. ).
LENGTH(string)
Oracle?
, (. ).
LENGTHB(string)
Oracle?
SQL-
SQL-
, (. ).
LENGTHC(sfring)
Oracle9/
SQL-
, Unicode (. ).
LENGTH2(sfring)
Oracle9/
SQL-
, UCS2 (. ).
LENGTH4(sfring)
Oracle9/
SQL-
, UCS4 (. ).
INSTR(stringl, string2
l, string2 [,a]
INSTRC(stringl, string2 [,a]
INSTR2(stringl, string2 [,a]
lNST~R.4(stringl,string2[,a]
SQL
171
string2
stringl. stringl , .
, stringl .
6- . b 1,
string2 stringl.
string2 , 0. stringl .
INSTR ,
.
INSTR
INSTRB
INSTRC
INSTR2
INSTR4
Unicode
UCS2
UCS4
11
SELECT INSTRC Scott "s spot', 'of, 12) "Fourth"
FROM dual;
Fourth
LENGTH(rtring)
LENGTHB( siring)
LENGTHC(rfnng)
172
LENGTH4(string)
string. CHAR , CHAR, . string NULL, NULL.
LENGTH -
, .
LENGTH
LENGTHS
LENGTHC
Unicode
LENGTH2
UCS2
LENGTH4
UCS4
22
NLS
NCHR,
.
NLS, . NLS ( Oracle9i Globalization)
Oracle.
CONVERTfsfring, ctesf_
Oracle?
SQL-
charset[,source_charset])
string dest_charset.
source_charset . ,
. CHAR,
VARCHAR2, NCHAR, NVARCHAR2, CLOB NCLOB. VARCHAR2.
dest_charset,
( dest_charset).
NCHR(x)
Oracle9/
SQL-
, ,
. NCHR(x) CHR(x USING NCHAR_CS).
SQL
173
NLS_CHARSET_DECL_LEN(byfe_w/dt, OracleS
SQL-
charset)
( ) NCHAR. byte_width
, a charset ,
.
NLS_CHARSETJD(cnarsef_name)
OracleS
SQL-
charset_name.
'CHAR_CS' charsetjiame ,
a 'NCHAR_CS' .
charsetjiame , NULL.
NLS_CHARSET_ID NLS_CHARSET_NAME- .
NLS_CHARSET_NAME(c/)areef_'D)
OracleS
SQL-
charsetJD. charsetJD
, NULL.
NLS_CHARSET_NAME NLS_CHARSET_ID - .
NLSJNITCAPfsfring [,n/sparams])
Oracle?
SQL-
, ,
. nlsparams ,
. , NLSJNITCAP
, INITCAP. nlsparams 'NLS_SORT=sort', sort
.
NLS , , "Server SQL Reference".
NLS_LOWER(sfrmg [,hlsparams])
Oracle?
SQL-
, . , ,
. nlsparams , NLSJNITCAP. nlsparams
, NLS_LOWER LOWER.
NLS_UPPER(sfring [,n/sparams])
Oracle?
SQL-
, . , ,
. nlsparams , NLSJNITCAP. nlsparams
, NLSJJPPER UPPER.
NLSSORT(string [,n/sparams])
Oracle?
SQL-
, string.
.
nlsparams , NLSJNITCAP. nlsparams ,
.
" "
"Server SQL Reference".
TRANSLATE(sfring USING
OracleS
SQL-
{CHAR_CS|NCHAR_CS})
TRANSLATE ... USING string
( CHAR CS), (
NCHAR_CS). string CHAR, VARCHAR2, NCHAR NVARCHAR2.
CHAR_CS, VARCHAR2, NCHAR_C5
NVARCHAR2. TRANSLATE... USING CONVERT.
, , UCS2 (\),
UNISTR ( Oracle9/ ).
174
UNISTR(s)
OracleS/
SQL-
s, Unicode . s
escape- UCS2, (\),
. ,
, (\\). UNISTR
TRANSLATE...USING , Unicode
escape-.
NUMBER NUMBER. 36 . ACOS,
ASIN, ATAN ATAN2 30 . :
ABS(x)
Oracle?
SQL-
.
ACOSfx)
Oracle?
SQL-
: -1 1. : 0 ,
.
ASIN(x)
Oracle?
SQL-
. : -1 1. : -/2 /2,
.
ATAN(x)
Oracle?
SQL-
. : -/2 /2, .
ATAN2(x, )
Oracle?
SQL-
, : - .
. ATAN2(x, ) , ATAN(x/y).
BITANDfx, )
Oracle?
SQL-
AND ,
.
&& . , BITOR, UTL_RAW , RAW.
CEIL(x)
Oracle?
SQL-
, .
COS(x)
Oracle?
SQL-
.
COSH(x)
Oracle?
.
SQL-
SQL
()
175
Oracle?
SQL-
( = 2.71828183...).
FLOORfx)
Oracle?
SQL-
, .
LN(x)
Oracle?
SQL-
. 0.
LOG(x, )
Oracle?
SQL-
. ,
0 1, .
MOD(x, )
Oracle?
SQL-
. 0, .
POWER(x, )
Oracle?
SQL-
.
, , .
ROUNDfx [,y])
Oracle?
SQL-
, .
0; .
, . .
SIGN(x)
Oracle?
SQL-
< 0, -1. = 0, 0. > 0, 1.
SIN(x)
Oracle?
SQL-
.
SINH(x)
Oracle?
SQL-
.
SQRT(x)
Oracle?
SQL-
. .
TAN(x)
Oracle?
SQL-
.
TANH(x)
Oracle?
SQL-
.
TRUNC(x [,y])
Oracle?
SQL-
, ( ) .
0; . ,
.
WIDTH_BUCKET(x, , max,
Oracle9/
SQL
num_buckets)
.
176
WIDTH_BUCKET
20 , 50
(1000/20):
SELECT number_seats, WIDTH_BUCKET(number_seats, 1, 1000, 20) Bucket
FROM rooms;
NUMBER SEATS
1000
500
50
50
50
10
1000
. 75
50
BUCKETS
21
10
1
1
1
1
21
2
DATE.
MONTHS_BETWEEN,
NUMBER, DATE.
.
.
ADD_MONTHS(d, x)
Oracle?
SQL-
d . .
, d,
-. , - d
. d .
CURRENT_DATE
Oracle9/
SQL-
SQL
177
DATE.
SYSDATE , SYSDATE
.
CURRENTJIMESTAMP
[(precision)]
Oracle9/
SQL-
OracleQ/
SQL-
. ,
CREATE DATABASE ALTER DATABASE.
EXTRACT({YEAR, MONTH, DAY, OracleB/ DATE,
HOUR, MINUTE, SECOND,
OracleQ/
TIMEZONE HOUR,
TIMEZONE_MINUTE,
TIMEZONE REGION,
SQL-
TIMEZONE_ABBR} FROM
datetime_or_interval)
Oracle?
SQL-
, d.
, .
LOCALTIMESTAMP[(prec/s/on)]
OracleG/
SQL-
TIMESTAMP.
precision,
; 6. LOCALTIMESTAMP TIMESTAMP,
CURRENTJIMESTAMP TIMESTAMP WITH TIMEZONE.
MONTHS_BETWEEN(dafe?,
date2)
Oracle?
SQL-
Oracle?
SQL-
zone2 zone/,
d. Zone/ zone2 ,
5.1. OracleQ/
v$timezone_names.
NEXT_DAY(d, string)
Oracle?
SQL-
178
string , d. string
. ,
d. .
ROUND(d[,])
Oracle?
SQL-
d , format. ,
ROUND TRUNC, 5.2. ,
'DD', d .
SESSIONTIMEZONE
OracleQ/
SQL-
. ,
, .
( ) , ALTER SESSION.
SYS_EXTRACT_UTC(dafef/me)
Oracleft'
SQL-
UTC ( ,
) datetime,
.
SYSDATE
Oracle?
SQL-
DATE. .
SQL- SYSDATE
.
SYSTIMESTAMP
!9/
SQL-
Oracle?
SQL-
d, , format.
, ROUND (. 5.2). format ,
'DD', d .
TZ_OFFSET(f/mezone)
Oracle9/
SQL-
timezone
UTC. timezone (. 5.1
v$timezone_names), '+/-:.
SESSIONTIMEZONE DBTIMEZONE.
'+/-:.
5.1. TIME ZONE
AST
ADT
BST
CST
SQL
179
CDT
EST
EOT
GMT
HST
MST
MDT
NST
PST
YST
YDT
, SCC
( 1 )
ISO
(
)
( )
WW
IW
, ISO
ODD, DD, J
Day, DY, D
, 12, 24
Ml
(d), (dt), () () 5.3. ,
.
180
5.3.
d1-d2
NUMBER
dt1 - dt2
-12
INTERVAL
INTERVAL
He
dt1 + dt2
He
+12
INTERVAL
DATE
d1-n
DATE
dt1 + //
dff -
/7*
H/n
DATETIME
DATETIME
INTERVAL
INTERVAL
d1 d2.
,
.
df 1 dt2.
II 12.
.
.
.
_ .
/'/ 12.
d1 , ,
DATE.
, ,
/7 , ,
DATE.
, .
dt1 .
df/ .
;/, .
//, .
Oracle.
PL/SQL. PL/SQL , . ,
. ,
, PL/SQL.
:
ASCIISTR(string)
OracleS/
SQL-
, SQL (/).
string ( ), ,
, .
BIN_TO_NUM(num [,num]...)
Oracle9/
SQL
SQL
181
. BIN_TO_NUM
, 0 1. ,
BIN_TO_NUM(1,0,1,1) 11, 11 1011.
BIN_TO_NUM GROUP BY.
CHARTOROWID(sfrmg) '
Oracle?
SQL-
CHAR VARCHAR2, (ROWID)
, . string
, ROWID,
(. 2). CHARTOROWID ROWIDTOCHAR,
COMPOSE(sfrmg)
Oracle9/
SQL
string ( )
Unicode . Unicode
Oracle. string
CHAR, VARCHAR2, NCHAR, NVARCHAR2, CLOB NCLOB.
DECOMPOSE(sfrmg)
OracleG/
SQL
Unicode, string (
). Unicode
Oracle. string CHAR, VARCHAR2,
NCHAR, NVARCHAR2, CLOB NCLOB.
FROM_TZ(f/mesfamp, timezone) OracleS/
SQL-
TIMESTAMP WITH TIMEZONE, timestamp,
, timezone.
HEXTORAW(sfring)
Oracle?
SQL-
, string, RAW.
string .
RAW. HEXTORAW RAWTOHEX
.
NUMTODSINTERVAL(x, unit)
Oracle9/
SQL-
, , INTERVAL DAY TO SECOND.
unit ( CHAR, VARCHAR2, NCHAR NVARCHAR2)
: 'DAY', 'HOUR', 'MINUTE', 'SECOND'. unit
. 9.
NUMTOYMINTERVAL(x, unit)
Oracle9/
SQL-
, , INTERVAL YEAR TO MONTH.
unit ( CHAR, VARCHAR2, NCHAR NVARCHAR2)
: 'YEAR', 'MONTH'. unit
. 9.
REFTOHEX(refra/ue)
Oracle9/
SQL-
REF.
RAWTOHEX(rawa/ue)
Oracle?
SQL-
RAW ,
. rawvalue .
RAWTOHEX HEXTORAW .
RAWTONHEX(raiwa/ue)
Oracle9/
SQL-
182
RAW ,
. rawalue . RAWTONHEX
RAWTOHEX, ,
NVARCHAR2, VARCHAR2.
ROWIDTOCHAR(rovwcf)
Oracle?
SQL-
ROWID ( )
(
rowid). ROWIDTOCHAR CHARTOROWID
.
ROWIDTONCHAR(rovwd)
Oracle9/
SQL-
ROWID ( )
(
rowid). NCHAR, CHAR.
TO_CHAR
Oracle?
SQL-
(. ).
TO_CLOB(str/ng)
Oracle9/
SQL-
CLOB. string
LOB. NCHAR, .
TO_DATE
Oracle?
SQL-
DATE (. ).
TO_DSINTERVAL(string
Oracle9/
SQL-
[,n/sparams])
sfrmg ( CHAR, VARCHAR2, NCHAR NVARCHAR2)
INTERVAL DAY TO SECOND. nlsparams
NLS_NUMERIC_CHARARCTERS .
TO_LOB(/ong_co/umn)
OracleS/
SELECT
1_1 LOB. LONG
LONG RAW CLOB BLOB .
TO_MULTI_BYTE(sfring)
Oracle?
SQL-
,
. ,
, . string
. TO_MULTI_BYTE TO_SINGLE_BYTE
.
TO_NCHAR
Oracle9/
SQL-
TO_NCHAR , TO_CHAR, ,
,
(. ).
TO_NCLOB(sfring)
Oracle9/
SQL-
string NCLOB. string
LOB. string , ,
.
TO_NUMBER
Oracle?
SQL-
SQL
183
(. ).
TO_SINGLE_BYTE(sfr/ng)
Oracle?
SQL-
string .
, ,
. .
TO_SINGLE_BYTE TO_MULTI_BYTE .
TOJTIMESTAMP
19/
SQL-
TIMESTAMP (. ).
TO_TIMESTAMP_TZ
OracleQ/
SQL-
TIMESTAMP WITH TIMEZONE (. ).
TO_YMINTERVAL(sfr/ng)
Oracle9/
SQL-
string ( CHAR, VARCHAR2, NCHAR NVARCHAR2)
INTERVAL YEAR TO MONTH. TOJMINTERVAL TO.DSINTERVAL
, NLS
YEAR TO MONTH, DAY TO SECOND.
TO_CHAR ( -)
TO_CHAR(d
[,fffrmat[,nlsparams]])
d
VARCHAR2. format (),
. .
, . , TO_CHAR,
5.4. format , , .
nlsparams,
. nlsparams :
'NLS_DATE_LANGUAGE= language'
language . TO_CHAR
"Server SQL Reference".
FROM dual;
Right Now
10-AUG-01 15:44:54
184
5.4. -
""
, ,
AD, A.D.
AD
AM, A.M.
Ante Meridiem
, B.C.
, SCC
; SCC
D
(1-7)
DAY'
,
DD ,
(1-31)
DDD
(1366)
DY1
2
( Japanese Imperial,
ROC Official Thai Buddha)
2
( Japanese Imperial,
ROC Official Thai Buddha)
FF2
, 12
(1-12)
24
(0-23)
IW
(1 52, 1 53) ISO
IYY, IY, I
, ISO
IYYY
ISO
J
. 1 4712 .
.
Ml
(0 - 59)
MM
Mecflu(1-12);JAN = 1,DEC = 12
MOM1
MONTH1
,
, P.M.
Post Meridiem
Q
(1 - 4); JAN - MAR = 1
RM
(I XII); JAN = I, DEC = XII
RR
RRRR
; RR , .
SS
(0-59)
SSSSS
(0 86 399). 'J.SSSSS'
.
TZD2
TZN2
2
TZM
SQL
185
5.4. -
()
2
TZR
WW
W
2
X
Y.YYY
1
YEAR, SYEAR
YYYY, SYYYY
YYY, YY, Y
( 'US/Pacific')
(1 53). 1
. ,
.
(1 5). ,
WW.
. SYEAR .
. SYYYY
.
,
TO_CHAR ()
TO_CHAR(
[,format[,nlsparams]])
186
5.5.
$999
999
Ml
999MI
S9999
9999S
PR
99PR
99D9
9G999
99
L
,
L999
999,999
99.99
99V999
RM
9.99
RM
.
.
,
.
,
.
.
'+' '-'
.
'+'
'-' .
<
.
.
.
. G
.
ISO- .
.
.
.
.
, 10",
V.
.
.
,
.
SQL
187
5.5. ()
rm
rm
FM
FM90.99
0999
9990
99
0
9
,
.
.
, .
, .
.
,
,
. .
TO_DATE
TO_DA.TE(string[,format[,nlsparams]
])
DECLARE
v_CurrentDate DATE;
BEGIN
v_CurrentDate := TO_DATE('January 7, 1973', 'Month DD, Y Y Y V ) ;
END;
TO_NUMBER
DECLARE
v Mum NUMBER;
188
BEGIN
v_Num := TO_NUMBER('$12345.67', ' $ 9 9 9 9 9 . 9 9 ' ) ;
END;
OracleQ/
TOJTIMESTAMP TO_TIMESTAMP_TZ
[,format[,nlsparams]])
TO_TIMESTAMP_TZ(string [,farmat[, nbparams] ])
string CHAR VARCHAR2
TIMESTAMP TIMESTAMP WITH TIMEZONE. format (. 5.4). /^ , . nlsparams
TOJTIMESTAMP TO_TTMESTAMP_TZ , TO_CHAR.
SQL-
DECLARE
v_CurrentDate TIMESTAMP;
BEGIN
v_CurrentDate := TO_TIMESTAMP('January 7, 1973', 'Month DD, Y Y Y Y ' ) ;
END;
,
. , . , COUNT , ,
WHERE SELECT. GROUP
BY HAVING.
() : DISTINCT ( ) ALL
(). DISTINCT, , .
ALL, ,
. , ALL ,
.
fOra
OracleQ/
OracleQ i OVER, , .
OVER , .
, , . OVER . "SQL Reference".
SQL
_1J39
AVG([DISTINCT|ALL] col}
Oracle?
.
CORR(x7, x2)
Oracle
, 1
2. , xl 2 NULL,
COVAR_POP(x7, x2)/(STDDEV_POP(x7)*STDDEV_POP(x2)).
COUNT(*|[DISTINCT|ALL] /)
Oracle?
. *, .
, , NULL.
COVAR_POP(x7,x2)
Oracle
, 1
2. (SUM(x/*x2)- SUM(x2)*SUM(x7)/n)/n,
, NULL
COVAR_SAMP(x1, 2)
Oracle
, 1 2.
, 1 2 NULL,
(SUM(x1*x2)-SUM(x1)*SUM(x2)/n)/(n-1), , NULL
CUME_DIST
Oracle
(. "SQL Reference").
DENSE_RANK
Oracle
,
, 1 (. "SQL Reference").
GROUPJDQ
Oracle
,
GROUP BY.
GROUPING
Oracle
(. "SQL Reference").
GROUPINGJD
Oracle
, GROUPING (. "SQL
Reference").
MAX([DISTINCT | All] col)
Oracle?
. ,
DISTINCT ALL ,
.
MIN([DISTINCT | ALL] col)
Oracle?
. ,
DISTINCT ALL ,
.
PERCENTILE.CONT
Oracle
,
(. "SQL Reference").
190
PERCENTILE_DISC
Oracle9/
,
(. "SQL Reference").
PERCENTRANK
OracleQ/
0 1 (. "SQL Reference").
RANK
Oracle9/
. ,
(. "SQL Reference").
REGR
Oracle9/
(REGR_SLOPE, REGRJNTERCEPT, REGR.COUNT, REGR_R2, REGR_AVGX,
REGR.AVGY, REGR_SXX, REGR_SYY REGR_SXY)
. "SQL Reference").
STDDEV([DISTINCT | ALL] col)
Oracle?
.
.
STDDEV_POP(co/)
OracleQ/
.
STDDEV_SAMP(co/)
OracleQ/
.
SUM([DISTINCT | ALL] /)
Oracle?
.
VAR_POP(x)
OracleQ/
NULL.
(2) - SUM(x2)/COUNT(x))/COUNT(x).
VAR_SAMP(x)
OracleQ/
NULL.
(SUMfx2) - SUM(x2)/COUNT(x))/(COUNT(x) - 1).
VARIANCE([DISTINCT | ALL] col)
Oracle?
col.
,
.
BFILENAME(d/rectory, filename)
OracleS
SQL-
BFILE, fi/ejiame
. directory DIRECTORY .
SQL
191
Oracle?
^,
~ ..
default)
DECODE IF-THEN-ELSE.
basejsxpr compare/,
compare? .. /'- , /-
(value/). ,
(default). .
, .
NULL-,
NULL. , ,
.
.
DUMP
Oracle?
SQL
.
EMPTY_CLOB/EMPTY_BLOB
OracleS
SQL-
LOB. EMPTY_CLOB ,
PTY_BLOB .
EXISTNODEfXM/Jypejnsfance,
Xpaf/i_sfring)
Oracle9/
SQL
, - XML,
XMLTypejnstance Xpathjtring.
NUMBER, 0, , 0
. XML Oracle.
EXTRACT(XM/Type_/nsfarice,
Oracle9/
SQL
Xpafn_sfr/ng)
XML, XMLTypejnstance
Xpathjtring. XML Oracle.
GREATEST(expr/ [, expr2]...)
Oracle?
SQL-
.
exprl. / ,
, VARCHAR2,
LEAST(expr7 [, expr2]...)
Oracle?
SQL-
. LEAST
GREATEST , .
.
NULLIF(a, )
OracleQ/
SQL
NULL, , , .
192
NVL(expr7, expr2)
Oracle?
SQL-
2, ! NULL-; 1.
1 , ,
exprl. VARCHAR2.
NULL- .
NVL2(expr7, 2, )
OracleQ/
SQL-
/ NULL, 2, .
2, 2 ;
VARCHAR2.
SYS_CONNECT_BY_PATH
Oracle9/
SELECT
SYS_CONNECT_BY_PATH .
(. "SQL Reference").
SYS_CONTEXT(namespace,
OracleS/
SQL-
parameter\,length])
parameter, namespace.
DBMS_SESSION.SET_CONTEXT.
VARCHAR2 256 ,
length, .
SYS_DBURIGEN
OracleQ/
SQL
URL XML .
XML Oracle.
SYS_GUID
OracleS/
SQL-
16- RAW.
SYSJYPEID(objectJype)
Oracle9/
SQL-
ID objectjype.
SYS_XMLAGG
Oracle9/
SQL-
XML .
XML Oracle.
SYS_XMLGEN
Oracle9i
SQL-
XML .
XML Oracle.
TREAT(expr ASfREF] [schema.jtype)
Oracle9i
SQL
TREAT .
. ,
schema.type (REF) ( , ).
UID
Oracle?
SQL-
, .
DID .
USER
Oracle?
SQL-
VARCHAR2, Oracle.
USER .
SQL
USERENV(napaMerp)
193
Oracle?
SQL-
.
VSIZE(x)
OracleQ/
.
SQL-
DUMP
1
2
8
12
23
24
69
96
112
113
114
180
181
182
183
208
231
VARCHAR2
NUMBER
LONG
DATE
RAW
LONG RAW
ROWID
CHAR
GLOB
. BLOB
BFILE
TIMESTAMP
TIMESTAMP WITH TIMEZONE
INTERVAL YEAR TO MONTH
INTERVAL DAY TO SECOND
UROWID
TIMESTAMP WITH LOCAL TIMEZONE
Oracle?
Oracle?
Oracle?
Oracle?
Oracle?
Oracle?
Oracle?
Oracle?
OracleS
OracleS
OracleS
Oracle9/
Oracle9/
Oracle9/
Oracle9/
OracleS/
Oracle9/
194
Dump
Scott
Margaret
Joanne
Manish
Patrick
Timothy
Typ=1
Typ=1
Typ=1
Typ=1
Typ=1
Typ=1
Typ=1 Len=5: S, C, 0, t, t
Typ=1 Len=8: M, a, r, g, a , r, e, t
Typ=1 Len=6: J, o, a, n, n, e
Typ=1 Len=6: M, a, n, i, s , h
Typ=1 Len=7: P, a, t, r, i , c, k
Typ=1 Len=7: T, i, m, 0, t, h,
Typ=1
Typ=1
Typ=1
Typ=1
Typ=1
Len=5: c, 0, t, t
Len=8: a, r, 9, a
Len=6: 0, a, n, ii
Len=6: a. n, i, s
Len=7: a, t, r, i
USERENV(optian)
VARCHAR2,
, option.
:
'OSDBA'
'LABEL'
USERENV(option)
OSDBA,
TRUE', 'FALSE'. ,
VARCHAR2, BOOLEAN.
Trusted Oracle.
. "Trusted
Oracle? Server Administrator's Guide".
195
SQL
USERENV(option)
'LANGUAGE'
,
, .
NLS.
languagejerritory.characterset.
'TERMINAL'
. SQL
.
'SESSIONID'
,
AUDITJRAIL TRUE. USERENV('SESSIONID')
SQL.
'ENTRYID'
,
AUDITJRAIL TRUE.
USERENV('ENTRYID')
SQL.
'LANG1'
ISO .
USERENV('LANGUAGE').
*USERENV('LANG') OracleS .
. , .
198
4 5 SQL- PL/SQL.
SQL-. , SQL-. , ,
.
SQL- Oracle , (context area). ,
, : , , (active set), ..
, .
(cursor) .
PL/SQL . PL/SQL,
.
.
| CursorLoop.sql
DECLARE
/* */
v_StudentID
students.id%TYPE;
v_FirstName
students.first_name%TYPE;
v_LastName
students.last_name%TYPE;
/* , */
v_Major
students.major%TYPE := 'Computer Science';
/* */
CURSOR c_Students IS
SELECT id, first_name, last_name
FROM students
WHERE major = v_Major;
BEGIN
/*
*/
OPEN c_Students;
LOOP
/* PL/SQL */
FETCH c_Students INTO v_StudentID, v_FirstName, v_LastName;
/* , , , */
EXIT WHEN c_Students%NOTFOUND;
END LOOP;
199
/* , */
CLOSE c_Students;
END;
(explicit) .
SELECT CURSOR...IS.
SQL- (implicit) .
(. ). PL/SQL .
PL/SQL
:
1. .
2. .
3. PL/SQL.
4. .
, .
.
SELECT. :
CURSOR _ IS onepamop_SELECT
_ , a onepamopJSELECT ,
. , ,
PL/SQL (. 3).
PL/SQL, ,
.
SELECT, (join) ,
UNION () MINUS ().
- INTO SELECT,
FETCH.
PL/SQL, .
, .
, :
200
3 DECLARE
v_Department
classes.department%TYPE;
v_Course
classes.course%TYPE;
CURSOR c_Classes IS
SELECT * FROM classes
WHERE department = v_Department;
AND course = v_Course;
,
v_Department v_Course :
)
DECLARE
CURSOR c_Classes IS
SELECT * FROM classes
WHERE department = v_Department;
AND course = v_Course;
v_Department
classes.department%TYPE;
v_Course
classes.course%TYPE;
, ,
, ,
.
. ,
, %ROWTYPE ( , ).
, .
:
OPEN _;
_ .
, :
.
,
, .
.
. PL/SQL:
!_]
DECLARE
v_RoomID
classes.room_id%TYPE;
v_Building
rooms. building%TYPE;
v_Department
classes. department%TYPE;
v_Course
classes. course%TYPE;
CURSOR c_Buildings IS
SELECT building
FROM rooms, classes
201
4
5
6
7
8
CURSOR c_A118tudentIDs IS
SELECT ID FROM students;
BEGIN
OPEN c_AHStudentIDs;
- . ORA-6511.
10
OPEN c_AHStudentIDs;
11 END;
12 /
202
DECLARE
ik
ERROR at line 1:
ORA-06511: PL/SQL: cursor already open
ORA-06512: at line 5
ORA-06512: at line 10
INTO FETCH. FETCH :
FETCH _ INTO _;
FETCH ._ INTO aanucbJPL/SQL;
_ , _ PL/SQL, , a 3anucb_PL/SQL
PL/SQL. () INTO , .
c_Buildings, FETCH :
] FETCH c_Buildings INTO v_Building;
, , FETCH:
| BadFetch.sql
DECLARE
v_Department
classes.department%TYPE;
v_Course
classes.course%TYPE;
CURSOR c_AHClasses IS
SELECT *
FROM classes;
v_ClassesRecord c_AllClasses%ROWTYPE;
BEGIN
OPEN c_AHClasses;
- FETCH,
- PL/SQL, .
FETCH c_AHClasses INTO v_ClassesRecord;
- FETCH ,
- 7 classes,
- 2 .
- "PLS-394: wrong number
- of values in the INTO list of a FETCH statement"
- (" INTO FETCH")
FETCH c_AllClasses INTO v_Department, v_Course;
END;
203
FETCH . , FETCH
, .
%NOTFOUND. FETCH
, ..
.
FETCH
. Oracleffi
, BULK
COLLECT (. 12).
, .
PL/SQL, . , ,
, .
:
CLOSE _;
_ . . ,
Oracle :
Q ORA-1001: Invalid Cursor
( )
PL/SQL ,
.
PL/SQL, %TYPE %ROWTYPE. , ,
. %FOUND, %NOTFOUND,
%ISOPEN %ROWCOUNT. , . 6.1. (OracleSi %BULK_ROWCOUNT, .
. 12.) , temp_table
:
204
num_col
char_col
10
20
'Hello'
There'
c_TempData%FOUND
: ORA-1001
NULL
TRUE
TRUE
FALSE
: ORA-1001
c_TempData ,
.
c_TempData ,
.
.
FETCH
temp_table.
FETCH
temp_table.
FETCH
, .
c_TempData ,
.
DECLARE
-
CURSOR cJempData IS
SELECT * from tempjable;
--
vJempRecord c_TempData%ROWTYPE;
OPEN c_TempData;
. 6.1. ,
205
c_TempDataXNOTFOUND
1
: ORA-1001
c_TempOata ,
.
NULL
c_TempData ,
.
.
FALSE
FETCH
temp_table.
FALSE
FETCH
temp_table.
TRUE
FETCH
, .
: ORA-1001
c_TempData ,
.
%ISOPEN , . , %ISOPEN
TRUE, FALSE. %ISOPEN :
c_TempDataJ(lSOPEN
FALSE
c_TempData .
TRUE
c_TempData .
TRUE
c_TempOata .
TRUE
c_TempData .
TRUE
c_TempData .
FALSE
c_TempData .
%ROWCOUNT , . %ROWCOUNT ,
,
ORA-1001. %ROWCOUNT
:
206
c_TempDataXROWCOUNT
ORA- 1001
4
5
2
2
ORA- 1001
c_TempData ,
.
c_TempData ,
.
temp_table.
temp_table.
temp_table.
c_TempData ,
.
. 6.1
.
6.1. ,
c_TempDataX
FOUND
c_TempDataX
NOTFOUND
cJTempDataX
ISOPEN
c_TempDataX
ROWCOUNT
1
2
3
ORA-1001
NULL
TRUE
TRUE
FALSE
ORA-1001
ORA-1001
NULL
FALSE
FALSE
TRUE
ORA-1001
FALSE
TRUE
TRUE
TRUE
TRUE
FALSE
ORA-1001
0
1
2
2
ORA-1001
4
5
6
. (parameterized) ,
(. 9 10), . c_Classes:
[_| - Parameterized.sql
DECLARE
v_Department
classes. department%TYPE;
v_Course
classes.rse%TYPE;
CURSOR c_Classes IS
SELECT
FROM classes
WHERE department = v_Department
AND course = v_Course;
c_Classes v_Department
v_Course. c_Classes :
207
rj - Parameterized.sql
DECLARE
CURSOR c_Classes (p_Department classes.departnentXTYPE,
p_Course classes. courseJSTYPE) IS
SELECT *
FROM classes
WHERE department = p_Department
AND course = p_Course;
OPEN, :
FJ -- Parameterized, sql
OPEN c_Classes('HIS', 101);
'HIS' p_Department, a 101 p_Course. , .
9.
,
SELECT,
. SQL , . SQL- .
, SQL- . PL/SQL SQL-, SQL-
.
INSERT,
UPDATE, DELETE, SELECT...INTO.
SQL- PL/SQL,
OPEN, FETCH CLOSE . SQL- . , , INSERT ,
UPDATE .
Q NoMatch.sql
BEGIN
UPDATE rooms
SET number_seats = 100
WHERE room_id = 99980;
- UPDATE
, rooms.
IF SQLXNOTFOUND THEN
INSERT INTO rooms (room_id, number_seats)
VALUES (99980, 100);
END IF;
END;
208
SQL%ROWCOUNT:
rj
NoMatch.sql
BEGIN
UPDATE rooms
SET number_seats = 100
WHERE room_id = 99980;
- UPDATE
- , rooms.
IF SQLXROWCOUNT = THEN
INSERT INTO rooms (room_id, number_seats)
VALUES (99980, 100);
END IF;
END;
SQL%NOTFOUND
SELECT...INTO, . , SELECT...INTO , Oracle :
FJ ORA-1403: no data found
( )
, SQL%NOTFOUND .
SOJL*Plus:
Q - NoDataFound.sql
SQL> DECLARE
2
- .
3
v_RoomData rooms%ROWTYPE;
4 BEGIN
- -1.
6
SELECT *
7
INTO vJtoomData
8 .
FROM rooms
9
10
11
12
13
14
15
16 EXCEPTION
17
WHEN NO_DATA_FOUND THEN
18
DBMSJJUTPUT.PUT_LINE('NO_DATA_FOUND raised!');
19 END;
20 /
209
7.
, SQL%NOTFOUND
NO_DATA_FOUND, .
SQL%ISOPEN,
FALSE, .
. (fetch loop) , , .
.
(LOOP...END LOOP).
. :
Q - Si.mpleLoop.sql
DECLARE
- ,
- .
v_StudentID
students.id%TYPE;
v_FirstName
students. first_name%TYPE;
v_LastName
students.last_name%TYPE;
- -
CURSOR c_HistoryStudents IS
SELECT id, first_name, last_name
FROM students
WHERE major = 'History';
BEGIN
- .
OPEN c_HistoryStudents;
LOOP
- .
210
.
INSERT INTO temp_table (num_col, char_col)
VALUES (v_StudentID, v_FirstName || ' ' II v_LastName);
END LOOP;
- , .
CLOSE c_HistoryStudents;
END;
, EXIT WHEN
FETCH. c_HistoryStudents
%NOTFOUND .
, EXIT WHEN . , NULL.
, , EXIT
WHEN :
- ExitWhen.sql
DECLARE
- ,
- .
v_StudentID students.id%TYPE;
v_FirstName students.first_name%TYPE;
v_LastName students.last_name%TYPE;
- -
CURSOR c_HistoryStudents IS
SELECT id, first_name, last_name
FROM students
WHERE major = 'History';
BEGIN
- .
OPEN c_HistoryStudents;
LOOP
- .
FETCH c_HistoryStudents INTO v_StudentID, v_FirstName, v_LastName;
-. .
- History 301,
- registered_students. ,
- temp_table.
INSERT INTO registered_students (student_id, department, course)
VALUES (v_Student!D, 'HIS', 301);
INSERT INTO temp_table (num_col, char_col)
VALUES (v_StudentID, v_FirstName || ' ' II v_LastName);
- , .
EXIT WHEN c_HistoryStudentsXNOTFOUND;
END LOOP;
211
- , .
CLOSE c_HistoryStudents;
END;
WHILE
WHILE...LOOP. :
- WhileLoop.sql
DECLARE
- -
CURSOR c_HistoryStudents IS
SELECT id, first_name, last_name
FROM students
WHERE major = 'History';
- .
v_StudentData c_HistoryStudents%ROWTYPE;
BEGIN
- .
OPEN c_HistoryStudents;
- , WHILE.
FETCH c_HistoryStudents INTO v_StudentData;
- , .
WHILE cJistoryStudentsXFOUND LOOP
- .
- History 301,
- registered_students, ,
- temp_table.
INSERT INTO registered_students (student_id, department, course)
VALUES (v_StudentData. ID, 'HIS', 301);
INSERT INTO temp_table (num_col, char_col)
VALUES (v_StudentData.ID,
v_StudentData.first_name 1 1 ' ' 1 1 v_StudentData.last_name);
- . %FOUND
- , .
FETCH c_HistoryStudents INTO v_StudentData;
END LOOP;
- , .
212
CLOSE c_HistoryStudents;
END;
, LOOP...END
LOOP (. ). , FETCH
.
c_HistoryStudents%FOUND
.
FOR
, ,
OPEN, FETCH CLOSE.
PL/SQL FOR, . :
ForLoop.sql
DECLARE
- -.
CURSOR c_HistoryStudents IS
SELECT id, first_name, last_name
FROM students
WHERE major = 'History';
BEGIN
- .
- c_HistoryStudents.
FOR v_StudentData IN c_HistoryStudents LOOP
- .
- .
- History 301,
- registered_students. ,
- temp_table.
INSERT INTO registered_students (student_id, department, course)
VALUES (v_StudentData.ID, 'HIS', 301);
INSERT INTO temp_table (num_col, char_col)
VALUES (v_StudentData.ID,
v_StudentData.first_name | ' ' I I v_StudentOata.last_name);
END LOOP;
END;
-
- c_HistoryStudents.
, . -, v_StudentOata
. PL/SQL, FOR. c_HistoryStudents%ROWTYPE, FOR.
213
, FOR (. 3). -
FOR.
-, c_HistoryStudents , . , . %FOUND
.
, .
FOR , ,
,
, .
FOR
FOR . , :
] - ImplicitFOR.sql
BEGIN
-- . OPEN.
FOR v_StudentData IN (SELECT id, first_name, last_name,
FROM students
WHERE major = 'History') LOOP
- FETCH %NOTFOUND.
- .
- History 301, registered_students.
- , temp_table.
INSERT INTO registered_students (student_id, department, course)
VALUES (v_StudentData,ID, 'HIS', 301);
INSERT INTO temp_table (num_col, char_col)
VALUES (v_StudentData.ID,
v_StudentData.first_name 1 1 ' ' 1 1 v_StudentData.last_name);
END LOOP;
- , , CLOSE.
END;
FOR..
v_StudentData .
.
NO_DATA_FOUND %NOTFOUND
NO_DATA_FOUND ( ) SELECT...INTO,
WHERE .
%NOTFOUND TRUE.
WHERE UPDATE DELETE, SQJL%NOTFOUND
TRUE. , ,
NO_DATA_FOUND, %NOTFOUND
%FOUND.
214
FOR UPDATE
FOR UPDATE SELECT. ,
ORDER BY ( ):
SELECT ... FROM ... FOR UPDATE [OF 1__] [NOWAIT]
/1__, ,
. . ,
, . SELECT...FOR UPDATE.
] DECLARE
- FOR UPDATE .
CURSOR cJUlStudentds IS
.SELECT *
FROM students
FOR UPDATE OF first_name, last_name;
- .
CURSOR c_LargeClasses IS
SELECT department, course
FROM classes
WHERE max_students > 50
FOR UPDATE;
SELECT , , . ,
, .
. , , Oracle (snapshot) . ,
, . ,
, , .
, , . .
FOR UPDATE
.
.
215
,
SELECT...FOR UPDATE . NOWAIT ( ), OPEN ,
:
[_) ORA-54: resource busy and acquire with NOWAIT specified
( NOWAIT)
, .
19
SELECT...FROM...FOR UPDATE [OF __] [WAIT n]
.
, ORA-54.
WHERE CURRENT OF
FOR UPDATE, UPDATE
SELECT WHERE CURRENT OF.
:
WHERE CURRENT OF
, FOR UPDATE.
WHERE CURRENT OF , . ,
, HIS 101.
j -- Forllpdate.sql
DECLARE
- ,
- .
v_NumCredits classes.num_credits%TYPE;
- ,
- HIS 101.
CURSOR c_RegisteredStudents IS
SELECT *
FROM students
WHERE id IN (SELECT student_id
FROM registered_students
WHERE department= 'HIS'
AND course = 101)
FOR UPDATE OF current_credits;
BEGIN
- .
FOR v_Student!nfo IN c_RegisteredStudents LOOP
- HIS 101.
SELECT num credits
216
INTO v_NumCredits
FROM classes
WHERE department = 'HIS' .
AND course = 101;
- , .
UPDATE students
SET current_credits = current_credits + v_NumCredits
WHERE CURRENT OF cJtegisteredStudents;
END LOOP;
- .
COMMIT;
END;
UPDATE ,
FOR UPDATE .
, .
FOR UPDATE, , WHERE CURRENT
OF.
( ). UPDATE DELETE, ,
, , .
WHERE CURRENT , FOR UPDATE.
COMMIT
, COMMIT . , , . FOR
UPDATE , COMMIT .
, Oracle:
ORA-1002: fetch out of sequence
( )
,
.
commit.sql
DECLARE
,
- ,
CURSOR c_AHStudents IS
SELECT *
FROM students
FOR UPDATE;
-
217
v_StudentInfo c_AUStudents%ROWTYPE;
BEGIN
- . .
OPEN c_AHStudents;
- .
FETCH c_A118tudents INTO v_Student!nfo;
- COMMIT.
- .
COMMIT;
- FETCH ORA-1002.
FETCH c_AHStudents INTO v_StudentInfo;
END;
, COMMIT SELECT...FOR UPDATE, COMMIT
. COMMIT
. SELECT...FOR UPDATE, .
*^^*^^
SELECT...FOR UPDATE,
COMMIT .
, ,
"-1555 snapshot too old"
( ).
, ,
, COMMIT ? WHERE CURRENT OF ,
FOR UPDATE. WHERE UPDATE,
:
Q commit.sql
DECLARE
- ,
- .
v_NumCredits classes.num_credits%TYPE;
- ,
- HIS 101.
CURSOR c_RegisteredStudents IS
SELECT *
FROM students
WHERE id IN (SELECT student_id
FROM registered_students
WHERE department= 'HIS'
!
AND course = 101);
218
BEGIN
- .
FOR v_Student!nfo IN c_RegisteredStudents LOOP
- HIS 101.
SELECT num_credits
INTO v_NumCredits
FROM classes
WHERE department = 'HIS'
AND course = 101;
- , .
UPDATE students
SET current_credits = current_credits + v_NumCredits
WHERE id = v.Studentlnfo.id;
- ,
- FOR UPDATE.
COMMIT;
END LOOP;
END;
, , WHERE
CURRENT OF, .
, , , .
, ROWID.
ROWID PL/SQL
( ROWID UROWID)
WHERE WHERE rowid = v_RowID.
(static cursors), SQL-,
.
(cursor variable)
. PL/SQL, . PL/SQL,
.
SQL
(. 12).
219
, . ,
REF. , ,
.
,
.
. 9 10.
. OracleS . (OracleS REF ; . 12.) 3,
, . . ,
, . PL/SQL :
REF
. REF
, .
, REF CURSOR. :
TYPE _ IS REF CURSOR [RETURN _];
_ , _
, ,
.
, , .
%ROWTYPE.
. .
| RefCursors.sql
DECLARE
- %ROWTYPE
TYPE t_StudentsRef IS'REF CURSOR
RETURN students%ROWTYPE;
- ,
TYPE t_NameRecord IS RECORD (
first_name students.first_name%TYPE,
last_name students. last_name%TYPE);
-
v_NameRecord t_NameRecord;
220
6
-- , .
TYPE t_NamesRef IS REF CURSOR
RETURN t_NameRecord;
- %TYPE .
TYPE t_NamesRef2 IS REF CURSOR
RETURN t_NameRecord%TYPE;
- , .
v_StudentCV t_StudefitsRef;
v_NameCV
t_NamesRef;
, , (constrained):
. , , .
ROWTYPE_MISMATCH ( ).
PL/SQL (unconstrained)
, RETURN .
. , .
| - RefCursors.sql
DECLARE
-
TYPE t_FlexibleRef IS REF CURSOR;
- .
v_CursorVar t._FlexibleRef;
, . ,
: PL/SQL.
.
. , , -.
*.
OCI
JDBC. Oracle.
221
*
*,
SQL_CURSOR. EXEC SQL
ALLOCATE. , * :
Q
SQL_CURSOR v__CursorVar;
EXEC SQL ALLOCATE : v_CursorVar;
,
.
PL/SQL. , .
,
. .
SELECT
OPEN,
:
OPEN _ FOR onepamop_select;
_ ,
a onepamop_sekct . , , . :
rj ORA-6504: PL/SQL: return types of result set variables or query
do not match
(PL/SQL:
)
PL/SQL ,
, 7. :
)
DECLARE
TYPE t_ClassesRef IS REF CURSOR RETURN classes%ROWTYPE;
v_ClassesCV t_ClassesRef;
v_ClassesCV:
]
v_ClassesCV :
] OPEN v_ClassesCV FOR
222
ORA-6504, ,
.
OPEN...FOR, , OPEN: .
OPEN...FOR
.
FETCH ( , ), .
\
, OPEN FOR,
. " Oracle8\
SQL (. 12.)
, , CLOSE. , , ,
, , .
.
, , .
*, . PL/SQL,
classes,
rooms, .
.
]
cursor"].
/* S Q L . */
tfinclude <stdio.h>
EXEC SQL INCLUDE SQLCA;
/* */
char *v_Username = "example/example";
/* SQL. */
SQL_CURSOR v_CursorVar;
/* */
int v_Table;
/* rooms */
int
v_RoomID;
VARCHAR v_Description[2001];
/* classes */
VARCHAR v_Department[4];
int v_Course;
/* - */
void handle_error() {
printf("SQL Error occurred!\n");
printf ("%. *s\n", sqlca. sqlerrm. sqlerrml, sqlca. sqlerrm.sqlerrmc);
EXEC SQL ROLLBACK WORK RELEASE;
exit(1);
>
int main() {
/* */
char v_Choice[20];
/* . ,
SQL, handle_error(). */
EXEC SOL WHENEVER SQLERROR DO handle_error();
/* . */
EXEC SQL CONNECT : v_Username;
printf("Connected to Oracle.\n");
/* . */
EXEC SQL ALLOCATE :v_CursorVar;
/* , ,
v_Choice. */
printf("Choose from (C)lasses or (R)ooms. Enter or r: ");
gets(v_Choice);
/* . */
if (v_Choice[0] == '')
v_Table = 1;
else
v_Table = 2;
/* PL/SQL. */
EXEC SQL EXECUTE
BEGIN
IF :v_Table = 1 THEN
/* classes. */
OPEN :v_CursorVar FOR
SELECT department, course
FROM classes;
ELSE
/* rooms. */
OPEN :v_CursorVar FOR
SELECT room_id, description
FROM rooms;
223
224
END IF;
END;
END- EXEC;
/* . */
EXEC SQL WHENEVER NOT FOUND DO BREAK;
/* . */
for (;;) {
if (v_Table == 1) {
/* . */
EXEC SQL FETCH :v_CursorVar
INTO : v_Department, :v_Course;
/* . v_Department
VARCHAR, . len
. . */
printf ("%. *s %d\n", v_Department. len, v_Department.arr,
v_Course);
}
else {
/* . */
EXEC SQL FETCH :v_CursorVar
INTO :v_RoomID, v_Description;
/* . v_Description
VARCHAR, .len
. . */
printf ( "%d %. *s\n", v_RoomID, v_Description. len,
v_Description.arr);
/* . /
EXEC SQL CLOSE : v_CursorVar;
/* . */
EXEC SQL COMMIT WORK RELEASE;
( ) , . ,
. ,
classes, rooms.
,
PL/SQL. ,
classes rooms
.
9 10.
225
cursor2.sql
CREATE OR REPLACE PROCEDURE ShowCursorVariable
/* .
_ -- 'classes', temp_table
classes. p_Table - 'rooms',
rooms. */
(p_Table IN VARCHAR2) AS
/* */
TYPE t_ClassesRooms IS REF CURSOR;
/* . */
v_CursorVar t_ClassesRooms;
/* */
v_Department 'classes.department%TYPE;
v_Course
classes, course%TYPE;
v_RoomID
rooms,room_id%TYPE;
v_Description rooms. description%TYPE;
BEGIN
- .
IF p_Table = 'classes' THEN
OPEN v_CursorVar FOR
SELECT department, course
FROM classes;
ELSIF p_table = 'rooms' THEN
OPEN v_CursorVar FOR
SELECT room_id, description
FROM rooms;
ELSE
/* . */
RAISE_APPLICATION_ERROR (-20000,
'Input must be ''classes' or rooms''');
END IF;
/* . , EXIT WHEN
FETCH. */
LOOP
IF p_Table = 'classes' THEN
FETCH v_CursorVar INTO
v_Department, v_Course;
EXIT WHEN v_CursorVar%NOTFOUND;
INSERT INTO temp_table (num_col, char_col)
VALUES (v_Course, vj)epartment);
ELSE
226
END IF;
END LOOP;
/* . */
CLOSE v_CursorVar;
COMMIT;
END ShowCursorVariable;
,
,
. :
. ,
.
. PL/SQL (, Oracle
Form), .
PL/SQL ( ,
) . , REF CURSOR. , ,
(, KaKjDBC ResultSets).
SQL
*.
, OPEN...FOR,
FOR UPDATE. OracleSz
.
>
,
SQL-. , , .
, ..
. ,
.
PL/SQL.
228
, . PL/SQL
(exception)
(exception handler). Oracle ,
. ,
.
.
PL/SQL Ada,
. PL/SQL ,
, . PL/SQL Java. , Java
, PL/SQL. ,
Java, PL/SQL .
, PL/SQL, 7.1.
7.1. PL/SQL
PL/SQL
PL/SQL
:
, .
:
.
, . PL/SQL, . ,
. ,
:
) PLS-201: identifier - SSTUDENTS' must be declared
( 'SSTUDENTS' )
SELECT students:
229
DECLARE
v_NumStudents NUMBER;
BEGIN
SELECT COUNT(*)
INTO vJiumStudents
FROM sstudents;
END;
,
. SQL, :
Q ORA-0001; unique constraint violated
( )
, :
] ORA-06502: PL/SQL: numeric or value error
( )
PL/SQL , SQL
SQL PL/SQL
PL/SQL,
,
.
SQL 12.
(raised) .
,
. .
,
(,
), ,
. :
Q int = 1, = 2, z = 3;
f(x)i /* ; . */
if <>
handle_error (...);
= 1 / z;
if <>
handle_error(...);
z = + ;
if <>
handle_error(,..);
230
: . ,
. , ,
, . , , , PL/SQL:
DECLARE
NUMBER := 1;
NUMBER := 2;
z NUMBER := 3;
BEGIN
f(x);
:= 1 / z;
z = x + y;
EXCEPTION
WHEN OTHERS THEN
/* */
handle_error(...);
END;
,
. :
.
, . , , ,
.
, .
,
, . :
().
,
, , , , , Oracle, ,
, .
SQL PL/SQL.
, , PL/SQL. , (EXCEPTION)
. :
231
DECLARE
e_TooManyStudents EXCEPTION;
e_TooManyStudents , .
,
,
. , PL/SQL, 3.
Oracle , Oracle.
(NUMBER, VARCHAR2 ..),
STANDARD (. 3). , ,
, .
7.2.
Oracle (.
" EXCEPTIONJNIT").
7.2.
Oracle
ORA-0001
DUP_VAL_ON_INDEX
ORA-0051
TIMEOUT_ON_RESOURCE
ORA-0061
TRANSACTION_BACKED_OUT1
ORA-1001
INVALID_CURSOR
ORA-1012
NOT_LOGGED_ON
Oracle
ORA-1017
LOGIN_DENIED
ORA-1403
NO_DATA_FOUND
ORA-1410
SYSJNVALID.ROWID2
ORA-1422
TOO_MANY_ROWS
ORA-1476
ZERO_DIVIDE
ORA-1722
INVALID_NUMBER
rowid
SELECT...INTO
NUMBER; "1"
ORA-6500
STORAGE ERROR
PL/SQL; ,
PL/SQL
232
7
7.2.
()
Oracle
ORA-6501
PROGRAM_ERROR
PL/SQL
ORA-6502
VALUE_ERROR
ORA-6504
ROWTYPE_MISMATCH
PL/SQL
ORA-6511
ORA-6530
CURSOR_ALREADY_OPEN
ACCESSJNTO_NUlT
ORA-6531
COLLECTION IS NULL1
PL/SQL,
NULL, ,
EXISTS
ORA-6532
SUBSCRIPT_OUTSIDE_LIMIT1
,
(, -1)
ORA-6533
SUBSCRIPT_BEYOND_COUNT'
, ,
ORA-6592
CASE_NOT_FOUND3
WHEN CASE
ORA-30625
SELF IS NULL2
NULL-
NULL-
!8 .
OracleBi .
Oracle9i .
. "PL/SQL User's Guide".
INVALID_CURSOR
,
. CURSOR_ALREADY_OPEN.
NO_DATA_FOUND
. : SELECT...INTO
. , TOO_MANY_ROWS. :
PL/SQL,
. ,
NO_DATA_FOUND:
233
NoDataFound.sql
SQI_> DECLARE
2
TYPE t_NumberTableType IS TABLE OF NUMBER
3
INDEX BY BINARY_INTEGER;
4
v_NumberTable t_NumberTableType;
5
v_TempVar NUMBER;
6 BEGIN
7
v_TernpVar := v_NumberTable(1);
8 END;
9 /
DECLARE
ERROR at line 1:
ORA-01403: no data found
ORA-06512: at line 7
PL/SQL 8.
INVALID_NUMBER
SQL- . VALUE_ERROR. ,
INVALID_NUMBER, 'X' :
] INSERT INTO students (id, first_name, lastjiame)
VALUES ( ' X ' , 'SCOTT', 'Smith');
ValueError.sql
SQL> DECLARE
2
v_TempVar VARCHAR2(3);
234
3 BEGIN
4
v_TempVar := ' A B C D ' ;
5 END;
6 /
DECLARE
*
ERROR at line 1:
ORA-06502: PL/SQL: numeric or value error: character string buffer too small
ORA-06512: at line 4
SQL> DECLARE
2 v_TempVar NUMBER(2);
3 BEGIN
4
SELECT id
b
INTO v_TempVar
6
FROM students
7
WHERE last_name = 'Smith';
8 END;
9 /
DECLARE
*
ERROR at line 1:
ORA-06502: PL/SQL: numeric or value error: number precision too large
ORA-06512: at line 4
ROWTYPE_MISMATCH
PL/SQL. , ROWTYPE_MISMATCH
, , . 6,
.
, , () . , ,
RAISE,
( , Oracle EXCEPTIONJNIT)
Oracle. Oracle,
, . OTHERS (. " OTHERS").
RAISE. , " , ":
235
[_J -- UserDefined.sql
DECLARE
-
eJTooManyStudents EXCEPTION;
- , HIS-101
v_CurrentStudents NUMBER(3);
- , HIS-101
v_MaxStudents NUMBER(3);
BEGIN
/*
. */
SELECT current_students, max_students
INTO v_CurrentStudents, v_MaxStudents
FROM classes
WHERE department = 'HIS' AND course = 101;
/ . /
IF v_CurrentStudents > v_MaxStudents THEN
/* --
. */
RAISE e_TooManyStudents;
ENF IF;
END;
.
, (
), (. "
").
(. . 7.1) .
Oracle. , PL/SQL
DUP_VAL_ON_INDEX:
] - DupValOnlndex.sql
BEGIN
INSERT INTO students (id, first_name, last_name)
VALUES (20000, 'John', 'Smith');
INSERT INTO students (id, first_name, last_name)
VALUES (20000, 'Susan', 'Ryan');
END;
, id students , . INSERT
20000 :
Q ORA-0001: unique constraint (<constraint name>) violated
( )
236
DUP_VAL_ON_
INDEX.
DECLARE
A EXCEPTION;*'
BEGIN
.
.
EXCEPTION
WHEN A THEN
.
.
. 7.1.
. 7.1,
. . ,
. :
EXCEPTION
WHEN __1 THEN
_1;
WHEN __2 THEN
2;
[ WHEN OTHERS THEN
_; ]
END;
WHEN () ,
. WHEN
,
. :
) UserDefined.sql
DECLARE
237
-
e_TooManyStudents EXCEPTION;
- , HIS-101
v_CurrentStudents NUMBER(3);
- HIS-101
v_MaxStudents NUMBER(3);
BEGIN
/*
. */
SELECT current_students, max_students
INTO v_CurrentStudents, v_MaxStudents
FROM classes
WHERE department = 'HIS' AND course = 101;
/* . */
IF v_CurrentStudents > v_MaxStudents THEN
/* --
. */
RAISE e_TooManyStudents;
END IF;
EXCEPTION
WHEN e_TooManyStudents THEN
/* , , HIS-101
. ,
. */
INSERT INTO log_table (info)
VALUES ('History 101 has' | |v_CurrentStudents ||
'students: max allowed is' || v_MaxStudents);
END;
, WHEN,
OR ():
EXCEPTION
WHEN NO_DATA_FOUND OR TOO_MANY_ROWS THEN
INSERT INTO log_table (info)
Java,
,
,
, .
PL/SOL
.
238
. ,
PL/SQL PLS-483,
SQL*Plus:
DuplicateHandlers.sql
SQL> DECLARE
2
-
3
e_Exception1 EXCEPTION;
4
e_Exception2 EXCEPTION;
5 BEGIN
6 - 1
7
RAISE e_Exception1;
8 EXCEPTION
9 WHEN e_Exception2 THEN
10
INSERT INTO log_table (info)
11
VALUES ('Handler 1 executed!');
12 WHEN e_Exception1 THEN
13
INSERT INTO log_table (info)
14
VALUES ('Handler 3 executed!');
15 WHEN e_Exception1 OR e_Exception2 THEN
16
INSERT INTO log_table (info)
17
VALUES ('Handler 4 executed!');
18 END;
19 /
WHEN e_Exception1 OR e_Exception2 THEN
-
239
OTHERS:
] -- UserDefined.sql
DECLARE
-
e_TooManyStudents EXCEPTION;
- , HIS-101
v_CurrentStudents NUMBER(3);
- HIS-101
v_MaxStudents NUMBER(3);
BEGIN
/*
, */
SELECT current_students, max_students
INTO v_CurrentStudents, v_MaxStudents
FROM classes
WHERE department = 'HIS' AND course = 101;
/* . */
IF v_CurrentStudents > v_MaxStudents THEN
/* --
. */
RAISE e_TooManyStudents;
END IF;
EXCEPTION
WHEN e_TooManyStudents THEN
/* , , HIS-101
. ,
. */
INSERT INTO log_table (info)
VALUES ('History 101 has' || v_CurrentStudents ||
'students: max allowed is' || v_MaxStudents);
WHEN OTHERS THEN
/* , . */
INSERT INTO log_table (info) VALUES ('Another error occurred');
END;
OTHERS , . , , OTHERS,
SQLCODE
SQLERRM (. ).
240
*
WHEN OTHERS THEN NULL;
, ,
'. OTHERS
, ,
.
DBMS_UTILITY.FORMAT_ERROR_STACKTavKe
SQLERRM (. ).
PL/SQL,
OTHERS.
Qj - UserDefined.sql
DECLARE
-
e_TooManyStudents EXCEPTION;
- , HIS-101
v_CurrentStudents NUMBER(3);
- HIS-101
v_MaxStudents NUMBER(3);
-
v_ErrorCode NUMBER;
-
v_ErrorText VARCHAR2(200);
BEGIN
/*
. */
SELECT current_students, max_students
INTO v_CurrentStudents, v_MaxStudents
FROM classes
WHERE department = 'HIS' AND course = 101;
/* . */
IF v_CurrentStudents > v MaxStudents THEN
241
/* --
. */
RAISE e_TooManyStudents;
END IF;
EXCEPTION
WHEN e_TooManyStudents THEN
/* , , HIS-101
. ,
. */
INSERT INTO log_table (info)
VALUES ('History 101 has' | v_CurrentStudents ||
'students: max allowed is' || v_MaxStudents);
WHEN OTHERS THEN
/* , */
v_ErrorCode := SQLCODE;
- SUBSTR
v_ErrorText := SUBSTR(SQLERRM, 1, 200);
INSERT INTO log_table (code, message, info) VALUES
(v_ErrorCode, v_ErrorText, 'Oracle error occurred');
END;
\
VALUE_ERROR.
SUBSTR, v _ E r r o r T e x t 200 . SUBSTR PL/SQL
5.
, SQLCODE SQLERRM , SQL-. ,
SQL-.
SQLERRM . , . .
SQLERRM ,
] ORA-0000: normal, successful completion
SQLERRM ,
+100,
Q
non-ORACLE Exception
SQLERRM(IOO)
i_) ORA-1403: no data found
242
SQLCODE , Oracle.
"ORA-1403: no data found", SQLCODE
+100.
SQLERRM
,
f_] ORA-0000: normal, successful completion
A SQLCODE 0.
:
[_)
-- sqlerrm.sql
SQL> BEGIN
2
DBMS_OUTPUT.PUT_LINECSQLERRM(0): ' || SQLERRM(O));
3
DBMS_OUTPUT.PUT_LINECSQLERRM(100): ' | SQLERRM(IOO));
4
DBMS_OUTPUT.PUT_LINE('SQLERRM(10): ' | | SQLERRM(IO));
5
DBMS_OUTPUT.PUT_LINE('SQLERRM: ' || SQLERRM);
6
DBMS_OUTPUT.PUT_LINECSQLERRM(-1): ' | SQLERRM(-1));
7
DBMS_OUTPUT.PUT_LINE( 1 SQLERRM(-54): ' || SQLERRM(-54));
8 END
9 /
SQLERRM
( , SQLCODE).
, ,
-1 (. ).
EXCEPTIONJNIT
Oracle, , OTHERS.
EXCEPTIONJNIT (. 3). EXCEPTIONJNIT
:
PRAGMA EXCEPTIONJNIT (__,11,,
_ _ Oracle);
__ ,
, __01 , .
.
243
, e_MissingNull
,
"ORA-1400: mandatory NOT NULL column missing or
NULL during insert" ( NOT NULL
NULL-).
Q - Exceptionlnit.sql
DECLARE
e_MissingNull EXCEPTION;
PRAGMA EXCEPTION_INIT(e_MissingNull, -1400);
BEGIN
INSERT INTO students (id) VALUES (NULL);
EXCEPTION
WHEN e_MissingNull then
INSERT INTO log_table (info) VALUES ('ORA-1400 occurred');
END;
PRAGMA EXCEPTION_INIT
Oracle ,
.
SQLCODE SQLERRM , Oracle, "User- Defined Exception" ( ).
RAISE_APPLICATION JERROR
, , ,
RAISE_APPLICATION_ERROR. , , , Oracle.
RAISE_APPLICATION_ERROR :
RAISE_APPLICATION_ERROR( _, __,
[_]);
244
7
p_StudentID IN students. id%TYPE,
p_Department IN classes.department%TYPE,
p_Course IN classes.course%TYPE$ AS
v_CurrentStudents classes. current_students%TYPE;
v_MaxStudents classes. max_students%TYPE;
v_NumCredlts classes.num_credits%TYPE;
v_Count NUMBER;
BEGIN
/*
. */
BEGIN
SELECT current_students, max_students, num_credits
INTO v_CurrentStudents, v_MaxStudents, v_NumCredits
FROM classes
WHERE course = p_Course
AND department = p_Department;
/* , . */
IF v_CurrentStudents + 1 > v_MaxStudents THEN
RAISE_APPLICATION_ERROR(-20000, 'Can' 't add more students to ' | I
p_Department || ' ' || p_Course);
END IF;
EXCEPTION
WHEN NO_DATA_FOUND THEN
END;
/* */
RAISE_APPLICATION_ERROR(-20001, p_Department || ' ' II
p_Course || ' doesrT't exist');
/* , */
SELECT COUNT(*)
INTO v_Count
FROM registered_students
WHERE student.id = p_StudentID
AND department = p_Department
AND course = p_Course;
IF v_count = 1 THEN
RAISE APPLICATION ERROR (-20002,
245
Register RAISE_APPLICATION_ERROR . , ,
SELECT...INTO. NO_DATA_FOUND,
,
RAISE_APPLICATION_ERROR
, . , , . , RAISE_APPLICATION_ERROR,
. , ,
, ,
, SELECT ... INTO.
,
registered_students, students classes.
SQL*Plus Register . ,
( tables, sql).
-- Register.sql
SQL> -- ORA-2001 ORA-2002
SQL> exec Register(10000, ' C S ' , 999);
BEGIN Register(10000, ' O S ' , 999); END;
ERROR at line 1:
ERROR at line 1:
ORA-20002: Student 10000 is already registered for CS 102
ORA-06512: at "DEMO. REGISTER", line 40
ORA-06512: at line 1
SQL> -- MUS 410, ORA-2003
SQL> exec Register(10002, 'MUS', 410);
PL/SQL procedure successfully completed.
SQL> exec Register(10005, 'MUS', 410);
BEGIN Register(10005, 'MUS', 410); END;
ERROR at line 1:
ORA-20000: Can't add more students to MUS 410
ORA-06512: at "DEMO. REGISTER", line 23
ORA-06512: at line 1
246
, NO_DATA_FOUND:
[J Register.sql
SQL> BEGIN
2
RAISE NO_DATA_FOUND;
3 END;
4 /
BEGIN
*
ERROR at line 1:
ORA-01403: no data found
ORA-06512: at line 2
Oracle . ,
ORA-6512, , . RAISE_
APPLICATION_ERROR
, Oracle.
,
.
,
PL/SQL. , ,
. ,
? , () (exception
propagation).
,
PL/SQL, , ,
:
1.
, ,
.
2. ,
. 1. , ,
SQL*Plus.
247
, ,
(enclosing block). , .. .
:
DECLARE
- .
BEGIN
DECLARE
- 1, .
BEGIN
END;
BEGIN
- 2,
- . ,
- .
END;
- .
END;
. , 1 2, .
,
:
BEGIN
- .
- . .
F(...);
EXCEPTION
WHEN OTHERS THEN
- , F, .
END;
F ,
,
, .
1, 2 3.
248
1
1. .
.
DECLARE
A EXCEPTION;
BEGIN
BEGIN
RAISE A;
EXCEPTION
WHEN A THEN
END;
END;
2
2 .
;
1. .
DECLARE
A EXCEPTION;
EXCEPTION;
BEGIN
BEGIN
RAISE ;
EXCEPTION
WHEN A THEN
.
.
END;
EXCEPTION
WHEN THEN
END;
.
,
.
249
3
2 .
,
. 2 , ,
.
DECLARE
A EXCEPTION;
EXCEPTION;
EXCEPTION;
BEGIN
BEGIN ^
RAISE ;
EXCEPTION
WHEN A THEN
END;
EXCEPTION
WHEN THEN
.
,
.
END;
.
.
,
, .
, . , .
4 5.
4
VALUE_ERROR
v_Number NUMBER(3) := 'ABC'
250
.
OTHERS, . ,
(. 5).
DECLARE
vjlumber NUMBER (3) = 'ABC
BEGIN
VALUE_ERROR.
OTHERS, .
EXCEPTION
WHEN OTHERS THEN
VALUE ERROR.
END;
5
4,
VALUE_ERROR.
, OTHERS,
,
.
BEGIN
DECLARE
vjumber NUMBER (3)
BEGIN
EXCEPTION
WHEN OTHERS THEN
END;
EXCEPTION
WHEN OTHERS THEN
END;
:= 'ABC
VALUE ERROR.
OTHERS
.
.
,
.
251
,
, RAISE,
. ,
. ,
. , , . 6, 7 8.
6
, . .
, . 5,
, (. 7).
DECLARE
A EXCEPTION;
EXCEPTION;
BEGIN
RAISE *
EXCEPTION
WHEN A THEN
RAISE *
WHEN THEN
END;
.
,
.
,
.
.
.
7
6, . , .
?.
252
BEGIN
DECLARE
A EXCEPTION; * -
EXCEPTION;
BEGIN
RAISE A;
EXCEPTION
WHEN A THEN
RAISE B;
S
WHEN THEN *"
^
^
^
,
.
, .
.
EXCEPTION
WHEN THEN
END;
.
,
.
8
6 7, RAISE ,
. . , , ,
.
INSERT COMMIT. , INSERT - (. 4).
DECLARE
A EXCEPTION;
BEGIN
RAISE A;
EXCEPTION
WHEN A THEN
INSERT INTO logjrable (info) VALUES
('Exception A occurred');
COMMIT;
RAISE;
END;
.
,
.
.
,
.
253
.
, , , , .
. , , ,
. :
)
- OutOfScope.sql
SQL> BEGIN
2
DECLARE
3
eJJserDefinedException EXCEPTION;
4
BEGIN
5
RAISE e_UserDefinedException;
6 END;
7 EXCEPTION
8
/* e_UserDefinedException ;
9
OTHERS. */
10 WHEN OTHERS THEN
11
/* ,
12
. */
13
RAISE;
14 END;
15 /
BEGIN
*
ERROR at line 1:
ORA-06510: PL/SQL: unhandled user-defined exception
ORA-06512: at line 13
, , ,
, , RAISE_APPLICATION_ERROR (. ). Globals e _ U s e r D e f i n e d E x c e p t i o n ,
. :
Q OutOf Scope, sql
CREATE OR REPLACE PACKAGE Globals AS
/* .
. ,
254
. */
/* , */
eJJserDefinedException EXCEPTION;
END Globals;
Globals :
| - OutOfScope.sql
BEGIN
BEGIN
RAISE Globals.eJJserDefinedException;
END;
EXCEPTION
/* e_UserDefinedException ,
. */
WHEN Globals.eJJserDefinedException THEN
/* ,
. */
RAISE;
END;
, Globals
, PL/SQL (. 9 10).
, .
OTHERS, . ,
, :
rj DECLARE
vJrrrorNumber NUMBER;
vJErrorText VARCHAR2(200);
-
-
- .
BEGIN
/* */
EXCEPTION
WHEN OTHERS THEN
/* ,
. /
vJ^rrorNumber := SQLCODE;
vJ^rrorText := SUBSTR(SQLERRM, 1, 200);
INSERT INTO log_table (code, message, info) VALUES
(vJErrorNumber, vJErrorText, 'Oracle error occurred at' 1 1
TO_CHAR(SYSDATE, 'DD-MON-YY HH24:MIiSS 1 ));
END;
255
, SQL-
,
. :
[J
BEGIN
SELECT . . .
SELECT . . .
SELECT . . .
EXCEPTION
WHEN NO_DATA_FOUND THEN
- SELECT ?
END;
.
, SQL-:
] DECLARE^
-
v_SelectCounter NUMBER := 1;
BEGIN
SELECT .. .
v_SelectCounter := 2;
SELECT , . .
v_SelectCounter := 3;
SELECT .. .
EXCEPTION
WHEN NO_DATA_FOUND THEN
INSERT INTO log_table (info) VALUES ('No data found in select' [ |
v_SelectCounter);
END;
:
rj BEGIN
BEGIN
SELECT . . .
EXCEPTION
WHEN NO_DATA_FOUND THEN
INSERT INTO log_table (info) VALUES ( ' N o data found in
select 1');
END;
BEGIN
SELECT . . .
EXCEPTION
WHEN NO_DATA_FOUND THEN
INSERT INTO log_table (info) VALUES ('No data found in
select 2 ' ) ;
END;
BEGIN
256
SELECT . . .
EXCEPTION
WHEN NO_DATA_FOUND THEN
END;
END;
, , , ,
. PL/SQL DBMS_UTILITY.
FORMAT_CALL_STACK, VARCHAR2,
(call stack).
, , :
Q ErrorPkg.sql
CREATE OR REPLACE PROCEDURE AS
v_CallStack VARCHAR2(2000);
BEGIN
v_CallStack := DBMS_UTILITY.FORMAT_CALL_STACK;
INSERT INTO temp_table (char_col) VALUES (v_CallStack);
INSERT INTO temp_table (num_col)
VALUES
(-1);
END C;
EXAMPLE.
EXAMPLE.
EXAMPLE.A
block
257
FORMAT_CALL_STACK, DBMS_UTILITY.FORMAT_
ERROR_STACK . ,
, .
.
rj -- ErrorPkg.sql
CREATE TABLE errors (
module
VARCHAR2(50),
seq_number
NUMBER,
error_number
NUMBER,
errorjnesg
VARCHAR2(100),
error_stack
VARCHAR2(2000),
call_stack
VARCHAR2(2000),
timestamp
DATE,
PRIMARY KEY (module, seq_number));
CREATE TABLE call_stacks (
module VARCHAR2(50),
seq_number
NUMBER,
call_order
NUMBER.
object_handle VARCHAR2(10),
line_num
NUMBER,
object_name
VARCHAR2(80),
PRIMARY KEY (module, seq_number, call_order),
FOREIGN KEY (module, seq_number) REFERENCES errors ON DELETE CASCADE);
CREATE TABLE error_stacks (
module
VARCHAR2(50),
seq_number
NUMBER,
error_order
NUMBER,
facility
CHAR(3),
error_number
NUMBER(5),
errorjnesg
VARCHAR2(100),
PRIMARY KEY (module, seq_number, error_order),
FOREIGN KEY (module, seq_number) REFERENCES errors ON DELETE CASCADE);
CREATE SEQUENCE error_seq
START WITH 1
INCREMENT BY 1;
, ErrorPkg:
| ErrorPkg.sql
/* ,
DBM9-_UTILITY. FORMAT_ERROR_STACK
DBMS_UTILITY.FORMAT_CALL_STACK.
errors,
call_stacks error_stacks. */
CREATE OR REPLACE PACKAGE ErrorPkg AS
258
7
- . HandleAll
- ,
- . _
- .
-- .
PROCEDURE HandleAll(p_Top BOOLEAN);
- (
- DBMS_OUTPUT) .
PROCEDURE PrintStacks(p_Module IN errors.moduleXTYPE,
p_SeqNum IN errors.seq_numberXTYPE);
-
- errors call_stacks.
- , .
- p_CommitFlag (TRUE),
-- .
- StoreStacks
- .
- HandleAll _ = TRUE.
PROCEDURE StoreStacks(p_Module IN errors.moduleXTYPE,
p_SeqNum OUT errors. seq_numberXTYPE,
p_CommitFlag BOOLEAN DEFAULT FALSE);
END ErrorPkg;
CREATE OR REPLACE PACKAGE BODY ErrorPkg AS
v_NewLine CONSTANT CHAR(1) := CHR(10);
v_Handled
v_ErrorStack
v_CallStack
BOOLEAN := FALSE;
VARCHAR2(2000);
VARCHAR2(2000);
259
v_SeqNum
NUMBER;
v_Index
v_Length
v_End
NUMBER;
NUMBER;
NUMBER;
v_Call
VARCHAR2(100);
v_Ca!10rder NUMBER := 1;
260
v_Handle
call_stacks.object_handle%TYPE;
v_LineNum
call_stacks.line_num%TYPE;
v_ObjectName call_stacks.object_name%TYPE;
v_Error
v_ErrorOrder
v_Facility
v_ErrNum
v_ErrMsg
VARCHAR2(120);
NUMBER := 1;
error_stacks.facility%TYPE;
error_stacks.error_number%TYPE;
error_ stacks. errorjnesg%TYPE;
v_FirstErrNum errors,error_number%TYPE;
v_FirstErrMsg errors.error_mesg%TYPE;
BEGIN
- .
SELECT error_seq.nextval
INTO v_SeqNum
FROM dual;
p_SeqNum := v_SeqNum;
- errors.
INSERT INTO errors
(module, seq_number, error_stack, call_stack, timestamp)
VALUES
(p_Module, v_SeqNum, v_ErrorStack, v_CallStack, SYSDATE);
- .
- .
- .
v_Index := 1;
- ,
- . .
WHILE v_Index < LENGTH(v_ErrorStack) LOOP
- v_End .
v_End := INSTR(v._ErrorStack, v_NewLine, v_Index);
- ,
- ,
v_Error := SUBSTR(v_ErrorStack, v_Index, v_End - v_Index);
- .
v_Index := v_Index + LENGTH(v_Error) + 1;
- :
'-: '.
- .
- -- 3 .
v_Facility := SUBSTR(v_Error, 1, 3);
- ( 4 ).
v_Error := SUBSTR(v_Error, 5);
261
- .
v_ErrNum := TO_NUMBER(SUBSTR(v_Error, 1,
INSTR(v_Error, ':') - 1));
- , ( 7 ).
v_Error := SUBSTR(v_Error, 8);
- .
v_ErrMsg := v_Error;
- ,
- .
INSERT INTO error_stacks
(module, seq_number, error_order, facility, error_number,
errorjnesg)
VALUES
(p_Module, p_SeqNum, v_ErrorOrder, v_Facility, v_ErrNum,
v_ErrMsg);
IF v_ErrorOrder = 1 THEN
v_FirstErrNum := v_ErrNum;
v_FirstErrMsg := v_Facility || ' ' |l TO_NUMBER(v_ErrNum) ||
' : ' || v_ErrMsg;
END IF;
v_ErrorOrder := v_ErrorOrder + 1;
END LOOP;
- errors, ,
UPDATE errors
SET error_number = v_FirstErrNum,
error_mesg = v_FirstErrMsg
WHERE module = p_Module
AND seq_number = v_SeqNum;
-
- . .
- ,
- , .. ,
- 'name' .
v_Index := INSTR(v_CallStack, 'name') + 5;
- ,
- . .
WHILE v_Index < LENGTH(v_CallStack) LOOP
- v_End .
v_End := INSTR(v_CallStack, v_NewLine, v_Index);
- ,
- .
v_Call := SUBSTR(v_CallStack, v_Index, v_End - vjndex);
- .
v_Index := v_Index + LENGTH(v_Call) + 1;
262
7
- ,
- ,
- .
- .
- .
v_Call := LTRIM(v_Call);
- .
v_Handle := SUBSTR(v_Call, 1, INSTR(v_Call, ' '));
- .
v_Call := SUBSTR(v_Call, LENGTH(v_Handle) + 1);
v_Call := LTRIM(v_Call);
- .
v_LineNum := TO_NUMBER(SUBSTR(v_Call, 1, INSTR(v_Call, ' ')));
- .
v_Call := SUBSTR(v_Call, LENGTH(v_LineNum) + 1);
v_Call := LTRIM(v_Call);
- .
v_ObjectName := v_Call;
- , ErrorPkg.
IF v_Ca!10rder > 1 THEN
INSERT INTO call_stacks
(module, seq_number, call_order, object_handle, line_num,
object_name)
VALUES
(p_Module, v_SeqNum, v_Ca!10rder, v_Handle r v_LineNum,
v_ObjectName);
END IF;
v_Callorder := v_Ca!10rder + 1;
END LOOP;
IF p_CommitFlag THEN
COMMIT;
END IF;
END StoreStacks;
END ErrorPkg;
temp_table ( CREATE TRIGGER),
ZERO_DIVIDE, , :
Q - ErrorPkg.sql
CREATE OR REPLACE TRIGGER temp_insert
BEFORE INSERT ON temp_table
263
BEGIN
RAISE ZERO_DIVIDE;
END temp_insert;
CREATE OR REPLACE PROCEDURE AS
BEGIN
INSERT INTO temp_table (num_col) VALUES (7);
EXCEPTION
WHEN OTHERS THEN
ErrorPkg.HandleAll(FALSE);
RAISE;
END C;
CREATE OR REPLACE PROCEDURE AS
BEGIN
C;
EXCEPTION
WHEN OTHERS THEN
ErrorPkg.HandleAll(FALSE);
RAISE;
END B;
CREATE OR REPLACE PROCEDURE A AS
v_ErrorSeq NUMBER;
BEGIN
B;
EXCEPTION
WHEN OTHERS THEN
ErrorPkg.HandleAll(TRUE);
ErrorPkg. StoreStacksCError Test 1 , v_ErrorSeq, TRUE);
ErrorPkg. PrintStacksCError Test', v_ErrorSeq);
END A;
, , ( ),
:
Q
, ErrorPkg ( ) ,
. HandleAll
TRUE. ErrorPkg
, . StoreStacks e r r o r s , e r r o r _ s t a c k s
call_stacks, .
(module) (package)
.
264
, ,
StoreStacks. PrintStacks errors, DBMS_OUTPUT. ,
SQL*Plus ,
:
| rPkg.sql
SQL> SET SERVEROUTPUT ON SIZE 1000000 FORMAT TRUNCATED
SQL> exec A;
, PL/SQL . PL/SQL
. ,
: Oracle
, . , , PL/SQL.
.
266
PL/SQL : (.
3). , students, . .
, .
,
, Java. : ,
.
(index-by tables) PL/SQL 2.0
( Oracle? 7.0)
PL/SQL 2.3 ( Oracle? 7.3). (nested tables),
OracleS, ( (table attributes) ).
( )
SQL. PL/SQL,
.
PL/SQL.
Oracle? PL/SQL .
OracleS PL/SQL ,
.
267
.
.
Java. , PL/SQL, ( ,
). :
TYPE _ IS TABLE OF INDEX BY BINARY_INTEGER;
_ ,
%TYPE %ROWTYPE.
PL/SQL.
- indexBy.sql
DECLARE
INDEX BY BINARYJNTEGER
,
.
, PL/SQL :
_()
_ , ,
BINARYJNTEGER, ,
BINARY_INTEGER.
PL/SQL:
| -- indexBy.sql
BEGIN
v_Names(1) ;= 'Scott';
v_Dates(-4) := SYSDATE - 1;
END;
, ,
(lvalue), ,
PL/SQL.
268
Java
PL/SQL,
:
-- indexBy.sql
DECLARE
TYPE Character-Tab IS TABLE OF VARCHAR2(10)
INDEX BY BINARY_INTEGER;
v_Characters CharacterTab;
BEGIN
- . ,
- .
, v_Characters(0) := 'Harold';
v_Characters(-7) := 'Susan';
v_Characters(3) := ' S t e v e ' ;
END;
Java,
-.
: key () value ().
BINARYJNTEGER, ,
( VARCHAR2(10)).
v_Characters
, 8.1. :
.
( ) , BINARY_INTEGER
(-2147483647...+2147483647).
. ,
, ( PL/SQL
Java, , 1).
, , .
,
BINARYJNTEGER.
, ,
BINARYJNTEGER.
8.1. v_Characters
7
3
Harold
Susan
Steve
269
'- , INSERT, . -
SELECT. , - , , PL/SQL "ORA-1403: no data found" ( ),
.
SQL*Plus:
[_] indexBy.sql
SQL> DECLARE
2
TYPE NumberTab IS TABLE OF NUMBER
3
INDEX BY BINARY_INTEGER;
4
v_Numbers NumberTab;
5 BEGIN
6
- .
7
FOR v_Count IN 1..10 LOOP
8
v_Numbers(v_Count) := v_Count * 10;
9
END LOOP;
10
11
- .
12
DBMS_OuTPUT.PuT_LINECTable elements: ');
13
FOR v_Count IN 1..10 LOOP
14
DBMS_OUTPUT.PUT_LINEC v_Numbers(' || v_Count | ' ) : ' ||
15
v_Numbers(v_Count));
16
END LOOP;
17
18
19
20
21
22
23
24
- v_Numbers(11).
- , NO_DATA_FOUND.
BEGIN
DBMS_OuTPUT.PUT_LINE('v_Numbers(11): ' | | v_Numbers(11));
EXCEPTION
WHEN NO_DATA_FOUND THEN
DBMS_OUTPUT. PUT_LINE(
25
26 END;
27 END;
28 /
Table elements:
v_Numbers(1): 10
v_Numbers(2): 20
v_Numbers(3): 30
v_Numbers(4): 40
v_Numbers(5): 50
v_Numbers(6): 60
v_Numbers(7): 70
v_Numbers(8): 80
v_Numbers(9): 90
v_Numbers(10): 100
270
No data found reading v_Nurnbers(11)!
PL/SQL procedure successfully completed.
DBMS_OUTPUT 2,
PL/SQL
7.
DELETE
(. ).
Oracle? 7.3
. OracleS , 19
.
, :
tabRecord.sql
DECLARE
END;
, :
().
OracleS , :
- tabObject.sql
CREATE OR REPLACE TYPE MyObject AS OBJECT (
fieldl NUMBER,
field2 VARCHAR2(20),
fields DATE);
271
DECLARE
TYPE ObjectTab IS TABLE OF MyObject
INDEX BY BINARY INTEGER;
/* v_0bject MyObject */
v_0bjects ObjectTab;
BEGIN
/* v_0bjects(1) .
* . */
v_0bjects(1) := MyObjectd, NULL, NULL);
v_0bjects(1).field2 := 'Hello World!';
v_0bjects(1). fields := SYSDATE;
END;
SOL
CREATE TYPE.
.
12.
. , :
(. ). ,
, , , . ,
. , ,
, ,
2 ,
.
:
TYPE _, IS TABLE OF _, [NOT NULL];
_, , _
. , , ,
%TYPE, BOOLEAN, NCHAR,
NCLOB, NVARCHAR2 REF CURSOR. OracleQf TABLE VARRAY.
19 (. ). NOT NULL,
NULL.
272
INDEX BY BINARY'JNTEGER.
, ,
.
.
nested.sql
DECLARE
- ,
TYPE ObjectTab IS TABLE OF MyObject;
-- , %ROWTYPE
TYPE StudentsTab IS TABLE OF studerits%ROWTYPE;
- , ,
v_ClassList StudentsTab;
v_ObjectList ObjectTab;
MyObject .
.
(. )
, PL/SQL,
NULL. NULL- "ORA-6531: Reference to uninitialized collection" ( ).
COLLECTION_IS_NULL. :
] - nested.sql
BEGIN
-
- COLLECTION_IS_NULL, v_ObjectList
- NULL.
v_ObjectList(1) :=
MyObject(-17, 'Goodbye', TO_DATE('01-01-200V, 'DD-MM-YYYY'));
END;
? -.
, . ,
,
.
, 1. SQL*Plus :
273
Q tConstruct.sql
SQL> DECLARE
2 TYPE NumbersTab IS TABLE OF NUMBER;
3
4
- .
5 v_Tab1 NumbersTab := NumbersTab(-t);
7
- .
8 v_Primes NumbersTab := NunbersTab(1, 2, 3, 5, 7);
9
10 -- .
11 v_Tab2 NumbersTab := NumbersTabQ;
12 BEGIN
13 - v_Tab1(1). ,
14 -- v_Tab(1) (-1), .
15 v_Tab1(1) := 12345;
16
17
- v_Primes.
18 FOR v_Count IN 1..5 LOOP
19
DBMS_OUTPUT.PUT(v_Primes(v_Count) || ' ');
20
END LOOP;
21
DBMS_OUTPUT.NEW_LINE;
22 END;
23 /
12357
v_Tab2 .
,
NULL-. SQL*Plus:
]
~ nullTable.sql
SQL> DECLARE
2
TYPE WordsTab IS TABLE OF VARCHAR2(50);
3
3
- NULL-.
4
v_Tab1 WordsTab;
5
5
- , NULL.
6
v_Tab2 WordsTab := WordsTabQ;
7 BEGIN
8
9
10
11
274
12
END IF;
13
13 . IF v_Tab2 IS NULL THEN
14
DBMS_OUTPUT.PUT_LINE('v_Tab2 is N U L L ' ) ;
15
ELSE
DBMS_OUTPUT.PUT_LINECv_Tab2 is not NULL');
16
17
END IF;
18 END;
19 /
v_Tab1 is NULL
v_Tab2 is not NULL
PL/SQL procedure successfully completed.
, , .
, PL/SQL "ORA-6533: Subscript
beyond count" ( ), SUBSCRIPT_BEYOND_COUNT.
:
tabAssign.sql.
SQL> DECLARE
2 TYPE NumbersTab IS TABLE OF NUMBER;
3 v_Numbers NumbersTab := NumbersTab(1, 2, 3);
4. BEGIN
5
- v_Numbers 3 .
6 - .
7 v_Numbers(1) := 7;
8 v_Numbers(2) := -1;
9
10
- ORA-6533.
11 v_Numbers(4) := 4;
12 END;
13 /
DECLARE
ERROR at line 1:
ORA-06533: Subscript beyond count
ORA-06512: at line 11
EXTEND (. ).
, (varray, varying
array, variable length array), ,
Java.
275
,
.
, .
; , 1 , .
2 .
, Java, , , .
:
TYPE _1$ (VARRAY | VARYING ARRAY] (_)
OF _ [NOT NULL];
_ , _ , , _ ,
PL/SQL. ,
%TYPE, BOOLEAN, NCHAR,
NCLOB, NVARCHAR2, REF CURSOR. 19 TABLE VARRAY. :
Q varray.sql
DECLARE
- .
- , null.
TYPE NumberList IS VARRAY(10) OF NUMBER(3) NOT NULL;
-- PL/SQL.
TYPE StudentList IS VARRAY(IOO) OF students%ROWTYPE;
-- .
TYPE ObjectList IS VARRAY(25) OF MyObject;
, . , ,
, .
SQL*Plus:
| Construct.sql
SQL> DECLARE
2
- .
3
TYPE Numbers IS VARRAY(20) OF NUMBER(3);
4
276
8
4 -- NULL.
5 v_NullList Numbers;
6
6
- 2 .
7 v_List1 Numbers := Numbers(1, 2);
8
8
- 1 , NULL
9 v_List2 Numbers := Numbers(NULL);
10 BEGIN
11 IF v_NullList IS NULL THEN
12
DBMS_OUTPUT.PUT_LINE('v_NullList is NULL');
13 END IF;
14
14 IF v_List2(1) IS NULL THEN
15
DBMS_OUTPUT.PUT_LINE('v_List2(1) is NULL');
16 END IF;
17 END;
18 /
v_NullList is NULL
v_List2(1) is NULL
PL/SQL procedure successfully completed.
, ,
. ,
, "ORA-6533: Subscript beyond count" ( ). SQL*Plus:
) varAssign.sql
SQL> DECLARE
2
TYPE Strings IS VARRAY(5) OF VARCHAR2(10);
3
4
- , .
5
v_List Strings :=
6
Strings('0ne', 'Two', 'Three');
7 BEGIN
8
- 1 3,
9 - .
10 v_List(2) := 'TWO';
11
12
- ; ORA-6533.
13 v_List(4) := '!!!';
14 END;
15 /
DECLARE
*
ERROR at line 1:
ORA-06533: Subscript beyond count
ORA-06512: at line 12
277
,
EXTEND (. ).
,
.
"ORA-6532: Subscript outside of limit" (
), SUBSCRIPT_OUTSIDE_LIMIT. :
J vAssign.sql
SQL> DECLARE
2
TYPE Strings IS VARRAY(5) OF VARCHAR2(10);
- ,
v_List Strings :=
5 Strings('One', ' T w o ' , 'Three', ' F o u r ' ) ;
BEGIN
7
- 1 4, .
8 v_List(2) := ' T W O ' ;
3
4
9
10
- 5
11
-- .
12 v_List.EXTEND;
13 v_List(5) := 'Five';
14
15
- 6 .
16
- ORA-6532.
17 v_list.EXTEND;
18 END;
19 /
DECLARE
ERROR at line 1:
ORA-06532: Subscript outside of limit
ORA-06512: at line 17
. 19 , .. .
" ". , , ,
. .
278
-- multilevel.sql
DECLARE
-
TYPE tjlumbers IS TABLE OF NUMBER
INDEX BY BINARYJMEGER;
- , t_Numbers.
- .
TYPE t_MultiNumbers IS TABLE OF t_Numbers
INDEX BY BINARY_INTEGER;
--
TYPE t_MultiVarray IS VARRAY(10) OF t_Numbers;
--
TYPE t_MultiNested IS TABLE OF t_Numbers;
v_MultiNumbers t_MultiNumbers;
, :
multilevel.sql
BEGIN
vJlultiNumbers (1) (1) := 12345;
END;
. 8.2.
8.2.
OracleT.O,
7.3
Oracle7.3
OracleS
OracleS
Oracle7.3,
Oracle7.3,
279
8.2. ()
NULL
NO_DATA_FOUND
PL/SQL
NULL
,
;
NULL
SUBSCRIPT_BEYOND_COUNT
PL/SQL
SUBSCRIPT_BEYOND_COUNT
PL/SQL
CREATE TYPE'
CREATE TYPE*
:
( ) PL/SQL .
(
PL/SQL).
.
:
,
.
,
.
:
.
.
280
, ,
.
:
SQL ,
.
1...2147483647, -2147483647... 2147483647,
.. , .
NULL ( IS NULL).
/ .
,
EXTEND TRIM (. ).
PL/SQL ( ), ( ).
PL/SQL.
( ) .
.
, .
, PL/SQL,
SQL. , PL/SQL
CREATE TYPE, . :
Q - typeLocation.sql
SQL> - , SQL PL/SQL.
SQL> CREATE OR REPLACE TYPE NameList AS
2 VARRAY(20) OF VARCHAR2(30);
3 /
281
Type created.
SQL> DECLARE
2
-- .
3
TYPE DateList IS VARRAY(10) OF DATE;
4
f
<
- DateList NameList,
5
v_Dates DateList;
6
v_Names NameList;
7 BEGIN
8
NULL;
9 END;
10 /
PL/SQL procedure successfully completed.
SQL> DECLARE
2
- NameList PL/SQL,
3
- .
4
v_Names2 NameList;
5 BEGIN
6
NULL;
7 END;
8 /
, ( CREATE OR REPLACE
TYPE), PL/SQL,
, . ,
(. ).
, PL/SQL,
. ,
, PL/SQL,
.
.
books , , .
:
) tables, sql
CREATE TABLE books (
catalog_number NUMBER(4) PRIMARY KEY,
title
VARCHAR2(40),
author!
VARCHAR2(40),
author2
VARCHAR2(40),
282
authors
author4
VARCHAR2(40),
VARCHAR2(40)
catalog_number ,
author"!. . ,author4
", ". books tables, sql:
rj INSERT INTO books (catalog_number, title, authoVD
VALUES (1000, "Oracle8i Advanced PL/SQL Programming',
'Urman, Scott');
INSERT INTO books (catalog_number, title, authorl, author2, author3)
VALUES (1001, 'OracleSi: A Beginner' 's Guide' ,
'Abbey, Michael', 'Corey, Michael J . ' ,
'Abramson, Ian');
INSERT INTO books (catalog_number, title, authorl, author2, authors, author4)
VALUES (1002, 'OracleS Tuning',
'Corey, Michael J . ' , 'Abbey, Michael',
'Dechichio, Daniel J . ' , 'Abramson, Ian');
INSERT INTO books (catalog_number, title, authorl, author2)
VALUES (2001, 'A History of the W o r l d ' ,
'Arlington, Arlene', 'Verity, Victor');
- tables. sql
CREATE OR REPLACE TYPE BookList AS VARRAY(10) OF NUMBER(4);
283
,
4 ,
LOB. OracleSi
LOB CREATE TABLE.
LOB 12,
CREATE TABLE "SQL Reference Guide".
class_material ,
. . - ,
CREATE TYPE. classjnaterial (
) . 8.1. , ( ) required_reading.
classjnaterial
Department
Course
MUS
CS
HIS
100
102
101
Required Reading
3001 | 3002
1000
1001 | 1002
2001
. 8.1.
,
. . . :
)
- tables, sql
CREATE OR REPLACE TYPE StudentList AS TABLE OF NUMBER(5);
CREATE TABLE library_catalog (
catalog_number NUMBER(4),
FOREIGN KEY (catalog_number) REFERENCES books(catalog_number),
num_copies
NUMBER,
num_out
NUMBER,
checked_out
StudentList)
NESTED TABLE checked_out STORE AS cojtab;
library_catalog , , ,
, .
:
,
.
, CREATE TYPE.
284
NESTED TABLE,
.
(store table) , .
, .
checked_out (REF) co_tab,
. l i b r a r y _ c a t a l o g . 8.2.
library_catalog checked_out (REF)
co_tab.
Catalog Number
1000
1001
1002
2001
3001
3002
library_catalog
Mum Copies Num Out
20
3
20
3
3
10
50
0
5
0
1
5
Checked out
*^^5
*\
\
\
V
. 8.2.
( co_tab)
, .
, user_tables,
.
Oracle "ORA-22812: Cannot reference nested table
column's storage table" (
).
SQL-,
.
NESTED TABLE CREATE
TABLE "Oracle SOL Reference".
tab
285
SQL- DML
.
, .
PL/SQL, SQL (. "SQL- TABLE").
INSERT
INSERT.
. , PL/SQL.
class_material (.
. 8.1):
] - collectionDML.sql
DECLARE
v_CSBooks Booklist := BookList(1000, 1001, 1002);
v_HistoryBooks Booklist := BookList(2001);
BEGIN
- INSERT 2
-- .
INSERT INTO classjnaterial
VALUES CMUS', 100, BookList(3001, 3002));
- INSERT
-- 3 .
INSERT INTO classjnaterial VALUES CCS', 102, v_CSBooks);
- INSERT
- 1 .
INSERT INTO classjnaterial VALUES ('HIS 1 , 101, v_HistoryBooks);
END;
UPDATE
UPDATE. l i b r a r y _
catalog , . 8.2:
Q -- collectionDML.sql
DECLARE
v_StudentList1 Studentlist := Studentlist(10000, 10002,
v_Studentlist2 Studentlist := Studentlist( 10000, 10002,
v_Studentlist3 Studentlist := Studentlist(10000, 10002,
BEGIN
- NULL-.
INSERT INTO library_catalog (catalog_number, num_copies,
VALUES (1000, 20, 3);
INSERT INTO library_catalog (catalog_number, num_copies,
VALUES (1001, 20, 3);
INSERT INTO library_catalog (catalog_number, num_copies,
10003);
10003);
10003);
num_out)
num_out)
num_out)
286
- PL/SQL.
UPDATE library_catalog
SET checked_out = v_StudentList1
WHERE catalog_number = 1000;
UPDATE library_catalog
SET checked_out = v_StudentList2
WHERE catalog_number = 1001;
UPDATE library_catalog
SET checked_out = v_StudentList3
WHERE catalog_number = 1002;
- , .
UPDATE library_catalog
SET checked_out = StudentList(10009)
WHERE catalog_nunber = 3002;
END;
DELETE
DELETE , , :
_| -- collectionDML.sql
DELETE FROM library_catalog
WHERE catalog_number = 3001;
SELECT
, , PL/SQL SELECT,
.
PrintRequired,
, , ,
SELECT
PL/SQL, :
| - PrintRequired.sql
CREATE OR REPLACE PROCEDURE PrintRequired(
p_Department IN classjnaterial.department%TYPE,
p_Course IN class_material.course%TYPE) IS
v_Books classjnaterial.required_reading%TYPE;
v_Title books.title%TYPE;
BEGIN
-- .
SELECT required_reading
287
INTO v_Books
FROM class_material
WHERE department = p_Department
AND course = p_Course;
DBMS_OUTPUT.PUTCRequired reading for ' || RTRIM(p_Department));
DBMS_OUTPUT.PUT_LINE(' ' || p_Course || ' : ' ) ;
- .
FOR v_Index IN 1. ,v_Books.COUNT LOOP
SELECT title
INTO v_Title
FROM books
WHERE catalog_number = v_Books(v_Index);
DBMS_OUTPUT.PUT_LINE(
' ' II v_Books(v_Index) || ' : ' || v_Title);
END LOOP;
END PrintRequired;
class_material . 8.1.
PrintRequired, :
Q - PrintRequired.sql
SOL> DECLARE
2 CURSOR c_Courses IS
3
SELECT department, course
4
FROM classjnaterial
5
ORDER BY department;
6 BEGIN
7
FOR v_Rec IN c_Courses LOOP
8
PrintRequired(v_Rec.department, v_Rec.course);
9
END LOOP;
10 END;
11 /
PL/SQL, 1
, .
COUNT.
Library. PrintCheckedOut, ,
:
288
Library.sql
CREATE OR REPLACE PACKAGE Library AS
- , .
PROCEDURE PrintCheckedOut(
p_CatalogNumber IN library_catalog.catalog_number%TYPE);
END Library;
FROM students
WHERE ID = v_StudentList(v_Index);
DBMS_OUTPUT.PUT_LINE(' ' || v_Student.first_name | | ' ' ||
v_Student.last_name);
END LOOP;
END IF;
IF NOT v_FoundOne THEN
DBMS_OUTPUT.PUT_LINEC None');
END IF;
END PrintCheckedOut;
END Library;
289
Library.PrintCheckedOut(1000);
3 END;
4 /
Students who have 1000: Oracle8i Advanced PL/SQL Programming checked out:
Scott Smith
Joanne Junebug
Manish Murgatroid
PL/SQL procedure successfully completed.
, , SQL,
PL/SQL, , ,
. ,
, 1. ,
. .
:
] nonsequential.sql
CREATE OR REPLACE TYPE DateTab AS
TABLE OF DATE;
/
CREATE TABLE famousjJates (
key
VARCHAR(IOO) PRIMARY KEY,
date_list
DateTab)
.NESTED TABLE date_list STORE AS dates_tab;
PL/SQL:
Q -- nonsequential.sql
DECLARE
- 5 .
v_Dates DateTab := DateTab(TO_DATE('04-JUL-1776',
TO_DATE('12-APR-1861',
TO_DATE('05-JUN-1968',
TO_DATE('26-JAN-1986',
TO_DATE('01-JAN-2001',
'DD-MON-YYYY'),
' DD-MON-YYYY'),
'DD-MON-YYYY1),
'DD-MON-YYYY'),
'DD-MON-YYYY'));
- DateTab
PROCEDURE Print(p_Dates IN DateTab) IS
v_Index BINARY_INTEGER := p_Dates.FIRST;
BEGIN
WHILE v_Index <= p_Dates.LAST LOOP
DBMS_OUTPUT.PUT(' ' || v_Index ': ');
DBMS_OUTPUT.PUT_LINE(TO_CHAR(p_Dates(v_Index),
290
'DD-MON-YYYY'));
-- 2 . ,
- 4 .
v_Dates.DELETE(2);
-
,
,
. :
Initial value of the table:
1: 04-JUL-1776
3: 05-JUN-1968
4: 26-JAN-1986
5: 01-JAN-2001 Table after INSERT and SELECT:
1: 04-JUL-1776
2: 05-JUN-1968
3: 26-JAN-1986
4: 01-JAN-2001
, .
, ,
PL/SQL SQL.
PL/SQL
Library Checkout Checkln, PL/SQL,
291
, library_catalog. PrintCheckedOut
, :
Q Library.sql
CREATE OR REPLACE PACKAGE Library AS
- p_CatalogNumber,
- p_StudentID.
PROCEDURE Checkout(
p_CatalogNumber IN library_catalog.catalog_number%TYPE,
p_StudentID IN NUMBER);
- p_CatalogNumber,
- p_StudentID.
PROCEDURE Checkln(
p_CatalogNumber IN library_catalog.catalog_number%TYPE,
p_StudentID IN NUMBER);
END Library;
CREATE OR REPLACE PACKAGE BODY Library AS
p_CatalogNumber,
p_StudentID.
PROCEDURE CheckOut(
p_CatalogNumber IN library_catalog.catalog_numberXTYPE,
p_StudentID IN NUMBER) IS
v_NumCopies library_catalog.num_copies%TYPE;
vJJumOut library_catalog.num_out%TYPE;
v_CheckedOut library_catalog.checked_out%TYPE;
BEGIN
- ,
- , .
BEGIN
SELECT num_copies, num_out, checked_out
INTO v_NumCopies, v_NumOut, v_CheckedOut
FROM library_catalog
WHERE catalog_number = p_CatalogNumber
FOR UPDATE;
EXCEPTION
WHEN NO_DATA_FOUND THEN
RAISE_APPLICATION_ERROR(-20000,
END;
IF v_NumCopies = v_NumOut THEN
RAISE_APPLICATION_ERROR(-20001,
END IF;
292
8
- , .
IF v_CheckedOut IS NOT NULL THEN
FOR v_Counter IN 1. ,v_CheckedOut.COUNT LOOP
IF v_CheckedOut(v_Counter) = p_StudentID THEN
RAISE_APPLICATION_ERROR(-20002,
'Student ' |l p_StudentID || ' already has book ' ||
p_CatalogNumber || ' checked out');
END IF;
END LOOP;
END IF;
- .
IF v_CheckedOut IS NULL THEN
v_CheckedOut := StudentList(NULL);
ELSE
v_CheckedOut.EXTEND;
END IF;
-- , .
v_CheckedOut(v_CheckedOut.COUNT) := p_StudentID;
- , 1 num_out.
UPDATE library_catalog
SET checked_out = v_CheckedOut,
num_out = num_out + 1
WHERE catalog_number = p_CatalogNumber;
END Checkout;
- p_CatalogNumber,
- p_StudentID.
PROCEDURE Checkln(
p_CatalogNunber IN library_catalog.catalog_numberXTYPE,
p_StudentID IN NUMBER) IS
v_NumCopies library_catalog. num_copies%TYPE;
v_NumOut library_catalog. rium_out%TYPE;
v_CheckedOut library_catalog. checked_out%TYPE;
v_AlreadyCheckedOut BOOLEAN := FALSE;
BEGIN
- , .
BEGIN
SELECT num_copies, num_out, checked_out
INTO v_NumCopies, v_NumOut, v_CheckedOut
FROM library_catalog
WHERE catalog_number = p_CatalogNumber
FOR UPDATE;
EXCEPTION
WHEN NO_DATA_FOUND THEN
RAISE_APPLICATION_ERROR(-20000,
'There is no book with catalog number ' ||
p_CatalogNumber 1 1 ' i n the library');
END;
293
- , .
IF v_CheckedOut IS NOT NULL THEN
FOR v_Counter IN 1. .v_CheckedOut.COUNT LOOP
IF v_CheckedOut(v_Counter) = p_StudentID THEN
v_AlreadyCheckedOut := TRUE;
- .
v_CheckedOut.DELETE(v_Counter);
END IF;
END LOOP;
END IF;
IF NOT v_AlreadyCheckedOut THEN
RAISE_APPLICATION_ERROR(-20003,
'Student ' 1 1 p_StudentID 1 1 ' does not have book ' 1 1
p_CatalogNumber | ' checked o u t ' ) ;
END IF;
- , 1 num_out.
UPDATE library_catalog
SET checked_out = v_CheckedOut,
num_out = num_out - 1
WHERE catalog_number = p_CatalogNumber;
END Checkln;
END Library;
9
10
11
12
13
14
15
16
17
18
19
20
21
- , HIS 101,
-- , HIS 101.
SELECT required_reading
INTO v_RequiredReading
FROM classjnaterial
WHERE department = 'HIS'
AND course = 101;
- History 101.
FOR v_Rec IN c_History101Students LOOP
- .
FOR v_Index IN 1.. v_RequiredReading.COUNT LOOP
294
-- !
22
Library.CheckOut(v_RequiredReading(v_Index), v_Rec.student_ID);
23
24
END LOOP;
25 END LOOP;
\
26
- , .
27
28 Library.PrintCheckedOut(2001);
29
- , .
30
Library. Checkln(2001, 10001);
31
32 Library.Checkln(2001, 10002);
33 Library.Checkln(2001, 10003);
34
- .
3b
36 Library.PrintCheckedOut(2001);
37 END;
38 /
Students who have 2001: A History of the World checked out:
Scott Smith
Margaret Mason
Joanne Junebug
Manish Murgatroid
Patrick Poll
Timothy Taller
Barbara Blues
David Dinsmore
Ester Elegant
Rose Riznit
Rita Razmataz
Students who have 2001: A History of the World checked out:
Scott Smith
Patrick Poll
Timothy Taller
Barbara Blues
David Dinsmore
Ester Elegant
Rose Riznit
Rita Razmataz
PL/SQL procedure successfully completed.
SQL- TABLE
I OracleS/
SQL TABLE.
PL/SQL, , .
SQL PL/SQL.
295
TABLE :
TABLE( )
, .
296
DBMS_OUTPUT.PUT_LINE(' None');
END IF;
END PrintCheckedOut;
COURSE
COLUMNJ/ALUE
MUS
MUS
100
100
102
102
102
101
3001
3002
1000
1001
1002
2001
cs
CG
CS
H IS
6 rows selected.
, .
. :
__.__
__ ( ), __
(. ).
, SQL-.
, , ,
:
Q tables, sql
CREATE OR REPLACE TYPE NumTab AS TABLE OF NUMBER;
CREATE OR REPLACE TYPE NumVar AS VARRAY(25) OF NUMBER;
CREATE OR REPLACE PACKAGE IndexBy AS
TYPE NumTab IS TABLE OF NUMBER INDEX BY BINARY_INTEGER;
END IndexBy;
297
IndexBy NumTab
PL/SQL IndexBy. NumTab.
9 10.
8.3.
8.3.
EXISTS
BOOLEAN
,
,
COUNT
NUMBER
LIMIT
NUMBER
FIRST
LAST
BINARY,
INTEGER
NEXT
PRIOR
BINARY.
INTEGER
EXTEND
TRIM
DELETE
TRUE,
()
,
,
,
(
NULL),
,
,
,
,
,
(
)
,
,
EXISTS
EXISTS ,
, .
:
EXISTS(n)
. , , , TRUE ( NULL).
, EXISTS SUBCRIPT_OUTSIDE_LIMIT (
) ORA-1403 (
298
30
v_IndexByTable(v_Count));
31
v_Count := v_Count + 1;
32
ELSE
33
EXIT;
34
END IF;
35 END LOOP;
36 END;
37 /
v_NestedTable(1): -7
v_NestedTable(2): 14.3
v_NestedTable(3): 3.14159
v_NestedTable(4):
v_NestedTable(5): 0
v_IndexByTable(1): -7
v_IndexByTable(2): 14.3
299
v_IndexByTable(3): 3.14159
v_IndexByTable(4):
v_IndexByTable(5): 0
PL/SOL procedure successfully completed.
, n- NULL, EXISTS(n) TRUE. EXISTS ,
NULL- ; FALSE.
COUNT
COUNT . COUNT
, .
SQL*Plus:
Q
count.sql
SOL> DECLARE
2
3
4
5
6
7
8
9
10
11
12
- .
- : .
v_IndexByTable(1) := 1;
v_IndexByTable(8) := 8;
v_IndexByTable(-1) := -1;
v_IndexByTable(100) := 100;
13
14
15
- .
DBMS_OUTPUT.PUT_LINE(
'Nested Table Count: ' 1 1 v_NestedTable.COUNT);
16
DBMS_OuTPUT.PUT_LINE(
17
18
19
'Index-By Table Count: ' 1 1 v_IndexByTable.COUNT);
20 END;
21 /
Nested Table Count: 3
Varray Count: 4
Index-By Table Count: 4
PL/SQL procedure successfully completed.
COUNT LAST
(. ), .
,
COUNT LAST -. COUNT ,
. COUNT .
300
LIMIT
LIMIT . , LIMIT
NULL. LIMIT . LIMIT
SQL*Plus:
) - limit.sql
SQL> DECLARE
2
v_Table NumTab :=NumTab(1, 2, 3);
3
v_Varray NumVar := NumVar(1234, 4321);
4 BEGIN
5
6
7
8
9
10
11
12
13
-
- .
DBMS_OUTPUT.PUT_LINECVarray limit: ' 1 1 v.Varray.LIMIT);
DBMS_OUTPUT.PUT_LINE('Varray count: ' || v_Varray.COUNT);
IF v_Table. LIMIT IS NULL THEN
DBMS_OUTPUT.PUT_LINE('Table limit is NULL');
ELSE
DBMS_OUTPUT.PUT_LINECTable limit: ' | | v_Table. LIMIT);
END IF;
14
DBMS_OUTPUT.PUT_LINE('Table count: ' || v_Table.COUNT);
15 END;
16 /
Varray limit: 25
Varray count: 2
Table limit is NULL
Table count: 3
PL/SQL procedure successfully completed.
: 25 , CREATE TYPE,
v_Varray . COUNT
(. ).
FIRST LAST
FIRST ,
LAST . FIRST
1, a LAST COUNT,
. FIRST LAST NEXT PRIOR
.
NEXT PRIOR
NEXT PRIOR
. :
301
NEXT(n)
PRIOR(n)
. NEXT(n) ,
, a PRIOR(n) , .
, PRIOR NEXT NULL. SOJL*Plus , NEXT PRIOR
FIRST LAST
:
)
collectionLoops.sql
SQL> DECLARE
2
TYPE CharTabIS TABLE OF CHARd);
3
v_Characters CharTab :=
4
CharTab('M', ' a ' , ' d ' , ' a ' , ' m ' , ' , ' , ' ',
5
6
'I', ' ' ' , ' m ' , ' ', ' A ' , ' d ' , ' a ' , 'm');
7 v_Index INTEGER;
8 BEGIN
9
- .
10 v_Index := v_Characters.FIRST;
11 WHILE v_Index <= v.Characters. LAST LOOP
12
DBMS_OUTPUT.PUT(v_Characters(v_Index));
13
v_Index := v_Characters.NEXT(v_Index);
14 END LOOP;
15 DBMS_OUTPUT.NEW_LINE;
16
17 - .
18 v_Index := v_Characters. LAST;
19 WHILE v_Index >= v_Characters. FIRST LOOP
20
DBMS_OUTPUT.PUT(v_Characters(v_Index));
21
v_Index := v_Characters.PRIOR(v_Index);
22 END LOOP;
23
DBMS_OUTPUT.NEW_LINE;
24 END;
25 /
Madam, I'm Adam
madA m'l ,madaM
PL/SQL procedure successfully completed.
EXTEND
EXTEND
. EXTEND :
EXTEND
EXTEND(w)
302
EXTEND(rM)
EXTEND NULL
LAST + I. EXTEND () NULL, a EXTEND(n,z) .
NOT NULL, ,
NULL- .
, EXTEND ( 2 ). ,
,
LIMITCOUNT. EXTEND
SQL*Plus:
Q extend.sql
SQL> DECLARE
2
v_NumbersTab NumTab := NumTabd, 2, 3, 4, 5);
3
v_NumbersList NumVar := NumVar(1, 2, 3, 4, 5);
4 BEGIN
5
BEGIN
6
--
7
- SUBSCRIPT_BEYOND_COUNT, v_NumbersTab
8
-- 5 .
9
v_NumbersTab(26) := -7;
10
EXCEPTION
11
WHEN SUBSCRIPT_BEYOND_COUNT THEN
12
DBMSJDUTPUT. PUT_LINE(
13
'ORA-6533 raised for assignment to v_NumbersTab(26)');
14 END:
15
16
- , 30
17 -- v_NumbersTab.
18 v_NumbersTab.EXTEND(30);
19
20
- .
21 v_NumbersTab(26) := -7;
22
23
-
24
- ( LIMIT). ,
25
- SUBSCRIPT_OUTSIDE_LIMIT:
26
BEGIN
27
v_NumbersList.EXTEND(30);
28
EXCEPTION
29
WHEN SUBSCRIPT_OUTSIDE_LIMIT THEN
30
DBMS_OUTPUT.PUT_LINE(
31
32
33
34
303
- .
35 v_NumbersList.EXTEND(20);
36
37
- .
38 v_NumbersList(25) := 25;
39 END;
40 /
ORA-6533 raised for assignment to v_NumbersTab(26)
ORA-6532 raised for v_NumbersList.EXTEND(30)
PL/SQL procedure successfully completed.
EXTEND , (
). ( DELETE, ) , .
EXTEND DELETE :
) -- extendDelete.sql
DECLARE
- 5 .
v_Nuinbers NumTab := NumTab(-2, -1, 0, 1, 2);
- .
- FIRST, LAST NEXT.
PROCEDURE Print(p_Table IN NumTab) IS
v_Index INTEGER;
BEGIN
v_Index := p_Table.FIRST;
WHILE v_Index <= p_Table.LAST LOOP
DBMS_OUTPUT.PUTCElement ' || v_Index || ': ');
DBMSJ)UTPUT.PUT_LINE(p_Table(v_Index));
v_Index := p_Table.NEXT(v_Index);
END LOOP;
END Print;
BEGIN
DBMS_OUTPUT.PUT_LINE('At initialization, v_Numbers contains');
Print(v_Numbers);
- 3. '0', .
v_Numbers.DELETE(3);
DBMS_OUTPUT.PUT_LINEC After delete, v_Numbers contains');
Print(v_Numbers);
- 2 1. 6 7.
v_Numbers.EXTEND(2, 1);
DBMS_OUTPUT.PUT_LINE('After extend, v_Numbers contains');
Print(v_Numbers);
DBMS_OUTPUT.PUT_LINE('v_Numbers.COUNT = ' || v_Numbers.COUNT);
DBMS_OUTPUT.PUT_LINE('v_Numbers.LAST = ' || v_Numbers. LAST);
END;
304
TRIM
TRIM . :
TRIM ,
TRIM(n)
TRIM . . COUNT,
SUBSCRIPT_BEYOND_COUNT.
TRIM COUNT , TRIM
.
EXTEND, TRIM
, .. , DELETE.
:
Q trim.sql
DECLARE
- 7 .
v_Numbers NumTab := NumTab(-3, -2, -1, 0, 1, 2, 3);
- .
PROCEDURE Print(p_Table IN NumTab) IS
v_Index INTEGER;
BEGIN
v_Index := p_Jable. FIRST;
WHILE v_Index <= p_Table.LAST LOOP
DBMS_OUTPUT.PUT('Element ' || v_Index || ': ');
DBMS_OUTPUT.PUT_LINE(p_Table(v_Index));
v_Index := p_Table. NEXT(v_Index);
END LOOP;
DBMS_OUTPUT.PUT_LINECCOUNT = ' || p_Table.COUNT);
DBMS_OUTPUT.PUT_LINECLAST= ' || p_Table.LAST);
END Print;
BEGIN
- 3 . 2 3,
- ( ) 1.
v_Numbers.TRIM(3);
DBMS_OUTPUT.PUT_LINE('After trim, v_Numbers contains');
Print(v_Numbers);
END;
:
At initialization, v_Numbers contains
Element 1: -3
Element 2: -2
Element 3: -1
Element 4: 0
Element 5: 1
Element 6: 2
- Element 7: 3
COUNT = 7
LAST = 7
After delete, v_Numbers contains
Element 1: -3
Element 2: -2
Element 3: -1
Element 4: 0
Element 5: 1
Element 7: 3
COUNT = 6
LAST = 7
After trim, v_Numbers contains
Element 1: -3
Element 2: -2
Element 3: -1
Element 4: 0
COUNT = 4
LAST = 4
305
306
DELETE
DELETE 1 . DELETE , (, DELETE
). DELETE :
DELETE
DELETE(n)
DELETE(m,n)
DELETE . DELETE(w) , , a DELETE(wj,w) , . DELETE
COUNT , .
, DELETE , .
DELETE :
r_J
delete.sql
DECLARE
- 10 .
v_Numbers NumTab := NumTab(10, 20, 30, 40, 50, 60, 70, 80, 90, 100);
- .
PROCEDURE Print(p_Table IN NumTab) IS
v_Index INTEGER;
BEGIN
v_Index := p_Table.FIRST;
WHILE v_Index <= p_Table.L-AST LOOP
DBMSJXJTPUT. PUTCElement ' || v_Index || ' : ' ) ;
DBMS_OUTPUT.PUT_LINE(p_Table(v_Index));
v_Index := p_Table.NEXT(v_Index);
END LOOP;
DBMS_OUTPUT.PUT_LINE('COUNT = ' || p_Table.COUNT);
DBMS_OUTPUT.PUT_LINE('LAST = ' || p_Table.LAST);
END Print;
BEGIN
DBMS_OUTPUT.PUT_LINE('At initialization, v_Numbers contains');
Print(v_Numbers);
- 6.
DBMS_OUTPUT.PUT_LINECAfter delete(6), v_Numbers contains');
v_Numbers.DELETE(6);
Print(v_Numbers);
- 7 9.
DBMS_OUTPUT.PUT_LINE('After delete(7,9), v_Numbers contains');
v_Numbers.DELETE(7,9);
Print(v_Numbers);
END;
307
:
Q| At initialization, v_Numbers contains
Element 1: 10
Element 2: 20
Element 3: 30
Element 4: 40
Element 5: 50
Element 6: 60
Element 7: 70
Element 8: 80
Element 9: 90
Element 10: 100
COUNT = 10
LAST = 10
After delete (6), v_Numbers contains
Element 1: 10
Element 2: 20
Element 3: 30
Element 4: 40
Element 5: 50
Element 7: 70
Element 8: 80
Element 9: 90
Element 10: 100
COUNT = 9
LAST = 10
After delete (7,9), v_Numbers contains
Element 1: 10
Element 2: 20
Element 3: 30
Element 4: 40
Element 5: 50
Element 10: 100
COUNT = 6
LAST = 10
.
, . , ,
. ,
.
III
PL/SOL
9
,
312
PL/SQL ,
, . (subprogram).
:
] AddNewStudent.sql
CREATE OR REPLACE PROCEDURE AddNewStudent (
p_FirstName students.first_name%TYPE,
p_LastName students.last_name%TYPE,
p_Major
students.major%TYPE) AS
BEGIN
- students.
- studejit_sequence
- 0
-- current_credits,
INSERT INTO students (ID, first_name, last_name,
major, current_credits)
VALUES (student_sequence.nextval, p_FirstName, p_LastName,
p_Major, 0);
END AddNewStudent;
PL/SQL:
r_j
AddNewStudent.sql
BEGIN
AddNewStudent('Zelda', 'Zudnik', 'Computer Science');
END;
313
AddNewStudent CREATE
OR REPLACE PROCEDURE.
, . PL/SQL.
(. 10).
.
, . p_FirstName 'Zelda', p_l_astName ' Z u d n i k ' , a p_Major 'Computer Science',
.
PL/SQL; .
.
, , . PL/SQL
, ( 3GL).
(. ).
PL/SQL, ,
. ,
. , AddNewStudent
.
, CREATE ( CREATE PROCEDURE, - CREATE FUNCTION).
CREATE [OR REPLACE] PROCEDURE :
CREATE [OR REPLACE] PROCEDURE _,
[ ( [{IN [ OUT |IN OUT}] ,
[{1 \ OUT |INOUT}] )] {IS | AS}
_
_ , , , _ PL/SQL, .
;
, .
314
DECLARE .
IS AS. PL/SQL
Ada.
, :
CREATE OR REPLACE PROCEDURE _
[_] AS
/* */
BEGIN
/* */
EXCEPTION
/* */
END [_];
END. END ,
.
315
, END,
CREATE,
BEGIN-END
.
. , ( ).
PL/SQL, , . ,
( ,
, 10). PL/SQL, . ,
TRUE, 80%, FALSE
.
)
AlraostFull.sql
CREATE OR REPLACE FUNCTION AlmostFull (
p_Department
classes. department%TYPE,
p_Course
classes.course%TYPE)
RETURN BOOLEAN IS
v_CurrentStudents NUMBER;
NUMBER;
v_MaxStudents
BOOLEAN;
v_ReturnValue
CONSTANT NUMBER := 80;
v_FullPercent
BEGIN
- .
SELECT current_students, max_students
INTO v_CurrentStudents, v_MaxStudents
FROM classes
WHERE department = p_Department
AND course = p_Course;
- ,
- v_FullPercent, TRUE.
- FALSE.
END IF;
RETURN v_ReturnValue;
END AlmostFull;
316
AlmostFull . PL/SQL, .
, IF, .
} - callFunction.sql
SQL> DECLARE
2
CURSOR c_Classes IS
3
SELECT department, course
4
FROM classes;
5 BEGIN
8
9
10
11
-- .
IF AlmostFull(v_ClassRecord.department,
v_ClassRecord.course) THEN
DBMS_OUTPUT.PUT_LINE(
12
v_ClassRecord.department 1 1
||
13
v_ClassRecord.course 1 1 ' is almost full!');
14
END IF;
15
END LOOP;
16 END;
17 /
DBMS_OUTPUT.PUT_LINE
SQL*Plus ,
set serveroutput on (. 2).
,
, :
CREATE [OR REPLACE] FUNCTION _,
[( [{IN | OUT |IN OUT}] ,
[{1 \ OUT |INOUT}] )]
RETURN _ {IS | AS}
_
_ , , , _
, , _ PL/SQL,
. , . , END.
, .
,
. , ,
3t7
. ,
.
, /8\
NOCOPYn AUTHID.
RETURN RETURN
. RETURN:
RETURN ;
. , RETURN ,
, , .
RETURN .
RETURN, . RETURN
. RETURN. RETURN, , ,
p_Department p_Course.
-- Classlnfo.sql
CREATE OR REPLACE FUNCTION Classlnfo (
/* 'Full', ,
Some Room', 80%,
More Room', 60%,
Lots of Room', 60%,
Empty', . */
p_Department classes.department%TYPE,
p_Course classes.course%TYPE)
RETURN VARCHAR2 IS
v_CurrentStudents NUMBER;
v_MaxStudents NUMBER;
v_PercentFull NUMBER;
BEGIN
- .
SELECT current_students, max_students
INTO v_CurrentStudents, v_MaxStudents
FROM classes
WHERE department = p_Department
AND course = p_Course;
- .
v_PercentFull := v_CurrentStudents / v_MaxStudents * 100;
318
RETURN 'Empty';
END IF;
END Classlnfo;
RETURN
. RETURN
. ,
, . , OUT IN OUT,
, , (. ).
, . .
:
DROP PROCEDURE _;
:
DROP FUNCTION _;
_ , _
. ,
AddNewStudent:
DROP PROCEDURE AddNewStudent;
, DROP FUNCTION, - , DROP PROCEDURE.
DROP DDL, DROP
COMMIT. , DROP "ORA-4043: Object does not exist".
, .
, .
319
AddNewStudent
PL/SQL:
Q callANS.sql
DECLARE
- , .
v_NewFirstName students. first_name%TYPE := 'Cynthia';
v_NewLastName students. last_name%TYPE := 'Camino';
v_NewMajor students.major%TYPE := 'History';
BEGIN
- Cynthia Camino .
AddNewStudent(v_NewFirstName, v_NewLastName, v_NewMajor);
END;
v_NewFirstName, v_NewLastName, v_NewMajor AddNewStudent . (actual parameter), ,
(p_FirstName, p_LastName, p_Major),
(formal parameter). , ,
, (
). . .
.
.
,
. , PL/SQL , .
: IN (), OUT () IN
OUT ( OracleSi NOCOPY). , IN. 9.1. :
>
Mode Jest
PL/SQL
,
.
Q -- ModeTest.sql
CREATE OR REPLACE PROCEDURE ModeTest (
p_InParameter
IN NUMBER,
p_OutParameter
OUT NUMBER,
p_InOutParameter IN OUT NUMBER) IS
v_LocalVariable NUMBER:=0;
320
BEGIN
DBMS_OUTPUT.PUT_LINECInside ModeTest:');
IF (p_InParameter IS NULL) THEN
DBMS_OUTPUT.PUT('p_InParanieter is NULL');
ELSE
DBMS_OUTPUT.PUT('p_InParameter = ' || p_InParameter);
END IF;
IF (p_OutParameter IS NULL) THEN
DBMS_OUTPUT.PUTC p_OutParameter is NULL');
ELSE
DBMS_OUTPUT,PUT(' pJMParameter = ' || p_OutParameter);
END IF;
IF (p_InOutParameter IS NULL) THEN
DBMS_OUTPUT.PUT_LINE(' p_InOutParameter is NULL');
ELSE
DBMS_OUTPUT.PUT_LINEC p_InOutParameter= ' ||
p_InOutParameter);
END IF;
/* p__InParameter v_Loca!Variable.
, IN
. */
v_LocalVariable := p_InParameter; -- .
/* 7 p_InParameter. ,
IN. */
- p_InParameter := 7; .
/* 7 p_OutParameter. ,
OUT. */
p_OutParameter := 7; - .
/* pJJutParameter v_LocalVariable. !7
7.3.4 OracleS 8.0.4 ( 81)
. Oracle, 7.3.4,
, OUT.*/
v_LocalVariable := p_OutParameter; -- , .
/* p_InOutParameter v_LocalVariable.
, IN OUT. */
v_LocalVariable := p_InOutParameter; -- .
/* 8 p_InOutParameter. ,
IN OUT. */
p_InOutParameter := 8; .
DBMS_OUTPUT.PUT_LINE('At end of ModeTest:');
IF (p_InParameter IS NULL) THEN
DBMS_OUTPUT.PUTCp_InParameter is NULL');
ELSE
DBMS_OUTPUT.PUT('p_InParameter = ' || p_InParameter);
321
END IF;
IN
.
PL/SQL, .. , .
, .
OUT
, ,
.
PL/SQL, ..
NULL- , ,
.
,
( OracleS/
NOCOPY; . "
").
IN OUT
IN OUT.
.
, ,
.
,
( 18/ NOCOPY,
OUT).
322
ModeTest :
- callMT.sql
DECLARE
v_In NUMBER := 1;
v_0ut NUMBER := 2;
v_InOut NUMBER := 3;
BEGIN
DBMS_OUTPUT.PUT_LINECBefore calling ModeTest:');
DBMS_OUTPUT.PUT_LINE('v_In = ' || v_In ||
' v_0ut = ' | I v_0ut 1 1
' v_InOut = ' | I v_InOut);
ModeTest(v_In, v_0ut, v_InOut);
f
:
Before calling ModeTest:
v_In = 1 v_0ut = 2 v_InOut = 3
Inside ModeTest:
p_InParameter = 1 p_0utParameter is NULL p_InOutParameter = 3
At end of ModeTest:
p_InParameter = 1 p_0utParameter = 7 p_InOutParameter = 8
After calling ModeTest:
v_In = 1 v_0ut = 7 v_InOut = 8
, OUT NULL- . , IN
IN OUT .
, IN OUT OUT
( Oracle8\ NOCOPY).
. " ,
".
, , IN OUT OUT,
.
. , ModeTest v_In :
323
| callMT.sql
DECLARE
v_0ut NUMBER := 2;
v_InOut NUMBER := 3;
BEGIN
ModeTest(1, v_0ut, v_InOut);
END;
v_0ut , :
Q ~ callMT. sql
SOL> DECLARE
2
v_InOut NUMBER := 3;
3 BEGIN
ModeTestO, 2, v_InOut);
5 END;
6 /
DECLARE
*
ERROR at line 1:
ORA-06550: line 4, column 15:
PLS-00363: expression '2' cannot be used as an assignment target
ORA-06550: line 4, column 3:
PL/SQL: Statement ignored
PL/SQL . ,
p_InParameter ModeTest, :
Q PLS-363: expression 'P_INPARAMETER' cannot be used as an assignment target
( 'P_INPARAMETER'
)
OUT 7.3.4 8.0.3 OUT . , , ModeTest 8.0.3,
:
) PLS-00365: 'P_OUTPARAMETER' is an OUT parameter and cannot be read
('P_OUTPARAMETER' OUT )
9.2. OUT
Oracle
7.3.4
7.3.4
8.0.3
8.0.4
OUT
324
,
. ,
, ,
.
CHAR VARCHAR2, /
NUMBER, . , :
Q -- ParameterLength.sql
CREATE OR REPLACE PROCEDURE Parameter-Length (
p_Parameter1 IN OUT VARCHAR2(10),
p_Parameter2 IN OUT NUMBER(3,1)) AS
BEGIN
p_Pa ramete r1 := 'abcdefghijklm';
p_Parameter2 := 12.3;
END ParameterLength;
:
Q ParameterLength.sql
CREATE OR REPLACE PROCEDURE ParameterLength (
p_Parameter1 IN OUT VARCHAR2,
p_Parameter2 IN OUT NUMBER) AS
BEGIN
p_Parameter1 := 'abcdefghijklmno';
p_Parameter2 := 12.3;
END ParameterLength;
, , p_Parameter1 p_Parameter2,
. P a r a m e t e r Length :
Q ParameterLength.sql
DECLARE
v_Variable1 VARCHAR2(40);
v_Variable2 NUMBER(7,3);
BEGIN
ParameterLength(v_Variablel, v_Variable2);
END;
325
-- ParameterLength.sql
DECLARE
v_Variable1 VARCHAR2(10);
v_Variable2 NUMBER(7,3);
BEGIN
ParameterLength(v_Variable1, v_Variable2);
END;
, v_Variable1 , , p_Parameter1 10, 40.
ParameterLength p_Parameter1 ( v_Variable1) , 15 ,
. Oracle :
Q
DECLARE
*
ERROR at line 1:
ORA-06502: PL/SQL: numeric or value error: character string buffer too small
ORA-06512: at "DEMO.PARAMETERLENGTH", line 5
ORA-06512: at line 5
, , . ORA-6502 , . , ,
, , PL/SQL
' a b c d e f g h i j k l m n o ' .
, ORA-6502,
,
,
, ,
.
%TYPE.
% TYPE
%TYPE. %TYPE, a
, , . ParameterLength :
ParameterLength.sql
CREATE OR REPLACE PROCEDURE ParameterLength (
p_Parameter1 IN OUT VARCHAR2,
p_Parameter2 IN OUT students. current_creditsXTYPE) AS
BEGIN
p_Parameter2 := 12345;
326
END ParameterLength;
p_Parameter2 3,
current_credits. Parameter-Length , . ,
ORA-6502:
Q
ParameterLength.sql
SQL> DECLARE
2 v_Variable1 VARCHAR2(1);
3
- v_Variable2 .
4
v_Variable2 NUMBER;
5 BEGIN
6
- 12345,
7
- , ,
8
- ORA-6502.
9 ParameterLength(v_Variable1, v_Variable2);
10 END;
11 /
DECLARE
,
ERROR at line 1:
ORA-06502: PL/SQL: numeric or value error: number precision too large
ORA-06512: at "EXAMPLE.PARAMETERLENGTH", line 5
ORA-06512; at line 9
ORA-6502 Oracle3\.
OracleSi "ORA-6502:
PL/SQL numeric or value error"
. ,
, OracleSi.
,
,
. , ,
(. 7).
OUT IN OUT
. , ,
. , :
Q RaiseError.sql
/*
OUT. p_Raise ,
.
327
p_Raise , . */
CREATE OR REPLACE PROCEDURE RaiseError (
p_Raise IN BOOLEAN,
p_ParameterA OUT NUMBER) AS
BEGIN
p_ParameterA := 7;
IF p_Raise THEN
/* p_ParameterA 7,
;
7 ,
p_ParameterA. */
RAISE DUP_VAL_ON_INDEX;
ELSE
- . '
- 7.
RETURN;
END IF;
END RaiseError;
RaiseError :
| -- RaiseError.sql
DECLARE
v_TempVar NUMBER := 1;
BEGIN
DBMS_OUTPUT.PUT_LINE('Initial value: ' || vJempVar);
RaiseError(FALSE, v_TempVar);
DBMSJHJTPUT. PUT_LINECValue after successful call: ' 1 1
v_TempVar);
v_TempVar := 2;
DBMS_OUTPUT.PUT_LINECValue before 2nd call: ' 1 1 v_TempVar);
RaiseError(TRUE, v_TempVar);
EXCEPTION
328
,
OUT IN OUT
NOCOPY (. "
NOCOPY").
: . (by reference),
. (by value),
.
, ;
( ; . 8). PL/SQL IN , IN
OUT OUT . , (. )
, . OracleSt .
NOCOPY OracleSz
NOCOPY. :
_ [] NOCOPY _
_ , (IN, OUT
IN OUT), . NOCOPY, PL/SQL , . NOCOPY , ,
(. ). :
- NoCopyTest.sql
CREATE OR REPLACE PROCEDURE NoCopyTest (
p_InParameter
IN NUMBER,
p_0utParameter
OUT NOCOPY VARCHAR2,
p_InOutParameter
IN OUT NOCOPY CHAR) IS
BEGIN
NULL;
END NoCopyTest;
NOCOPY IN , IN NOCOPY
.
NOCOPY
, ,
,
. ,
329
. RaiseError, NOCOPY:
Q - NoCopyTest.sql
CREATE OR REPLACE PROCEDURE RaiseError (
p_Raise IN BOOLEAN,
p_ParameterA OUT NOCOPY NUMBER) AS
BEGIN
p_ParameterA := 7;
IF p_Raise THEN
RAISE DUP_VAL_ON_INDEX;
ELSE
RETURN;
END IF;
END RaiseError;
, p_ParameterA
, . , R a i s e E r r o r
:
rj NoCopyTest.sql
DECLARE
vJempVar NUMBER := 1;
BEGIN
DBMS_OUTPUT.PUT_LINE('Initial value: ' || vJempVar);
RaiseError(FALSE, vJTempVar);
DBMS_OUTPUT.PUT_LINECValue after successful call: ' ||
v_TempVar);
v_TempVar := 2;
, .
NOCOPY NOCOPY .
330
. , NOCOPY , . NOCOPY :
.
, .
, NOT NULL. , .
, PL/SQL
, ..
.
, ,
NOCOPY.
, , ,
, %ROWTYPE, .
.
(RFC, remote procedure call), .. . ,
.
RPC, NOCOPY
.
, RPC,
.
NOCOPY NOCOPY ,
.
PL/SQL, :
CopyFast.sql
CREATE OR REPLACE PACKAGE CopyFast AS
- PL/SQL- .
TYPE StudentArray IS
TABLE OF students%ROWTYPE;
- , StudentArray .
- .
PROCEDURE PassStudents1(p_Parameter IN StudentArray);
PROCEDURE PassStudents2(p_Parameter IN OUT StudentArray);
PROCEDURE PassStudentsS (p_Parameter IN OUT NOCOPY StudentArray);
,
- .
PROCEDURE Go;
END CopyFast;
CREATE OR REPLACE PACKAGE BODY CopyFast AS
PROCEDURE PassStudents1(p_Parameter IN StudentArray) IS
BEGIN
NULL;
END PassStudentsI;
PROCEDURE PassStudents2(p_Parameter IN OUT StudentArray) IS
BEGIN
NULL;
END PassStudents2;
PROCEDURE PassStudents3(p_Parameter IN OUT NOCOPY StudentArray) IS
BEGIN
NULL;
END PassStudentsS;
PROCEDURE Go IS
331
332
END Go;
END CopyFast;
'
.
"", EXTEND
8, a DBMSJJTILITY .
SQL> BEGIN
2
CopyFast.Go;
3 END;
4 /
Time to pass IN: 0
Time to pass IN OUT: 4 . 2 8
Time to pass IN OUT NOCOPY: 0
PL/SQL procedure successfully completed.
,
IN OUT , IN IN OUT NOCOPY .
,
, . . :
[_|
- noparams.sql
CREATE OR REPLACE PROCEDURE NoParamsP AS
BEGIN
DBMS_OUTPUT.PUT_LINE('No P a r a m e t e r s ! ' ) ;
END NoParamsP;
CREATE OR REPLACE FUNCTION NoParamsF
RETURN DATE AS
BEGIN
RETURN SYSDATE;
END NoParamsF;
BEGIN
NoParamsP;
333
CALL, Oracle8\,
.
.
) -- CallMe.sql
CREATE OR REPLACE PROCEDURE CallMe (
p_ParameterA VARCHAR2,
p_ParameterB NUMBER,
p_ParameterC BOOLEAN,
p_ParameterD DATE) AS
BEGIN
NULL;
END CallMe;
Q - CallMe.sql
DECLARE
v_Variable1 VARCHAR2(10);
v._Variable2 NUMBER(7,6);
v_Variable3 BOOLEAN;
v_Variable4 DATE;
BEGIN
CallMe(v_Variable1, v_Variable2, v_Variable3, v_Variable4);
END;
,
: v_Variable1 p_ParameterA, v_Variable2 p_ParameterB ..
(positional notation). , , .
(named notation):
Q CallMe.sql
DECLARE
v_Variable1 VARCHAR2(10);
v_Variable2 NUMBER(7,6);
v_Variables BOOLEAN;
v._Vanable4 DATE;
BEGIN
CallMe(p_ParanteterA => v_Variable1,
p_ParameterB => v_Variable2,
334
END;
, .
. , CallMe :
Q CallMe.sql
DECLARE
v_Variable1 VARCHAR2(10);
v_Variable2 NUMBER(7,6);
v_Variable3 BOOLEAN;
v_Variable4 DATE;
BEGIN
CallMe(p_ParameterB => v_Variable2,
p_ParameterC => v_Variable3,
p_ParameterD => v_Variable4,
p_ParameterA => v_Variable1);
END;
, . , .
:
Q CallHe.sql
DECLARE
v_Variable1 VARCHAR2(10);
v_Variable2 NUMBER(7,6);
v_Variables BOOLEAN;
v_Variable4 DATE;
BEGIN
- 2 , 2 - .
CallMe(v_Variable1, v_Variable2,
p_ParameterC => v_Variable3,
p_ParameterD => v_Variable4);
END;
PL/SQL, Ada.
, ? , ,
.
, 9.3.
, , ,
.
( ), ,
,
335
. , (. ).
,
.
,
, .
,
(, , PL/SQL,
). PL/SQL
.
9.3.
,
,
.
,
,
,
;
.
, ;
.
, .
, ,
.
,
,
.
,
.
,
.
, . , .
:
_ [] _
{:= | DEFAULT} _
336
_ ,
(IN, OUT IN OUT), _ ( , ), _ , .
:= DEFAULT. AddNewStudent, "" (
):
Q default.sql
CREATE OR REPLACE PROCEDURE AddNewStudent (
p_FirstName students.first_name%TYPE,
p_LastName students.last_name%TYPE,
p_Major
students.major%TYPE DEFAULT 'Economics') AS
BEGIN
- students.
- student_sequence ,
- , 0
-- current_credits.
INSERT INTO students VALUES (student_sequence.nextval,
p_FirstName, p_LastName, p_Major, 0);
END AddNewStudent;
p_Major
, .
:
] default.sql
BEGIN
AddNewStudent('Simon', 'Salovitz');
END;
:
rj ..- default.sql
BEGIN
AddNewStudent(p_FirstName => 'Veronica',
p_LastName => 'Vassily');
END;
,
,
, .
:
| - DefaultTest. sql
CREATE OR REPLACE PROCEDURE DefaultTest (
p_ParameterA NUMBER DEFAULT 10,
p_ParameterB VARCHAR2 DEFAULT 'abcdef ,
p_ParameterC DATE DEFAULT SYSDATE) AS
BEGIN
DBMS_OUTPUT.PUT_LINE(
337
DefaultTest , .
p_ParameterB, p_ParameterA p_ParameterC
, :
| DefaultTest.sql
SQL> BEGIN
2
DefaultTest(p_ParameterA => 7, p_ParameterC => '30-DEC-95');
3 END;
4 /
A: 7 B: abcdef C: 30-DEC-1995
PL/SQL procedure succefully completed.
p_ParameterB ,
p_ParameterC .
, ,
. :
) -- DefaultTest.sql
SQL> BEGIN
-
- p_ParameterB, p_ParameterC.
4
DefaultTest(7);
5 END;
6 /
: 7 : abcdef : 17--1999
PL/SQL procedure succefully completed.
,
.
, .
CALL
OracleS t SQL : CALL. PL/SQL Java PL/SQL :
CALL _([1_^]) [INTO _\\
_
,
338
. _ , _
. SQL*Plus CALL:
- calls.sql
SQL> CREATE OR REPLACE PROCEDURE CallProd (p1 IN VARCHAR2 := NULL) AS
2
3
4
BEGIN
DBMS_OUTPUT.PUT_LINE('CallProc1 called with ' || p1);
END CallProd;
5 /
Procedure created.
SQL>
2
3
4
5
6 /
Procedure created.
SQL>
2
3
4
5
6 END CallFunc;
7 /
Function created
SQL> - SQL
SQL> CALL CallProd('Hello!');
CallProd called with Hello!
Call completed.
SQL> CALL CallProcK);
CallProd called with
Call completed.
SQL> VARIABLE v_0utput VARCHAR2(50);
SQL> CALL CallFuncCHello!') INTO :v_0utput;
CallFunc called with Hello!
Call completed.
SQL> PRINT v_0utput
V_OUTPUT
Hello!
SQL> CALL CallProc2(:v_Output);
CallProc2 called with Hello!
Call completed.
339
CALL CallProcK):
ERROR at line 2
ORA-06550: line 2, column 8:
PLS-00103: Encountered the symbol "CALLPROC1" when expecting one of the
following:
The symbol "-:=" was substituted for "CALLPROC1" to continue.
SQL> --
SQL> DECLARE
2
v_Result VARCHAR2(50);
3 BEGIN
4
EXECUTE IMMEDIATE 'CALL CallProcK "Hello from PL/SQL")';
5
EXECUTE IMMEDIATE
6
'Call CallFuncC 'Hello from PL/SQL'') INTO :v_Result'
7
USING OUT v_Result;
8 END;
9/
CallFunc called with Hello from PL/SQL
CallProc called with Hello from PL/SQL
PL/SQL procedure sucessfully completed.
, :
CALL SQL.
PL/SQL, SQL (. 12). ( PL/SQL PL/SQL.)
, (
).
INTO . IN OUT OUT
.
340
:
, OUT.
,
.
.
.
NOCOPY ( OracleS ).
, ?
,
. : ,
, .
OUT (.. ), .
SQL- (. 10).
, , (package specification),
(package header), , .
:
341
Q -- ClassPackage.sql
CREATE OR REPLACE PACKAGE ClassPackage AS
- .
PROCEDURE AddStudent(p_StudentID IN students.id%TYPE,
p_Department IN classes.department%TYPE,
p_Course
IN classes.course%TYPE);
- .
PROCEDURE RemoveStudent( p_StudentID IN students.id%TYPE,
p_Department IN classes.department%TYPE,
p_Course
IN classes.course%TYPE);
- , RemoveStudent.
e_StudentNotRegistered EXCEPTION;
- , .
TYPE t_StudentIDTable IS TABLE OF students. id%TYPE
INDEX BY BINARY_INTEGER;
- PL/SQL ,
- .
PROCEDURE ClassList(p_Department
IN classes.department%TYPE,
p_Course
IN classes.course%TYPE,
p_IDs
OUT t_StudentIDTable,
p_NumStudents IN OUT BINARY_INTEGER);
END ClassPackage;
ClassPackage ,
. :
CREATE [OR REPLACE] PACKAGE _ {IS | AS}
_ \
_, \
_, \
_ \
__ \
_ \
_
END [_];
( , ..)
, . ,
, . :
. ,
, ,
. , WHERE ,
.
342
, . ,
.
. (forward declaration) ( ),
(. 10).
, , . .
(package body) , . , .
, .
,
, . ClassPackage :
Q - ClassPackage.sql
CREATE OR REPLACE PACKAGE BODY ClassPackage AS
-- .
PROCEDURE AddStudent(p_StudentID IN students.id%TYPE,
p_Department IN classes.department%TYPE,
p_Course
IN classes.course%TYPE) IS
BEGIN
INSERT INTO registered_students (student_id, department., course)
VALUES (p_StudentID, p_Department, p_Course);
END AddStudent;
- .
PROCEDURE RemoveStudent( p_StudetitID IN students. id%TYPE,
p_Department IN classes.department%TYPE,
p_Course
IN classes.course%TYPE) IS
BEGIN
DELETE FROM registered_students
WHERE student_id = p_StudentID
AND department = p_Department
AND course = p_Course;
- , DELETE.
- , .
IF SQL%NOTFOUND THEN
RAISE e_StudentNotRegistered;
END IF;
END RemoveStudent;
343
- PL/SQL ,
- .
PROCEDURE ClassList(pJ)epartment
IN classes.department%TYPE,
p_Course
IN classes.course%TYPE,
p_IDs
OUT t_StudentIDTable,
p_NumStudents IN OUT BINARY_INTEGER) IS
v_StudentID registered_students.student_id%TYPE;
- .
CURSOR c_RegisteredStudents IS
SELECT student_id
FROM registered_students
WHERE department = p_Department
AND course = p_Course;
BEGIN
/* p_NumStudents - .
0 .
, .. , p_IDs. */
p_NumStudents := 0;
OPEN c_RegisteredStudents;
LOOP
FETCH c_RegisteredStudents INTO v_StudentID;
EXIT WHEN c_RegisteredStudents%NOTFOUND;
p_NumStudents := p_NumStudents + 1;
p_IDs(p_NumStudents) := v_StudentID;
END LOOP;
END ClassList;
END ClassPackage;
, , , , .
, (,
e _ S t u d e n t N o t R e g i s t e r e d ) ,
.
.
- ( , , ..), .
, (
).
.
,
. , ,
FunctionA, , .
344
rj -- packageError.sql
CREATE OR REPLACE PACKAGE PackageA AS
FUNCTION FunctionA(p_Parameter1 IN NUMBER,
p_Parameter2 IN DATE)
RETURN VARCHAR2;
END PackageA;
CREATE OR REPLACE PACKAGE BODY PackageA AS
FUNCTION FunctionA(p_Parameter1 IN CHAR)
RETURN VARCHAR2;
END PackageA;
P a c k a g e A ,
:
]
, , .
. , ClassPackage. RemoveStudent
PL/SQL:
Q BEGIN
ClassPackage.RemoveStudent(10006, 'HIS', 101);
END;
,
. .
, , , .. ,
.
, ,
. , ClassList, ClassPackage. t_StudentIDTable (. 8):
Q callCL.sql
DECLARE
v_HistoryStudents ClassPackage. t_StudentIDTable;
v_NumStudents
BINARY_INTEGER := 20;
BEGIN
- PL/SQL 20 History 101.
345
, ,
. , RemoveStudent
e_StudentNotRegistered,
ClassPackage.e_StudentNotRegistered.
.
,
, ClassPackage.AddStudent ClassPackage.RemoveStudent
registered_students, . ( ) , students classes.
:
3 "~ ClassPackage2.sql
CREATE OR REPLACE PACKAGE BODY ClassPackage AS
- , students classes
- . p_Add ,
- , - .
PROCEDURE UpdateStudentsAndClasses(
p_Add
IN BOOLEAN,
p_StudentID
IN students.idXTYPE,
p_Department
IN classes.departmentXTYPE,
p_Course
IN classes.courseXTYPE) IS
- .
v_NumCredits classes. num_credits%TYPE;
BEGIN
- NumCredits.
SELECT num_credits
INTO v_NumCredits
FROM classes
WHERE department = p_Department
AND course = p_Course;
IF (p_Add) THEN
-- NumCredits .
UPDATE STUDENTS
SET current_credits = current_credits + v_NumCredits
WHERE ID = p_StudentID;
346
9
- current_students.
UPDATE classes
SET current_students = current_students + 1
WHERE department = p_Department
AND course = p_Course;
ELSE
- NumCredits .
UPDATE STUDENTS
SET current_credits = current_credits - v_NumCredits
WHERE ID = p_StudentID;
- current_students.
UPDATE classes
SET current_students = current_students - 1
WHERE department = p_Department
AND course = p_Course;
END IF;
END UpdateStudentsAndClasses;
- .
PROCEDURE AddStudent(p_StudentID IN students.id%TYPE,
p_Department IN classes.department%TYPE,
p_Course
IN classes.course%TYPE) IS
BEGIN
INSERT INTO registered_students (student_id, department, course)
VALUES (p_StudentIO, p_Department, p_Course);
UpdateStudentsAndClasses(TRUE, p_StudentID, p_Department,
p_Course);
END AddStudent;
- .
PROCEDURE RemoveStudent(p_StudentID IN students.id%TYPE,
p_Department IN classes.department%TYPE,
p_Course
IN classes.course%TYPE) IS
BEGIN
DELETE FROM registered_students
WHERE student_id = p_StudentID
AND department = p_Department
AND course = p_Course;
- , DELETE.
- , .
IF SQL%NOTFOUND THEN
RAISE e_StudentNotRegistered;
ND IF;
UpdateStudentsAndClasses(FALSE, p_StudentID, p_0epartment,
p_Course);
END RemoveStudent;
END ClassPackage;
347
UpdateStudentsAndClasses , , , . , (
AddStudent RemoveStudent), .
(overloaded).
,
, . ,
. , , ,
. , ClassPackage :
Q overload.sql
CREATE OR REPLACE PACKAGE ClassPackage AS
- .
PROCEDURE AddStudent(p_StudentID IN students.id%TYPE,
p_Department IN classes.department%TYPE,
p_Course
IN classes.course%TYPE);
- ,
- , .
PROCEDURE AddStudent(p_FirstName IN students.first_name%TYPE,
p_LastName
IN students. last_name%TYPE,
p_Department IN classes.department%TYPE,
p_Course
IN classes.course%TYPE);
END ClassPackage;
CREATE OR REPLACE PACKAGE BODY ClassPackage AS
- .
PROCEDURE AddStudent(p_StudentID IN students.id%TYPE,
p_Department IN classes.department%TYPE,
p_Course IN classes.course%TYPE) IS
BEGIN
INSERT INTO registered_students (student_id, department, course)
VALUES (p_StudentID, p_Department, p_Course);
END AddStudent;
- , .
PROCEDURE AddStudent(p_FirstName IN students.first_name%TYPE,
p_LastName
IN students.last_name%TYPE,
p_Department IN classes.department%TYPE,
p_Course
IN classes.course%TYPE) IS
v_StudentID students. id%TYPE;
BEGIN
/* students. */
SELECT ID
INTO v StudentID
348
FROM students
WHERE first_name = p_FirstName
- .
INSERT INTO registered_students (student_id, department, course)
VALUES (v_StudentID, p_Department, p_Course);
END AddStudent;
END ClassPackage;
Music 410 :
Q BEGIN
:
(_J BEGIN
ClassPackage.AddStudent('Rita', 'Razmataz', 'MUS', 410);
END;
,
. :
, . , :
PROCEDURE OverloadMe(p_TheParameter IN NUMBER);
PROCEDURE OverloadMe(p_TheParameter OUT NUMBER);
, . , :
FUNCTION OverloadMeToo RETURN DATE;
FUNCTION OverloadMeToo RETURN NUMBER;
, . , CHAR
VARCHAR2 ,
:
PROCEDURE OverloadChar(p_TheParameter IN CHAR);
PROCEDURE OverloadChar(p_TheParameter IN VARCHAR2);
349
PL/SQL
, ,
.
PLS-307: Too many declarations of '' match this call
(
'').
OracleB/ 1
I . ,
:
Q - objectOverload.sql
CREATE OR REPLACE TYPE t1 AS OBJECT (
f NUMBER
);
CREATE OR REPLACE TYPE t2 AS OBJECT (
f NUMBER
, ,
:
)
objectOverload.sql
CREATE OR REPLACE PACKAGE Overload AS
PROCEDURE Proc(p_Parameter1 IN t1);
PROCEDURE Proc(p_Parameter1 IN t2);
END Overload;
CREATE OR REPLACE PACKAGE BODY Overload AS
PROCEDURE Proc(p_.Parameter1 IN t1) IS
BEGIN
DBMS_OUTPUT.PUT_LINECProc(t1): ' || p_Parameter1 . f );
END Proc;
PROCEDURE Proc(p_Parameter1 IN t2) IS
BEGIN
DBMS_OUTPUT.PUT_LINE('Proc(t2): ' || p_Parameter1 . f );
END Proc;
END Overload;
, :
objectOverload.sql
SQL> DECLARE
2
v_0b]1 t1 := t1(1);
3
v_0b]2 t2 := t2(2);
350
BEGIN
5
Overload.Proc(v_0bj1);
6
Overload.Proc(v_0bj2);
7 END;
8 /
Proc(t1): 1
Proc(t2): 2
PL/SQL procedure succefully completed.
12 13.
(instantiated). ,
, . , , .
; , , , .
.
, :
CREATE OR REPLACE PACKAGE BODY _ (IS | AS}
BEGIN
_,,;
END [_];
__ , _, .
, .
| -- Random.sql
CREATE OR REPLACE PACKAGE Random AS
- . ,
-- rand() .
-- (seed).
-
- .
PROCEDURE ChangeSeed(p_NewSeed IN NUMBER);
- 1 32767.
FUNCTION Rand RETURN NUMBER;
- Rand, .
PROCEDURE GetRand(p_RandomNumber OUT NUMBER);
- 1 p_MaxVal.
351
*/
/*
,
. */
v_Seed
number := 1;
PROCEDURE ChangeSeed(p_NewSeed IN NUMBER) IS
BEGIN
v_Seed := p_NewSeed;
END ChangeSeed;
FUNCTION Rand RETURN NUMBER IS
BEGIN
v_Seed := MOD(v_Multiplier * v_Seed + v_Increment,
(2 ** 32));
RETURN BITAND(v_Seed/(2 ** 16), 32767);
END Rand;
PROCEDURE GetRand(p_RandomNumberOUT NUMBER) IS
BEGIN
- Rand .
p_RandomNumber := Rand;
END GetRand;
352
Random. Rand.
:
. , ,
. ChangeSeea.
OracleS DBMS_RANDOM,
(. ).
PL/SQL :
, .
, . ,
. ,
SQL-.
11
.
10
354
10
,
. ,
,
SQL-. OracleSz 19. 11
.
.
CREATE OR REPLACE, PL/SQL. ,
; (local subprogram).
.
CREATE OR
REPLACE, ,
, ,
- (p-code). - , ,
PL/SQL. -
. - (SGA), .
, - LRU.
- , , - Java,
Java. -
( ), -
() .
'
Oracle9\
, - (. ).
. user_objects
, ,
. ,
,
355
(, , ..),
. user_source , u s e r _ e r r o r s
.
:
Q
Edit
Search
Options
Help
OBJECT_TVPE
STATUS
SIMPLE
PROCEDURE
UALID
_*j
u_Counter := 7;
END Simple;
. 10.1.
Simple ,
( ):
CREATE OR REPLACE PROCEDURE Simple AS
v_Counter NUMBER;
BEGIN
356
10
v_Counter := 7
END Simple;
(. 10.2).
user_source - , user_objects INVALID (),
a u s e r _ e r r o r s PLS-103.
ft Oracle SQL-Plus
Ffe Edit ieatch flptions Help
SQL> SELECT object_name, object_type, status
2
FROM user_objects WHERE object_narae - 'SIMPLE';
OBJECT_NAME
OBJECT_TVPE
SIMPLE
PROCEDURE
STATUS
INUALID
FROM user_errors
3
1
POSITION TEXT
1 PLS-00103: Encountered the symbol "END" when expecting one OF
the following:
6 - - + ; < / > i n nod not rem an exponent ()
<> or != or ~- >- <- <> and or like between is null is not
II
is dangling
The symbol ";" was substituted For "END" to continue.
..
|
i
+M
. 10.2.
/
SQL*Plus user_errors
SHOW
ERRORS ( ).
.
SHOW ERRORS "Warning:
Procedure created with compilation errors"(!
.).
2.
. .
PLS-905:
357
ERROR at line 1:
,
PL/SQL, :
] -- localSub.sql
SQL> DECLARE
2
CURSOR c_AHStudents IS
3
SELECT first_name, last_name
4
FROM students;
5
6
v_FormattedName VARCHAR2(50);
7
8
/* ()
9
, . */
10 FUNCTION FormatName(p_FirstName IN VARCHAR2,
11
p_LastName IN VARCHAR2)
12
RETURN VARCHAR2 IS
13 BEGIN
14
RETURN p_FirstName I I ' ' I I p_LastName;
15 END FormatName;
16
17 -- .
358
10
18
BEGIN
19
20
21
22
23
24
END LOOP;
25
END;
26
Scott Smith
Margaret Mason
Joanne Junebug
Manish Murgatroid
Patrick Poll
Timothy Taller
Barbara Blues
David Dinsmore
Ester Elegant
Rose Riznit
Rita Razmataz
Shay Shariatpanahy
PL/SQL procedure succesfully completed.
FormatName . PL/SQL
,
PL/SQL. , , ,
. FormatName ,
.
, .
FormatName StoredProc, :
) localStored.sql
CREATE OR REPLACE PROCEDURE StoredProc AS
/* , */
CURSOR c.AHStudents IS
SELECT first_name, last_name
FROM students;
v_FormattedName VARCHAR2(50);
/* ,
. */
359
BEGIN
360
10
10 ND FormatName;
11
12 CURSOR c_AHStudents IS
13
SELECT first_name, last_name
14
FROM students;
15
16 v_FormattedName VARCHAR2(50);
17 - .
18 BEGIN
19
NULL;
20 END;
21 /
CURSOR c_AHStudents IS
PL/SQL ,
.
, ,
. :
Q - mutual.sql
SQL> DECLARE
2
3
4
5
6
8
9
10
11
12
13
14
15
16
v_TempVal BINARY_INTEGER := 5;
- . ,
- .
PROCEDURE A(p_Counter IN OUT BINARY_INTEGER) IS
BEGIN
DBMS_OUTPUT.PUT_LINE('AC || p_Counter || ')');
IF p_Counter > 0 THEN
B(p_Counter);
p_Counter ;= p_Counter - 1;
END IF;
END A;
- . ,
- .
PROCEDURE B(p_Counter IN OUT BINARY_INTEGER) IS
BEGIN
DBMS_OUTPUT.PUT_LINECBC || p_Counter |
18
p_Counter := p_Counter - 1;
19
A(p_Counter);
20
END B;
21 BEGIN
22
B(v_TempVal);
23 END;
361
24 /
DECLARE
'
ERROR at line 1:
ORA-06550: line 9, column 7:
PLS-00201: identifier 'B' must be declared
ORA-06550: line 9, column 7:
PL/SQL: Statement ignored
.
, .
, . .
, (forward declaration),
. , . . :
Q - forwardDeclaration.sql
DECLARE
vJempVal BINARY_INTEGER := 5;
- .
PROCEDURE B(p_Counter IN OUT BINARY_INTEGER);
PROCEDURE A(p_Counter IN OUT BINARY_INTEGER) IS
BEGIN
DBMS_OUTPUT.PUT_LINE('AC || p_Counter || ' )')';IF p_Counter > 0 THEN
B(p_Counter);
p_Counter := p_Counter - 1;
END IF;
END A;
PROCEDURE B(p_Counter IN OUT BINARY_INTEGER) IS
BEGIN
DBMS_OUTPUT.PUT_LINECA(' || p_Counter || ')');
p_Counter := p_Counter - 1;
A(p_Counter);
END B;
BEGIN
B(v_TempVal);
END;
:
(4)
(4)
(3)
(3)
362
10
(2)
(2)
(0)
9, , ,
. , :
]
overloadedLocal.sql
DECLARE
-
PROCEDURE LocalProc(p_Parameter1 IN NUMBER) IS
BEGIN
DBMS_OUTPUT.PUT_LINE(' In version 1, p_Parameter1 = ' |l
p_Parameter1);
END LocalProc;
PROCEDURE LocalProc(p_Parameter1 IN VARCHAR2) IS
BEGIN
DBMS_OUTPUT.PUT_LINE('In version 2, p_Parameter1 = ' II
p_Parameter1);
END LocalProc;
BEGIN
- 1.
LocalProc(12345);
- 2.
LocalProc('abcdef ' );
END;
:
.
?
, . , ,
.
.
, , , (, ). , ,
, .
10.1.
363
10.1.
,
-;
.
.
,
.
,
, ,
EXECUTE
.
, .
. , ,
,
.
-
,
DBMS_SHARED_POOLKEEP.'
.
,
,
( ).
DBMS_SHARED_POOL " ".
. , . , . ,
.
Oracle, , . , (dependent) . ,
, ,
.
, ,
, DDL. .
AlmostFull (. 9) classes.
AlmostFull . 10.3. AlmostFull classes. .
364
10
. 10.3. AlmostFull
, AlmostFull temp_table. RecordFullClasses:
] RecordFullClasses.sql
CREATE OR REPLACE PROCEDURE RecordFullClasses AS
CURSOR c_Classes IS
SELECT department, course
FROM classes;
BEGIN
FOR v_ClassRecord IN c_Classes LOOP
- temp_table ,
- .
IF AlmostFull(v_ClassRecord.department, v_ClassRecord.course)
THEN
INSERT INTO temp_table (char_col) VALUES
(v_ClassRecord.department || ' ' || v_ClassRecord.course ||
' is almost full! ');
END IF;
END LOOP;
END RecordFullClasses;
. 10.4. RecordFullClasses
365
classes DDL, ,
classes ( ), . classes, :
ALTER TABLE classes ADD (
student_rating NUMBER(2) -- 1 10
OBJECT TYPE
STflTUS
RECORDFULLCLflSSES
ALMOSTFULL
PROCEDURE
FUNCTION
URLID
UALID
2
student_rating
3 );
NUMBER(Z)
Table altered.
SQL> SELECT object_nane, object_type, status
2
FROM user_objects
3
OBJECT NAME
OBJECT TVPE
STflTUS
RECORDFULLCLASSES
ALMOSTFULL
PROCEDURE
FUNCTION
INVALID
INUALID
SQL>
JLU
. 10.5. DDL
,
PL/SQL
. RecordFullClasses, AlmostFull
classes, (. . 10.6).
366
10
^Oracle SQL-Plus
file Edit Search Options 1
Table altered.
SQL> SELECT odject_name, object_type, status
2
FROM user_objects
1
1
3
WHERE object_nane IN ('flLMOSTFULL , 'RECORDFULLCLflSSES );
OBJECT NAME
OBJECT TYPE
STflTUS
RECORDFULLCLflSSES
BLMOSTFULL
PROCEDURE
FUNCTION
INUflLID
INUALID
OBJECT TVPE
STflTUS
RECORDFULLCLASSES
ALMOSTFULL
PROCEDURE
FUNCTION
UflLID
UflLID
SQL>
J-JJ
. 10.6.
!
( ).
.
, .
, .
. ClassPackage
(. 9), . 10.7.
registered_students . , registered_students. . ,
. , , , .
,
, .
367
ClassPackage
registered_students.
.
registered_students
ClassPackage
,
.
. 10.7. ClassPackage
. ,
, , ,
, ,
.
,
. ,
(.
" ")
,
(, ) .
SQL*Plus:
| - dependencies, sql
SQL> -- .
SQL> CREATE TABLE simple_table (f1 NUMBER);
Table created.
SQL> -- , .
SQL> CREATE OR REPLACE PACKAGE Dependee AS
4 /
Package created.
SQL> CREATE OR REPLACE PACKAGE BODY Dependee AS
2 PROCEDURE Example(p_Val IN NUMBER) IS
3
BEGIN
4
INSERT INTO slmple_table VALUES (p_Val);
5
END Example;
6 END Dependee;
7 /
Package body created.
368
10
SQL> -- , Dependee.
SQL> CREATE OR REPLACE PROCEDURE Depender(p_Val IN NUMBER) AS
2 BEGIN
3
Dependee.Example(p_Val+ 1);
4 END Depender;
5 /
Procedure created.
SQL> -- user_objects , .
SQL> SELECT object_name, object_type, status
2
FROM user_objects
1
3
WHERE object_name IN ('DEFENDER', ' DEPENDEE ,
4
'SIMPLEJTABLE');
OBJECT NAME
OBJECT TYPE
STATUS
SIMPLE_TABLE
DEPENDEE
DEPENDEE
DEPENDER
TABLE
PACKAGE
PACKAGE BODY
PROCEDURE
VALID
VALID
VALID
VALID
SQL> -- . ,
SQL> -- .
SQL> CREATE OR REPLACE PACKAGE BODY Dependee AS
2 PROCEDURE Example(p_Val IN NUMBER) IS
3
BEGIN
4
INSERT INTO simple_table VALUES (p_Val - 1);
5
END Example;
6 END Dependee;
7 /
TABLE
PACKAGE
PACKAGE BODY
STATUS
VALID
VALID
VALID
SQL> --
SQL> -- .
SQL> DROP TABLE simple_table;
Table dropped.
SQL> SELECT object_name, object_type, status
2
FROM user_.objects
369
3
WHERE object_name IN ('DEFENDER', 'DEPENDEE',
4
SIMPLE_TABLE');
OBJECT,NAME
OBJECT_TYPE
STATUS
DEPENDEE
DEPENDEE
DEPENDER
PACKAGE
PACKAGE BODY
PROCEDURE
VALID
INVALID
VALID
6 user_dependencies,
all_dependencies dba_dependencies
, .
.
. 10.8 ,
.
Dependee.Example
( )
Depender
.
Dependee.Example
( )
simplejtable
simplejtable
.
. 10.8.
. ,
. ,
. , : 1 2 (. 10.9).
1 2, .. 2 1
. SQL*Plus.
370
10
PL/SQL
. 10.9. P1 2
] ..- remoteDependencies.sql '
SQL> -- . 1 2.
SQL> CREATE OR REPLACE PROCEDURE P2 AS
2 BEGIN
3
DBMS_OUTPUT.PUT_LINECInside P2! ');
4 END P2;
5 /
Procedure created.
SQL> CREATE OR REPLACE PROCEDURE P1 AS
2 BEGIN
3
DBMS_OUTPUT.PUT_LINE('Inside P1! ');
4
P2;
5 ENDP1;
6 /
Procedure created.
SQL> -- .
SQL> SELECT object_name, object_type, status
2
FROM user_objects
3
WHERE object_name IN , - P 2 ' ) ;
OBJECT_NAME
OBJECT_TYPE
STATUS
P2
Pi
VALID
VALID
PROCEDURE
PROCEDURE
SOL> -- 2, 1 .
SQL> ALTER PROCEDURE P2 COMPILE;
Procedure altered.
SQL > -- .
SQL> SELECT object_name, object_type, status
2 FROM user_objects
3 WHERE object_name IN , P2');
OBJECT_NAME
OBJECT TYPE
STATUS
P2
P1
PROCEDURE
PROCEDURE
VALID
INVALID
371
END P1;
PL/SQL 2
PL/SQL 1
. 10.10. P1 2
, 1 2 , 1
2, (. 10.10).
2 1,
SQL*Plus:
] - remoteDependencies.sql
SQL> -- , .
SQL> -- connect_string
SQL> -- SQL*Net .
SQL> CREATE DATABASE LINK loopback
2
USING 'connect_string';
Database link created.
SQL> -- R1 , 2 .
SQL> CREATE OR REPLACE PROCEDURE P1 AS
2 BEGIN
Procedure created.
SQL> -- .
SQL> SELECT object_name, object_type, status
2
FROM user_objects
3
WHERE object_name IN , ' 2 ' ) ;
OBJECT_NAME
OBJECT TYPE STATUS
P2
P1
PROCEDURE
PROCEDURE
VALID
VALID
SQL> - 2 1
SQL> - .
SOL> ALTER PROCEDURE P2 COMPILE;
Procedure altered.
SQL> SELECT object_name, object_type, status
372
10
2
FROM user_pbjects
3
WHERE objectjiame IN C R T , ' P 2 ' ) ;
OBJECT NAME
OBJECT TYPE
STATUS
2
P1
PROCEDURE
PROCEDURE
VALID
VALID
(loopback), ..
. ,
1 2 .
1 2 SELECT.
? , .
,
( ).
. 1
2 ( , ). 1 2 , , 1. :
.
. 1
PL/SQL (,
Oracle Forms), a P2 ,
(. 2).
, . (timestamp) last_ddl_time
user_objects. ,
, .
:
PL/SQL. , .
373
,
. 2 , . 1 , - .
, 1
PL/SQL, Oracle Forms. , 1 ,
Oracle Forms, .
PL/SQL
. . - (signature).
. 2
. 1 , 2 ( ), 1 2.
REMOTE_DEPENDENCIES_MODE SIGNATURE.
( , init. ,
). , .
:
REMOTE_DEPENDENCIES_MODE=SIGNATURE.
SIGNATURE
.
:
ALTER SYSTEM SET REMOTE_DEPENDENCIES_MODE = SIGNATURE;
( ),
. ALTER SYSTEM.
:
ALTER SESSION SET REMOTE_DEPENDENCIES_MODE = SIGNATURE;
. , , .
SIGNATURE
TIMESTAMP, .
TIMESTAMP .
:
374
10
, , . ,
2
, 1.
2, 1 .
, ,
, 1 . IN.
1 2 , 2,
. 1 ( )
, 1 .
,
:
ALTER PROCEDURE _ COMPILE;
_ . :
ALTER FUNCTION _ COMPILE;
:
ALTER PACKAGE _ COMPILE;
ALTER PACKAGE _ COMPILE SPECIFICATION;
ALTER PACKAGE _ COMPILE BODY;
SPECIFICATION, . BODY,
. , ,
.
"Oracle Server Application Developer's Guide".
-
. (runtime state), .. , ,
. ( ) .
, . 9, , , .
PL/SQL, EXECUTE . ,
. :
375
) -- PersistPkg.sql
CREATE OR REPLACE PACKAGE PersistPkg AS
- ,
TYPE t_StudentTable IS TABLE OF students. ID%TYPE
INDEX BY BINARY_INTEGER;
- , .
v_MaxRows NUMBER := 5;
- v_MaxRows .
PROCEDURE ReadStudents(p_StudTable OUT t_StudentTable,
p_NumRows OUT NUMBER);
END PersistPkg;
CREATE OR REPLACE PACKAGE BODY PersistPkg AS
- students .
- , .
CURSOR StudentCursor IS
SELECT ID
FROM students
ORDER BY last_nane;
PROCEDURE ReadStudents(p_StudTable OUT t_StudentTable,
p_NumRows OUT NUMBER) IS
v_Done BOOLEAN := FALSE;
v_NumRows NUMBER := 1;
BEGIN
IF NOT StudentCursor%ISOPEN THEN
- .
OPEN StudentCursor;
END IF;
- , v_MaxRows .
WHILE NOT v_Done LOOP
FETCH StudentCursor INTO p_StudTable(v_NumRows);
IF StudentCursor%NOTFOUNDTHEN
- , .
CLOSE StudentCursor;
v_Done := TRUE;
ELSE
v_NumRows := v_NumRows + 1;
IF v_NumRows > v_MaxRows THEN
v_Done := TRUE;
END IF;
END IF;
END LOOP;
- .
p_NumRows := v_NumRows - 1;
END ReadStudents;
END PersistPkg;
376
10
PersistPkg.ReadStudents
StudentsCursor. ( ReadStudents),
ReadStudents. PersistPkg.ReadStudents :
FJ
callRS.sql
DECLARE
SQL> @cti8S\callRS
Fetched 5 rows:
Barbara Blues
Dauid Dinsmore
Ester Elegant
Joanne Junebug
Margaret Mason
PL/SQL procedure successfully completed.
SQL> @ch05\callRS
Fetched 5 rows:
Manish Murgatroid
Patrick Poll
Rita Raznataz
Rose Riznit
Shay Shariatpanahy
PL/SQL procedure successfully completed.
SQL> @ch05\callRS
Fetched 2 rows:
Scott Smith
Timothy Taller
PL/SQL procedure successfully completed.
JLU
. 10.11. ReadStudents
377
. 10.11. ,
.
PL/SQL . (serially reusable) ,
.
PRAGMA SERIALLY_REUSABLE;
( ). PersistPkg, (.
. 10.12).
-- PersistPkg2.sql
CREATE OR REPLACE PACKAGE PersistPkg AS
PRAGMA SERIALLY_REUSABLE;
- ,
TYPE t StudentTable IS TABLE OF students. ID%TYPE
..Oracle SQL-Plus
File Edit Search flptiom Help
SQL> GchOS\callRS
Fetched 5 rows:
Barbara Blues
Dauid Dinsmore
Ester Elegant
Joanne Junebug
Margaret Mason
. 10.12. ReadStudents
378
10
INDEX BY BINARY_INTEGER;
- , .
v_MaxRows NUMBER := 5;
- v_MaxRows .
PROCEDURE ReadStudents(p_StudTableOUT t_StudentTable,
p_NumRows OUT NUMBER);
END PersistPkg;
CREATE OR REPLACE PACKAGE BODY PersistPkg AS
PRAGMA SERIALLY_REUSABLE;
- students .
- ,
- , .
CURSOR StudentCursor IS
SELECT ID
FROM students
ORDER BY last_name;
END PersistPkg;
, (, , ) .
.
, .
,
.
, , ,
.
, .
:
Q - anonymousDependencies.sql
CREATE OR REPLACE PACKAGE SimplePkg AS
379
v_GlobalVar NUMBER := 1;
PROCEDURE UpdateVar;
END SimplePkg;
CREATE OR REPLACE PACKAGE BODY SimplePkg AS
PROCEDURE UpdateVar IS
BEGIN
v_GlobalVar := 7;
END UpdateVar;
END SimplePkg;
SimplePkg v_GlobalVar.
, SimplePkg . SimplePkg. UpdateVar :
Q
BEGIN
SimplePkg.UpdateVar;
END;
SimplePkg ,
. . :
]
BEGIN
*
ERROR at line 1:
ORA-04068: existing state of packages has been discarded
ORA-04061: existing state of package "EXAMPLE. SIMPLEPKG" has been
invalidated
ORA-04065: not executed, altered or dropped package
"EXAMPLE.SIMPLEPKG"
380
10
SimplePkg
v_GlobalVar
.
. 10.13.
,
. ,
.
, ,
.
EXECUTE
,
SELECT, INSERT, UPDATE DELETE.
GRANT.
EXECUTE.
RecordFullClasses:
Q execute.sql
CREATE OR REPLACE PROCEDURE RecordFullClasses AS
CURSOR c_Classes IS
SELECT department, course
FROM classes;
BEGIN
FOR v_ClassRecord IN c_Classes LOOP
- temp_table ,
- .
IF AlmostFull(v_ClassRecord.department, v_ClassRecord.course) THEN
INSERT INTO temp_table (char_col) VALUES
(v_ClassRecord.department 1 1 ' ' 1 1 v_ClassRecord.course
1 1 ' is almost full! ');
END IF;
END LOOP;
END RecordFullClasses;
381
UserB RecordFullClasses ( ):
[_) - execute.sql
BEGIN
UserA.RecordFullClasses;
END;
UserA (. . 10.14).
( GRANT) UserA UserB, ,
.
UserA.temp_table.
. 1!
classes
UserA
UserB
UserA.temp_table
. 10.14. UserA
382
10
__ _ _ _ _ , W
RecordFullClasses
AlmostFull
1
classes
temp_table
User A
UserA.temp_table.
UserB
UserB.temp_table
.
, . 10.15. , UserA temp_table, RecordFullClasses,
UserB. , RecordFullClasses , UserA (. . 10.16).
- execute.sql
CREATE OR REPLACE PROCEDURE RecordFullClasses AS
CURSOR c_Classes IS
SELECT department, course
383
UserB.temp_table.
. 10.16.
UserB
RecordFullClasses
) execute.sql
GRANT SELECT ON classes TO UserB;
GRANT EXECUTE ON AlmostFull TO UserB;
:
FJ -- execute, sql
384
10
.
. 10.17.
UserB.RecordFullClasses
,
.
. 10.17.
, , :
, , .
, RecordFullClasses PLS-201:
rj PLS-201: identifier 'CLASSES' must be declared
PLS-201: identifier 'ALMOSTFULL' must be declared
, . , , , ,
, .
?
. PL/SQL
: , . GRANT REVOKE DDL. ,
385
. ,
, . . ,
SET
ROLE. , SET ROLE
, GRANT REVOKE
. ,
.
, , .
. ,
, .
, , ,
,
, . 10.15. UserA UserB temp_table, a RecordFullClasses UserA UserA. temp_table.
RecordFullClasses
(definer's rights),
,
.. .
OracleSi .
(invoker's rights)
, .
AUTHID. , (. 12).
, . AUTHID:
CREATE [OR REPLACE] FUNCTION _
[_] RETURN _
[AUTHID {CURRENTJUSER | DEFINER}] {IS | AS}
_;
CREATE [ORREPLACE] PROCEDURE _
[ _]
[AUTHID {CURRENT_USER | DEFINER}] {IS | AS}
_;
CREATE [OR REPLACE] PACKAGE __
[AUTHID {CURRENT_USER | DEFINER}] {IS | AS}
_;
386
10
AUTHID CURRENT_USER ( ), ,
DEFINER . (
AUTHID ) .
, RecordFullClasses
:
Q
invokers.sql
CREATE OR REPLACE PROCEDURE RecordFullClasses
AUTHID CURRENT_USER AS
- : classes AlmostFull
- UserA, UserA.
CURSOR c_Classes IS
SELECT department, course
FROM UserA.classes;
BEGIN
FOR v_ClassRecord IN c_Classes LOOP
- 1_1' ,
-- .
IF UserA.AlmostFull(v_ClassRecord.department,
v_ClassRecord.course) THEN
INSERT INTO temp_table (char_col) VALUES
(v_ClassRecord.department 1 1 ' ' 1 1 v_ClassRecord.course | |
' is almost full! ' ) ;
END IF;
END LOOP;
END RecordFullClasses;
SQL> -- UserA;
SQL> -- UserA.temp_table.
SOL> BEG-IN
2
RecordFullClasses;
3
COMMIT;
4 END;
5 /
PL/SQL procedure successfully completed.
387
RecordFullClasses
( )
UserA
UserA
RecordFullClasses,
.
UserB
Users
RecordFullClasses,
.
. 10.18. RecordFullClasses
SQL> -- temp_table . .
SQL> SELECT * FROM temp_table;
MUM COL CHAR COL
MUS 410 is almost full!
SQL> -- UserB.
SQL> -- RecordFullClasses
SQL> -- UserB.temp_table.
SQL> BEGIN
2
UserA.RecordFullClasses;
3
COMMIT;
4 END;
5 /
PL/SQL procedure successfully completed.
SQL> -- .
SQL> SELECT * FROM temp_table;
NUM_COL
CHAR_COL
MUS 410 is almost full!
SQL- , .
PL/SQL (, ) - .
(GRANT) RecordFullClasses classes
388
10
RecordFullClasses
( )
AlmostFull
1r
tempjtable
classes
UserA
UserA
RecordFullClasses,
.
. 10.19. SELECT classes
UserB
UserB
RecordFullClasses,
ORA-942,
389
ORA-942, PLS-201.
,
.
, classes
, . ,
(. . 10.17).
.
, . , , ,
(. . 10.20).
-- invokers.sql
SQL> connect UserA/UserA
Connected.
SQL> CREATE ROLE UserA_Role;
Role created.
SQL> GRANT SELECT ON classes TO UserA_Role;
Grant succeeded.
SQL> GRANT UserA_Role TO UserB;
Grant succeeded.
SQL> -- UserB .
SQL> connect UserB/UserB
Connected,
SQL> -- RecordFullClasses .
SQL> BEGIN
2
UserA.RecordFullClasses;
RecordFullClasses
( )
UserA
UserA Role
UserA
RecordFullClasses,
.
. 10.20.
UserB
UserB
RecordFullClasses,
.
390
10
COMMIT;
4 END;
5 /
,
, - .
,
. ,
SET ROLE (
SQL).
,
- ,
. PL/SQL,
.
.
SQL-
, SQL-.
, SQL-. PL/SQL 2.1 (Oracle? 7.1), OracleSz
.
, , ,
(, TO_CHAR, UPPER ADD_MONTHS).
Oracle
.
.
.
(purity level) , . 10.2.
:
, SQL-, (WNDS). ( OracleSz , , SELECT,
; . "
HsSQLBOracleSi".)
391
( ) ,
(RNPSnWNPS).
, SELECT, VALUES SET,
. WNPS.
, . , ,
, ( UPDATE),
WNDS , , SELECT.
PL/SQL
CHECK CREATE
TABLE ALTER TABLE, , ,
.
10.2.
WNDS
( DML).
( SELECT).
(
FETCH).
(
SQL-).
RNDS
WNPS
RNPS
He
, , , ,
SQL-. ,
.
.
.
IN, IN OUT
OUT.
392
10
, , PL/SQL, BOOLEAN RECORD.
NUMBER, CHAR, VARCHAR2, ROWID, LONG, RAW, LONG RAW
DATE, OracleS i 19.
, , .
COMMIT ROLLBACK, .
ALTER SESSION
ALTER SYSTEM.
FullName,
.
FullName.sql
CREATE OR REPLACE FUNCTION FullName (
p_StudentID students.ID%TYPE)
RETURN VARCHAR2 IS
v_Result VARCHAR2(1QO);
BEGIN
SELECT first_name || ' ' || last_name
INTO v_Result
FROM students
WHERE ID = p_StudentID;
RETURN v_Result;
END FullName;
FullName , SQL-:
(jj - FullName. sql
SQL> SELECT ID, FullName(ID) "Full Name"
2
FROM students;
ID Full Name
393
- flETURN VARCHAR2;
PRAGMA RESTRlCT_REFERENCES(FullName, WNDS, WNPS, RNPS);
/*. ,
. */
FUNCTION NumHistoryMajors
-V RETURN NUMBER;
PRAGMA RESTRICT_REFERENCES(NumHistoryMajors, WNDS);
END StudentOps;
. CREATE OR REPLACE PACKAGE BODY StudentOps AS
-- -.
:. vlNumHist NUMBER;
FUNCTION FullName(p_StudentIDIN students.ID%TYPE)
- RETURN VARCHAR2 IS
v_Result VARCHAR2(100);
BEGIN
SELECT first_name ' ' 1 1 last_name
INTO v_Result
FROM students
394
10
WHERE ID = p_StudentID;
RETURN v_Result;
END FullName;
FUNCTION NumHistoryMajors RETURN NUMBER IS
v_Result NUMBER;
BEGIN
IF v_NumHist IS NULL THEN
/* */
SELECT COUNT(*)
INTO v_Result
FROM students
WHERE major = 'History';
/* . */
v_NumHist :=v_Result;
ELSE
v_Result := v_NumHist;
END IF;
RETURN v_Result;
END NumHistoryMajors;
END StudentOps;
Oracle8\ .
PL/SOL
(. " SQL
Oracle8\").
RESTRICT_REFERENCES , ?
, . , PL/SQL,
, , .
,
. PL/SQL ,
,
.
( )
.
, .
395
PL/SQL
,
, OracleSL
,
,
.
SQL
RESTRICTJREFERENCES
OracleSi, .
. . ,
. RESTRICT _
REFERENCES, , .
DEFAULT -
RESTRICT_REFERENCES,
. OracleS , .
DEFAULT:
PRAGMA RESTRICT_REFERENCES( DEFAULT,
WNDS[, WNPS] [, RNDS] [, RNPS]);
.
DefaultPragma:
Q
- DefaultPragma. sql
CREATE OR REPLACE PACKAGE DefaultPragma AS
FUNCTION F1 RETURN NUMBER;
PRAGMA RESTRICT_REFERENCES(F1, RNDS, RNPS);
PRAGMA RESTRICT_REFERENCES(DEFAULT, WNDS,
WNPS,
RNDS,
RNPS);
396
10
RETURN 1;
END f1;
FUNCTION F2 RETURN NUMBER IS
BEGIN
RETURN 2;
END F2;
- .
FUNCTION F3 RETURN NUMBER IS
BEGIN
INSERT INTO temp_table (num_col, char_col)
VALUES (1, ' F 3 ! ' ) ;
RETURN 3;
END F3;
END DefaultPragma;
RESTRICTJREFERENCES ,
. ,
. Test Fun :
Q -- Overload.sql
CREATE OR-REPLACE PACKAGE Overload AS
FUNCTION TestFunc(p_Parameter1 IN NUMBER)
RETURN VARCHAR2;
PRAGMA RESTRICT_REFERENCES(TestFunc, WNDS, RNDS, WNPS, RNPS);
FUNCTION TestFunc(p_ParameterA IN VARCHAR2,
p_ParameterB IN DATE)
RETURN VARCHAR2;
PRAGMA RESTRICT_REFERENCES(TestFunc, WNDS, RNDS, WNPS, RNPS);
END Overload;
CREATE OR REPLACE PACKAGE BODY Overload AS
FUNCTION TestFunc(p_Parameter1 IN NUMBER)
RETURN VARCHAR2 IS
BEGIN
397
SQL*Plus , SQL
:
-- Overload.sql
SQL> SELECT Overload.TestFunc(1) FROM dual;
OVERLOAD.TESTFUNC(1)
Version 1
SQL> SELECT Overload.TestFunc('abc', SYSDATE) FROM dual;
OVERLOAD.TESTFUNCCABC', SYSDATE)
Version 2
RESTRICT_REFERENCES
, ,
.
PL/SQL , Oracle7.3 PL/SQL 2.3.
DBMS_OUTPUT, DBMS_PIPE, DBMS_ALERT,
DBMS_SQL UTL_FILE. (. 10.3). ,
OracleSi, , , , SQL-. ,
18, ,
.
("" ""),
, ,
10.3.
PL/SQL
( $ORACLE_HOME
rdbtns/admin).
398
10
10.3. RESTRICT_REFERENCES
DBMS_ALERT
- REGISTER COMMIT
DBMS_JOB
,
SQL
DBMS_OUTPUT
7.3.3
DBMS.PIPE
7.3.3
DBMS_SQL
EXECUTE PARSE
DDL, COMMIT
STANDARD
7.3.3 ( RAISE_APPLICATION_ERROR)
UTL.FILE
8.0.6
UTL HTTP
7.3.3
( ) .
SQL-
. , ; . FullName
:
SELECT FullName(p_StudentID => 10000) FROM dual;
SQL OracleS/
, RESTRICT_REFERENCES
. OracleSi SQL . OracleS . ,
.
(, , Java ). PL/SQL
, (.
12). , .
, SQL-. . ,
,
.
, StudentOps :
StudentOps2.sql
CREATE OR REPLACE PACKAGE StudentOps AS
FUNCTION FullName(p_StudentID IN students. ID%TYPE)
399
RETURN VARCHAR2;
/* ,
. */
FUNCTION NumHistoryMajors
RETURN NUMBER;
END StudentOps;
, , SQL:
SQL> SELECT StudentOps.FullNane(ID)
2
FROM students
3
WHERE major = 'History';
STUDENTOPS. FULLNAME(ID)
Margaret Mason
Patrick Poll
Timothy Taller
SQL> INSERT INTO temp_table(num_col)
2
VALUES (StudentOps.NumHistoryMajors);
1 row created.
SQL> SELECT * FROM temp_table;
NUM_COL CHAR_COL
SELECT :
Q
-- InsertTemp.sql
SQL> SELECT InsertTempd, 'Hello')
2
FROM dual;
SELECT InsertTempd, 'Hello')
y
ERROR at line 1:
ORA-14551: cannot perform a DML operation inside a query
ORA-06512: at "EXAMPLE. INSERTTEMP", line 6
400
10
ORA-06512: at line 1
TRUST
RESTRICT_REFERENCES ( ), ,
OracleS , . (. ). , , , , .
OracleS i TRUST,
.
TRUST , ,
, .
,
RESTRICT_REFERENCES, ,
. :
| - TrustPkg.sql
CREATE OR REPLACE. PACKAGE TrustPkg AS
FUNCTION ToUpper (p_a VARCHAfl2) RETURN VARCHAR2 IS
LANGUAGE JAVA
NAME 'Test.Uppercase(char[]) return chart"]';PRAGMA RESTRICT_REFERENCES(ToUpper, WNDS, TRUST);
PROCEDURE Derno(p_in IN VARCHAR2, p_out OUT VARCHAR2);
PRAGMA RESTRICT_REFERENCES(Demo, WNDS);
END TrustPkg;
CREATE OR REPLACE PACKAGE BODY TrustPkg AS
PROCEDURE Derno(p_in IN VARCHAR2, p_out OUT VARCHAR2) IS
BEGIN
p_out := ToUpper(p_in);
END Demo;
END TrustPkg;
TrustPkg.ToUpper ; Java,
. PL/SQL, TRUST. ToUpper
Demo, , WNDS.
\ '"
TrustPkg ,
Java, ,
Test. Uppercase.
i '
DML
OracleS , DML,
(.. WNDS).
OracleSi . ,
401
-- DMLUpdate.sql
CREATE OR REPLACE FUNCTION UpdateTemp(p_ID IN students.ID%TYPE)
RETURN students. ID%TYPE AS
BEGIN
INSERT INTO temp_table (num_col, char_col)
VALUES(p_ID, 'Updated!');
RETURN p_ID;
END UpdateTemp;
OracleSz
:
rj -- DMLUpdate.sql
SQL> UPDATE students
2 SET major = 'Nutrition'
3
WHERE UpdateTemp(ID) = ID;
WHERE UpdateTemp(ID) = ID
ERROR at :
ORA-06571: Function UPDATETEMP does not guarantee not to update database
OracleS? , UpdateTemp
students, temp_table.
, DML,
,
.
(shared pool) SGA,
- .
- . ,
. LRU (least recently used ).
"Oracle Concepts".
DBMS_SHARED_POOL (pin)
. ,
. , . ,
. ,
.
402
10
DBMS_SHARED_POOL : DBMS_SHARED_
POOL.KEEP, DBMS_SHARED_POOL.UNKEEP, DBMS_SHARED_POOL.SIZES
HDBMS_SHARED_POOL.ABORTED_REQUEST_THRESHOLD.
KEEP
DBMS_SHARED_POOL.KEEP
. , , , Java ( OracleS ), SQL-.
KEEP :
PROCEDURE KEEP(mmeVARCHAR2,
flag CHAR DEFAULT 'P');
.
,
DBMS_SHARED_POOL.UNKEEP. ,
DBMS_SHARED_POOL.KEEP , .
name
flag
VARCHAR2
CHAR
,
SQL-. SQL-
address hash_value v$sqlarea
(
SYS); SIZES.
. :
,
Q
R
(OracleS )
JS Java (OracleS )
JC Java (OracleS i )
JR Java (OracleS )
JD Java (OracleS )
SQL
UNKEEP
UNKEEP , .
. :
PROCEDURE UNKEEP(reawVARCHAR2,
flagCHAR DEFAULT ');
403
KEEP.
, .
SIZES
. SIZES :
PROCEDURE SIZES( minsize NUMBER);
, minsize.
SIZES DBMS_OUTPUT, SET
SERVEROUTPUT ON SQL*PIus Server Manager.
ABORTED_REQUEST_THRESHOLD
,
, ,
. .
ABORTED_REQUEST_THREASHOLD. :
PROCEDURE ABORTED_REQUEST_THRESHOLD( threshold_size NUMBER);
Oracle
, threashold_size .
PL/SQL, , .
, SQL-.
DBMS_SHARED_POOL. PL/SQL .
11
406
11
. PL/SQL .
, .
.
, PL/SQL ,
. ,
. , . ,
, . (firing). , , DML (INSERT, UPDATE DELETE),
. OracleSi
: , , DDL.
:
, ,
.
, ,
,
.
, ,
.
"- ".
: DML, .
Oracle8\ PL/SQL
,
(. " "
12).
407
DML
DML DML, . DML , (INSERT, UPDATE, DELETE).
,
.
, , ,
. major_stats:
rj - reliables.sql
CREATE TABLE major_stats (
major
VARCHAR2(30)
total_credits
NUMBER,
total_students NUMBER);
major_stats ,
students, major_stats
students. UpdateMajorStats.
DML students.
students major_stats :
Q
UpdateMajorStats. sql
CREATE OR REPLACE TRIGGER UpdateMajorStats
/* major_stats,
, students. */
AFTER INSERT OR DELETE OR UPDATE ON students
DECLARE
CURSOR c_Statistics IS
SELECT major, COUNT(*) total_students,
SUM(current_credits) total_credits
FROM students
GROUP BY major;
BEGIN
/* major_stats, .
. */
DELETE FROM major_stats;
/*
major_stats. */
FOR v_StatsRecord in c_Statistics LOOP
INSERT INTO major_stats (major, total_credits, total_students)
VALUES (v_StatsRecord.major, v_StatsRecord.total_credits,
v_StatsRecord.total_students);
END LOOP;
END UpdateMajorStats;
408
11
. , U p d a t e M a j o r S t a t s
INSERT, UPDATE DELETE.
DML, .
OracleS . (instead of) ( ,
). DML, DML,
DML, . .
classes_rooms:
;_j -- insteadOf .sql
CREATE OR REPLACE VIEW classes_rooms AS
SELECT department, course, building, room_number
FROM rooms, classes
WHERE rooms.room_id = classes.room_id;
,
, , SQL*Plus:
]
insteadOf .sql
SQL> INSERT INTO classes_rooms (department, course, building, room_number)
2
VALUES ('MUS', 100, 'Music Building', 200);
INSERT INTO classes_rooms (department, course, building, room_number)
*
ERROR at line 1:
ORA-01776: cannot modify more than one base table through a join view
:
Q - insteadOf.sql
CREATE TRIGGER ClassesRoomsInsert
INSTEAD OF INSERT ON classes_rooms
DECLARE
v_roomID rooms.room_id%TYPE;
BEGIN
- .
SELECT room_id
INTO v_roomID
FROM rooms
409
ClassesRoomsInsert INSERT
, .
ClassesRoomsInsert
. , "
", .
18 .
DML, ,
, , . DDL,
. , . ,
:
:
-- LogCreations.sql
CREATE TABLE ddl_creations (
user_id
VARCHAR2(30),
object_type VARCHAR2(20),
object_name
VARCHAR2(30),
object_owner VARCHAR2(30),
creation date DATE);
. LogCreations ddl_creations
CREATE .
;;
-- LogCreations.sql
CREATE OR REPLACE TRIGGER LogCreations
AFTER CREATE ON SCHEMA
BEGIN
. :
CREATE [OR REPLACE] TRIGGER _
410
11
32 .
, ,
.
.
DML
DML INSERT (), UPDATE () DELETE (), . (BEFORE) (AFTER)
.
. 12 : 3 2 2 . DML:
11.1.
,
DML, : , INSERT
UPDATE. .
,
DML-. ,
AFTER DELETE.
. ( .)
411
11.1. DML
INSERT, DELETE
UPDATE
BEFORE AFTER
, DML .
.. ''
:
.
,
,
, .
,
.
FOR EACH ROW
( ) .
DML
DML.
DML :
1. BEFORE ( ).
2. , :
A. BEFORE ( ).
B. .
C. AFTER ( ).
3. AFTER ( ).
UPDATE classes. BEFORE AFTER:
- firingOrder.sql
CREATE SEQUENCE trig_seq
START WITH 1
INCREMENT BY 1;
412
11
CREATE OR REPLACE PACKAGE TrigPackage AS
-
v_Counter NUMBER;
END TrigPackage;
CREATE OR REPLACE TRIGGER classesBStatement
BEFORE UPDATE ON classes
BEGIN
- .
TrigPackage.v_Counter := 0;
INSERT INTO temp_table (num_col, char_col)
VALUES (trig_seq.NEXTVAL,
'Before Statement: counter = ' | I TrigPackage.v_Counter);
- .
TrigPackage.v_Counter := TrigPackage.v_Counter+ 1;
END ClassesBStatement;
CREATE OR REPLACE TRIGGER ClassesAStatementl
AFTER UPDATE ON classes
BEGIN
INSERT INTO temp_table (num_col. char_col)
VALUES (trig'_seq.NEXTVAL,
'After Statement 1: counter = ' | TrigPackage.v_Counter);
- .
TrigPackage.v_Counter := TrigPackage.v_Counter+ 1;
END ClassesAStatementl;
CREATE OR REPLACE TRIGGER ClassesAStatement2
AFTER UPDATE ON classes
BEGIN
INSERT INTO temp_table (num_col, char_col)
VALUES (trig_seq.NEXTVAL,
'After Statement 2: counter = ' || TrigPackage.v_Counter);
- .
TrigPackage.v_Counter := TrigPackage.v_Counter+ 1;
END ClassesAStatement2;
CREATE OR REPLACE TRIGGER ClassesBRowl
BEFORE UPDATE ON classes
FOR EACH ROW
BEGIN
INSERT INTO temp_table (num_col, char_col)
VALUES (trig_seq.NEXTVAL,
'Before Row 1: counter = ' || TrigPackage.v_Counter);
- .
TrigPackage.vJDounter := TrigPackage.v_Counter+ 1;
END ClassesBRowl;
413
. BEFORE AFTER ,
BEFORE AFTER . temp_table, :
) firingOrder.sql
SQL> SELECT * FROM temp_table
2
ORDER BY num_col;
414
11
NUM_COL CHAR_COL
1 Before Statement: counter = 0
Before Row 3 : counter 1
Before Row 2 : counter 2
Before Row 1 : counter 3
2
3
/1
5
6
7
After Row
Before Row
Before Row
8 Before Row
9
10
11
12
13
14
15
16
17
18
19
counter =
3 : counter
2 : counter
1 : counter
5
G
7
, , , .
( 10).
, , . , , . ,
.
_;c;_: Oracle
w
AFTER ROW,
DML
AFTER .
(
Oracle).
"Oracle Server Replication".
, .
, .
: old : new.
(correlation identifier) PL/SQL .
,
415
( ,
PL/SQL), PL/ SQL. PL/ SQL
_ , .
,
:nevf.nojie
: old INSERT,
DELETE : new.
. 'old INSERT : new
DELETE PL/SQL
, NULL.
OracleSz : parent.
, : old : new , : p a r e n t
(. Oracle).
11.2. :old :new
:old
INSERT
UPDATE
DELETE
:new
He
NULL
,
, ,
,
NULL
416
11
student_sequence. ID - students,
:new.ID . */
SELECT student_sequence.NEXTVAL
INTO :new.ID
FROM dual;
END GenerateStudentID;
. ID, , ( ),
. ID, , .
[_| -- GenerateStudentID.sql
INSERT INTO students (ID, first_name, last_name)
VALUES (-7, 'Zelda', 'Zoom');
v_TempRec temp_table%ROWTYPE;
BEGIN
/* , :old . */
417
v_TempRec := :old;
/* , . */
v_TempRec.char_col := :old.char_col;
v_TempRec. num_col := :old.num_col;
END TempDelete;
, : old : new ,
_%7'.
REFERENCING REFERENCING : old : new. ,
WHEN:
REFERENCING [OLD AS _] [NEW AS _]
:old :new :_
:_. , REFERENCING . GenerateStudentID, REFERENCING
:new :new_student:
Q - GenerateStudentID.sql
CREATE OR REPLACE TRIGGER GenerateStudentID
BEFORE INSERT OR UPDATE ON students
REFERENCING new AS new _student
FOR EACH ROW
BEGIN
/* ID students
student_sequence. ID - students,
:new_student.ID . */
SELECT student_sequence.NEXTVAL
INTO :new_student.ID
FROM dual;
END GenerateStudentID;
WHEN
WHEN . WHEN
, , WHEN.
WHEN :
WHEN _
_ , . : new
: old, .
. , CheckCredits
, , , 20:
'Q CREATE OR REPLACE TRIGGER CheckCredits
418
11
CheckCredits :
)
L_
INSERTING
TRUE, INSERT;
FALSE .
UPDATING
TRUE, UPDATE;
FALSE .
DELETING
TRUE, DELETE;
FALSE .
/;
Oracleffi ,
(.
" / ").
LogRSChanges
, registered_students.
, . RS_audit,
:
_| tables.sql
CREATE TABLE RS_audit (
change_type
CHAR(1) NOT NULL,
changed_by
VARCHAR2(8) HOT NULL,
timestamp
DATE
old_student_id NUMBER(5),
old_department CHAR(3),
old_course
old_grade
new_student_id
new_department
new_course
new_grade
419
NOT NULL,
NUMBER(3),
CHAR(1),
NUMBER(5),
CHAR(3),
NUMBER(3),
CHAR(1)
);
LogRSChanges:
|
-- LogRSChanges. sql
() ,
LogRSChanges. Oracle
, ,
. ,
LogRSChanges , , .
( RAISE_APPLICATION_ERROR)
, .
420
11
DML, INSERT, UPDATE DELETE ( , ), DML.
,
DML .
:
,
.
.
. 8.
(modifiable) , DML. , , :
(UNION, UNION ALL, MINUS)
(SUM, AVG ..)
GROUP BY, CONNECT BY START WITH
DISTINCT
, , ,
. , DML,
,
DML , 11.3 (.
"Oracle Concepts"). ,
, .
, .
11.3.
DML
INSERT
, , ,
.
,
.
,
UPDATE
DELETE
421^
11.3 , .
,
(. "Application Developer's Guide Fundamentals").
classes_rooms:
.- insteadOf.sql
CREATE OR REPLACE VIEW classes_rooms AS
SELECT department, course, building, room_number
FROM rooms, classes
WHERE rooms. room_id = classes.room_id;
. , , ,
. ,
classes_rooms DELETE
classes. DML classes_rooms? ,
. , :
INSERT
UPDATE
DELETE
.
classes .
, . classes, rooms,
, classes_rooms
.
. classes : ID
NULL.
DECLARE
v_roomID rooms.room_id%TYPE;
v_UpdatingClasses BOOLEAN := FALSE;
vJJpdatingRooms BOOLEAN := FALSE;
- ,
-- .
422
11
- , ORA-20000.
FUNCTION getRoomID(p_Building IN rooms.building%TYPE,
p_Room IN rooms. room_number%TYPE)
RETURN rooms.room_id%TYPE IS
v_RoomID rooms.room_id%TYPE;
BEGIN
SELECT room_id
INTO v_RoomID
FROM rooms
WHERE building = p_Building
AND room_number = p_Room;
RETURN v_RoomID;
EXCEPTION
WHEN NO_DATA_FOUND THEN
RAISE_APPLICATION_ERROR(-20000, 'No matching room');
END getRoomID;
- , , ,
- p_Department p_Course. ,
- ORA-20001.
PROCEDURE verifyClass(p_Department IN classes.department%TYPE,
p_Course IN classes.course%TYPE) IS
vJDummy NUMBER;
BEGIN
SELECT 0
INTO v_Dummy
FROM classes
WHERE department = p_Department
AND course = p_Course;
EXCEPTION
WHEN NO_DATA_FOUND THEN
RAISE,APPLICATION_ERROR(-20001,
p_0epartment || ' ' || p_Course || ' doesn''t exist');
END verifyClass;
BEGIN
IF INSERTING THEN
- , .
- , (. );
- :
v_RoomID := getRoomID(:new.building, :new.room_number);
- classes .
UPDATE CLASSES
SET room_id = v_RoomID
WHERE department = :new.department
AND course = :new.course;
ELSIF UPDATING THEN
- , : classes rooms.
v_UpdatingClasses := (:new.department != :old.department) OR
(:new.course != :old.course);
v_UpdatingRooms := (:new,building != :old.building) OR
(:new.room_number != :old. room_number);
IF (vJJpdatingClasses) THEN
- .
- , .
verifyClass(:new.department, :new.course);
- .
v_RoomID := getRoomID(:old.building, :old. room_number);
- .
UPDATE classes
SET room_ID = NULL
WHERE department = :old.department
AND course = :old.course;
- , , .
UPDATE classes
SET room_ID = v_RoomID
WHERE department = :new.department
AND course = :new.course;
END IF;
IF vJJpdatingRooms THEN
- .
- . (. ), ,
- classes ;old, :new.
- .
v_RoomID := getRoomID(:new.building, :new.room_number);
- classes .
UPDATE CLASSES
SET room_id = v_RoomID
WHERE department = :old.department
AND course = :old.course;
END IF;
ELSE
- , ,
- .
UPDATE classes
SET room_ID = NULL
WHERE department = :old.department
AND course = :old.course;
END IF;
END ClassesRoomsInstead;
423
424
11
FOR EACH ROW
.
, .
ClassesRoomsInstead DML
.
. 11.1 classes, rooms classes_rooms.
INSERT:
[_| - ClassesRoomsInstead.sql
INSERT INTO classes_rooms
VALUES C M U S ' , 100, 'Music Building', 200);
Dept.
HIS
CS
ECN
CS
HIS
MUS
MUS
ECN
NUT
classes
Course
101
101
203
102
301
410
100
101
307
Room
ID
20000
20001
20002
20003
20004
20005
Room
ID
20000
20001
20002
20003
20004
20005
20007
20008
20006
20007
20008
rooms
Building
Building 7
Building 6
Building 6
Building 6
Building 6
Music
Building
Music
Building
Building 7
Building 7
classes rooms
Course
Building
Room
Number
201
101
150
160
170
100
Department
HIS
CS
ECN
CS
HIS
MUS
101
101
203
102
301
410
200
ECN
NUT
101
307
Building 7
Building 6
Building 6
Building 6
Building 6
Music
Building
Building 7
Building 7
Room
Number
201
101
150
160
170
100
300
310
300
310
Dept.
HIS
CS
ECN
CS
HIS
MUS
MUS
ECN
NUT
classes
Course
101
101
203
102
301
410
100
101
307
Room
ID
20000
20001
20002
20003
20004
20005
20006
20007
20008
Room
ID
20000
20001
20002
20003
20004
20005
20006
20007
20008
rooms
Building
Building 7
Building 6
Building 6
Building 6
Building 6
Music
Building
Music
Building
Building 7
Building 7
classes rooms
Course
Building
Room
Number
201
101
150
160
170
100
Department
HIS
CS
ECN
CS
HIS
MUS
101
101
203
102
301
410
200
ECN
NUT
MUS
101
307
100
300
310
. 11.2.
Building 7
Building 6
Building 6
Building 6
Building 6
Music
Building
Building 7
Building 7
Music
Building
Room
Number
201
101
150
160
170
100
300
310
200
425
[_) ClassesRoomsInstead.sql
UPDATE classes_rooms
SET department = ' N U T ' , course = 307
WHERE building = 'Building 7' AND room_number = 201;
Dept.
classes
Course
HIS
CS
ECN
CS
HIS
MUS
MUS
ECN
HIS
101
101
203
102
301
410
100
101
307
Room
ID
20000
20001
20002
20003
20004
20005
20006
20007
Room
ID
20000
20001
20002
20003
20004
20005
20006
20007
20008
rooms
Building
Building 7
Building 6
Building 6
Building 6
Building 6
Music
Building
Music
Building
Building 7
Building 7
Room
Number
201
101
150
160
170
100
200
Department
classes rooms
Course
Building
HIS
CS
ECN
CS
MUS ,
301
101
203
102
410
ECN
NUT
MUS
101
307
100
300
310
Building 6
Building 6
Building 6
Building 6
Music
Building
Building 7
Building 7
Music
Building
Room
Number
170
101
150
160
100
300
210
200
. 11.3.
classes room_ID ,
Building 6, NULL
(. . 11.4). , DML
rooms ,
classes.
classes
Dept. Course Room
NUT
CS
ECN
CS
HIS
MUS
MUS
ECN
HIS
307
101
203
102
301
410
100
101
101
ID
20000
20005
20006
20007
rooms
Room
ID
20000
20001
20002
20003
20004
20005
20006
20007
20008
Building
Building 7
Building 6
Building 6
Building 6
Building 6
Music
Building
Music
Building
Building 7
Building 7
classes rooms
Room
Number
201
101
150
160
170
100
Department
Course
Building
MUS
410
ECN
NUT
MUS
101
307
100
Music
Building
Building 7
Building 7
Music
Building
200
300
310
. 11.4.
Room
Number
100
300
310
200
426
11
, DML DML ( ), INSERT,
UPDATE DELETE.
: DDL . DDL
CREATE, ALTER DROP, /
, / . :
CREATE [ORREPLACE] TRIGGER [.]_
{BEFORE | AFTER}
[cnucoK_co6umuu_ddl \ ___}
ON {DATABASE | [.]SCHEMA}
[_ WHEN]
_;
cnucoK_co6umuu_ddl DDL (
OR ()), ___
(
OR).
11.4 DDL (BEFORE AFTER).
. TRUNCATE
.
11.4. DDL
STARTUP
AFTER
SHUTDOWN
BEFORE
.
,
.
SERVERERROR
AFTER
LOGON
AFTER
LOGOFF
BEFORE
CREATE
BEFORE, AFTER
DROP
BEFORE, AFTER
ALTER
BEFORE, AFTER
ADMINISTER DATABASE TRIGGER
(. " ").
427
. , .
DATABASE SCHEMA. SCHEMA ,
, . , UserA
:
_| DatabaseSchema.sql
CREATE OR REPLACE TRIGGER LogUserAConnects
AFTER LOGON ON SCHEMA
BEGIN
INSERT INTO example.temp_table
VALUES (1, 'LogUserAConnects fired!');
END LogUserAConnects;
] DatabaseSchema.sql
CREATE OR REPLACE TRIGGER LogUserBConnects
AFTER LOGON ON SCHEMA
BEGIN
INSERT INTO example.temp_table
VALUES (2, 'LogUserBConnects fired!');
END LogUserBConnects;
, example.
LogAllConnects , .
] DatabaseSchena. sql
CREATE OR REPLACE TRIGGER LogAllConnects
AFTER LOGON ON DATABASE
BEGIN
INSERT INTO example. temp_table
VALUES (3. 'LogAllConnects fired! ');
END LogAllConnects;
UserA UserB
(. DatabaseSchema. sql),
SQL*Plus ,
:
] DatabaseSchema.sql
428
11
STARTUP SHUTDOWN
.
, .
,
. (INSERTING,
UPDATING DELETING), . PL/SQL ( ),
.
11.5.
11.5.
SYSEVENT
INSTANCE_NUM
DATABASE_NAME
,
VARCHAR2(20)
.
NUMBER
.
Oracle Real
Application Clusters,
1.
VARCHAR2(50)
.
429
11.5. ()
SERVER ERROR
NUMBER
IS SERVERERROR
BOOLEAN
LOGIN USER
VARCHAR2(30)
DICTIONARY OBJ
TYPE
VARCHAR2(20)
DICTIONARY OBJ
NAME
VARCHAR2(30)
DICTIONARY OBJ
OWNER
VARCHAR2(30)
SERVERERROR
.
,
.
1.
SERVERERROR
TRUE,
Oracle
.
,
.
CREATE, DROP, ALTER ,
DDL,
.
CREATE, DROP, ALTER ,
DDL,
.
CREATE, DROP, ALTER
,
DDL,
.
CREATE USER
ALTER USER
DES
.
SERVERERROR
SERVERERROR , .
SERVER_ERROR. , , , .
DBMS_UTILITY.
FORMAT_ERROR_STACK. ,
PL/SQL.
, :
) LogErrors.sql
CREATE TABLE error_log (
timestamp
username
instance
database_name
error_stack
DATE,
VARCHAR2(30),
NUMBER,
VARCHAR2(50),
VARCHAR2(2000)
430
11
, error_log:
)
-- LogErrors.sql
CREATE OR REPLACE TRIGGER LogErrors
AFTER SERVERERROR ON DATABASE
BEGIN
INSERT INTO error_log
VALUES (SYSDATE, SYS.LOGIN_USER, SYS.INSTANCE_NUM, S Y S .
DATABASE_NAME, DBMSJJTILITY.FORMAT_ERROR_STACK);
END LogErrors;
, LogErrors
. : SQL,
PL/SQL PL/SQL.
) LogErrors.sql
SQL> SELECT * FROM non_existent_table;
SELECT * FROM non_existent_table
ERROR at line 1:
ERROR at line 2:
ORA-06550: line 2, column 15:
PLS-00201: identifier 'NON_EXISTENT_TABLE' must be declared
ORA-06550: line 2, column 3:
PL/SQL: SQL Statement ignored
( 'NON_EXISTENT_TABLE' .
SQL- .)
SQL> BEGIN
2
- !
3 DELETE FROM students
4 END;
5 /
END;
*
ERROR at line 4:
ORA-06550: line 4, column 1:
PLS-00103: Encountered the symbol "END" when expecting one of the
following:
. 9 ; return RETURNING. <an identified
<a double-quoted delimited-identifier> partition where
The symbol ";" was substituted for "END" to continue.
431
( "END", : . @ ; return
RETURNING. <> > partition where.
"END" ";".)
SQL> DECLARE
2
v_StringVar VARCHAR(2);
3 BEGIN
4
-- !
5 v_StringVar := 'abcdef ;
6 END;
7 /
DECLARE
*
ERROR at line 1:
ORA-06502: PL/SQL: numeric or value error: character string
buffer too small
ORA-06512: at line 5
SQL> SELECT *
2
FROM error_log;
TIMESTAMP USERNAME INSTANCE DATABASE
ERROR_STACK
12-OCT-01 EXAMPLE
1 V901
ORA-00942: table or view does not exist
12-OCT-01 EXAMPLE
1 V901
ORA-06550: line 2, column 15:
PLS-00201: identifier 'NON_EXISTENT_TABLE' must be declared
ORA-06550: line 2, column 3:
PL/SQL: SQL Statement ignored
12-OCT-01 EXAMPLE
1 V901
ORA-06550: line 4, column 1:
PLS-00103: Encountered the symbol "END" when expecting one of the
following:
. @ ; return RETURNING_ <an identified
<a double-quoted delimited-identifier> partition where
The symbol ";" was substituted for "END" to continue.
12-OCT-01 EXAMPLE
1 V901
.
,
, .
432
11
COMMIT,
.
WHEN
, DML, WHEN (). , :
STARTUP SHUTDOWN .
ERRNO SERVERERROR
.
LOGON LOGOFF
USERID USERNAME.
DDL
, .
, , ,
, .
. (namespace) , .
,
. , ,
, . ,
.
, ..
, - .
. , major_stats
433
major_stats, major_stats .
SQL*Plus:
-- samename.sql
SQL> -- ,
SQL> -- .
SQL> CREATE OR REPLACE TRIGGER major_stats
2
BEFORE INSERT ON major_stats
3 BEGIN
4
INSERT INTO temp_table (char_col)
VALUES ('Trigger fired! ');
6 END major_stats;
7
Trigger created.
SQL>
SQL>
SQL>
2
3
4
5
-- ,
-- .
CREATE OR REPLACE PROCEDURE major_stats AS
BEGIN
INSERT INTO temp_table (char_col)
VALUES ('Procedure called!');
END major stats;
6 /
CREATE OR REPLACE PROCEDURE major_stats AS
*
ERROR at line 1;
ORA-00955: name is already used by an existing object
( )
, .
, ,
.
(, TRGJ.
,
PL/SQL ( OracleSi
, . ). ,
PL/SQL,
:
: COMMIT, ROLLBACK, SAVEPOINT SET TRANSACTION. PL/SQL ,
, . , , ..
, .
11
434
, ,
,
( OracleSz , ,
, . 4).
, ,
( OracleS ).
LONG
LONG RAW. , : new : old
LONG LONG RAW , .
OracleS
LOB ( ),
. -.
. (constraints),
, (mutating)
(. ).
18 PL/SQL. OracleSz
GALL.
PL/ SQL Java. ,
Java. ,
:
'_] -- tables.sql
CREATE TABLE connect_audit (
user_name
VARCHAR2(30),
operation
VARCHAR2(30),
timestamp
DATE);
:
Q
..- LogPkgl.sql
CREATE OR REPLACE PACKAGE LogPkg AS
PROCEDURE LogConnect(p_UserID IN VARCHAR2);
PROCEDURE LogDisconnect(pJJserIDIN VARCHAR2);
END LogPkg;
CREATE OR REPLACE PACKAGE BODY LogPkg AS
PROCEDURE LogConnect(p_UserID IN VARCHAR2) IS
BEGIN
INSERT INTO connect_audit (user_name, operation, timestamp)
VALUES (p_USerID, 'CONNECT 1 , SYSDATE);
435
END LogConnect;
PROCEDURE LogDisconnect(p_UserIDIN VARCHAR2) IS
BEGIN
INSERT INTO connect_audit (user_name, operation, timestamp)
VALUES (p_USerID, 'DISCONNECT', SYSDATE);
END LogDisconnect;
END LogPkg;
LogConnects LogDisconnects
( ),
ADMINISTER
DATABASE TRIGGER.
LogConnects LogDisconnects CALL,
. .
PL/SQL,
Java. ,
Java:
_| Logger, java
import Java.sql.*;
import oracle.jdbc.driver.*;
public class Logger {
public static void LogConnect(String userlD)
throws SQLException {
// JDBC- .
Connection conn = new OracleDriver().defaultConnection();
String insertString =
"INSERT INTO connect_audit (user_name, operation, timestamp)" +
" VALUES (?, 'CONNECT', SYSDATE)";
// .
436
11
PreparedStatement insertStatement =
conn. prepareStatement(insertString);
insertStatement.setString(1, userlD);
insertStatement.execute();
I
public static void LogDisconnect(String userlD)
throws SQLException {
// JDBC- .
Connection conn = new OracleDriver().defaultConnection();
String insertString =
"INSERT INTO connect_audit (user_name, operation, timestamp)" +
" VALUES (?, 'DISCONNECT', SYSDATE)";
// .
PreparedStatement insertStatement =
conn.prepareStatement(insertString);
insertStatement.setString(1, userlD);
insertStatement.execute();
LogPkg:
rj LogPKg2. sql
CREATE OR REPLACE PACKAGE LogPkg AS
PROCEDURE LogConnect(p_UserID IN VARCHAR2);
PROCEDURE LogDisconnect(p_UserID IN VARCHAR2);
END LogPkg;
CREATE OR REPLACE PACKAGE BODY LogPkg AS
PROCEDURE LogConnect(p_UserID IN VARCHAR2) IS
LANGUAGE JAVA
NAME 'Logge r.LogConnect(j ava.lang.St ring)';
PROCEDURE LogDisconnect(p_UserIDIN VARCHAR2) IS
LANGUAGE JAVA
NAME ' Logger. LogDisconnect(java. lang. String)';
END LogPkg;
(. 12).
437
(. 11.6). , , , . ,
, .
11.6. ,
CREATE TRIGGER
CREATE ANY TRIGGER
.
SYS.
.
,
SYS.
,
CREATE ANY TRIGGER,
.
SYS.
( ).
CREATE TRIGGER
CREATE ANY TRIGGER.
,
. - ,
.
user_triggers.
, WHEN, . ,
UpdateMajorStats:
SQL> SELECT trigger_type, table_name, triggering_event
2
FROM user_triggers
3 WHERE trigger_name = 'UPDATEMAJORSTATS';
TRIGGER TYPE
TABLE NAME TRIGGERING EVENT
AFTER STATEMENT STUDENTS
438
11
user_triggers , . :
all_triggers , ( ),
dba_triggers .
.
, , .
:
DROP TRIGGER _;
_ .
.
OR REPLACE, .
, .
, ,
(DISABLE) . , .
ALTER TRIGGER:
ALTER TRIGGER _ {DISABLE | ENABLE};
(ENABLE)
. ALTER TRIGGER ,
. UpdateMajorStats:
SQL> ALTER TRIGGER UpdateMajorStats DISABLE;
Trigger altered.
SQL> ALTER TRIGGER UpdateMajorStats ENABLE;
Trigger altered.
, ALTER TABLE
,
ENABLE ALL TRIGGERS ( )
DISABLE ALL TRIGGERS ( ). :
SQL> ALTER TABLE students
2 ENABLE ALL TRIGGERS;
Table altered.
SOL> ALTER TABLE students
2
DISABLE ALL TRIGGERS;
Table altered.
status u s e r _ t r i g g e r s
'ENABLED', 'DISABLED', ,
. , DROP.
439
-
,
- . , .. .
,
,
. , .
.
. (mutating table) ,
DML. , . , DELETE CASCADE
( ) , (. "Oracle Server
Reference"). (constraining table) , .
registered_students:
) - tables, sql
CREATE TABLE registered_students (
student_id NUMBER(5)
NOT NULL,
department
CHAR(3)
NOT NULL,
course
NUMBER(3)
NOT NULL,
grade
CHAR(1),
CONSTRAINT rs_grade
CHECK (grade IN ( ' A ' , - B ' , T, ' D 1 , ' E ' ) ) ,
CONSTRAINT rs_student_id
FOREIGN KEY (student_id) REFERENCES students (id),
CONSTRAINT rs_department_course
FOREIGN KEY (department, course)
REFERENCES classes (department, course)
440
11
, .
.
, ,
. .
. ,
(DELETE CASCADE).
INSERT ,
BEFORE AFTER,
,
. ,
. , INSERT
INTO table SELECT ...,
,
.
441
WHERE ID = :new.student_id;
- .
UPDATE classes
SET current_students = current_students + 1
WHERE department = :new.department
AND course = :new.course;
END CascadeRSInserts;
, , , . ,
students BEFORE INSERT
UPDATE:
rj LimitMajors.sql
CREATE OR REPLACE TRIGGER LimitMajors
/* ,
, 5. ,
raise_application_error . */
BEFORE INSERT OR UPDATE OF major ON students
FOR EACH ROW
DECLARE
v_MaxStudents CONSTANT NUMBER := 5;
v_CurrentStudents NUMBER;
BEGIN
- , .
SELECT COUNT()
INTO v_CurrentStudents
FROM students
WHERE major = :new.major;
- , .
IF v_CurrentStudents + 1 > v_MaxStudents THEN
RAISE_APPLICATION_ERROR(-20000,
,
. students , :
Q LimitMajors.sql
SQL> UPDATE students
ERROR at line 1:
442
11
ORA-4091 , LimitMajors
, .
ORA-4091 , .
,
students .
, , .
LimitMaj rs ,
: new. major. ,
. : new. major, students . ,
, .
?
PL/SQL . , . ,
, , .
student_data RLimitMajors nSLimitmajors:
_)
mutating.sql
CREATE OR REPLACE PACKAGE StudentData AS
TYPE t_Majors IS TABLE OF students.majr%TYPE
INDEX BY BINARY_INTEGER;
TYPE t_IDs IS TABLE OF students. ID%TYPE
INDEX BY BINARY_INTEGER;
v_StudentMajors t_Majors;
v_StudentIDs
t_IDs;
v_NumEntries
BINARY_INTEGER := 0;
END StudentData;
CREATE OR REPLACE TRIGGER RLimitMajors
BEFORE INSERT OR UPDATE OF major ON students
FOR EACH ROW
BEGIN
/* StudentData. students
443
, ORA-4091. */
StudentData.v_NumEntries := StudentData.v_NumEntries+ 1;
StudentData.v_StudentMajors(StudentData.v_NumEntries) : =
:new.major;
StudentData.v_StudentIDs( StudentData. v_NumEntries):= :new.id;
END RLimitMajors;
CREATE OR REPLACE TRIGGER SLimitMajors
AFTER INSERT OR UPDATE OF major ON students
DECLARE
vJlaxStudentS
CONSTANT NUMBER := 5;
v_CurrentStudents NUMBER;
v_StudentID
students.ID%TYPE;
v_Major
students.major%TYPE;
BEGIN
/*
, . */
FOR v_Loop!ndex IN 1..StudentData.v_NumEntries LOOP
v_StudentID := StudentData.v_StudentIDs(v_Loop!ndex);
v_Major ;= StudentData.v_StudentMajors(v_Loop!ndex);
-- , .
SELECT COUNT(.)
INTO v_CurrentStudents
FROM students
WHERE major = v_Major;
- , .
IF v_CurrentStudents > vJlaxStudents THEN
RAISE_APPLICATION_ERROR(-20000,
'Too many students for major ' || v_Major ||
' because of student ' || v_StudentID);
END IF;
END LOOP;
- ,
-- .
StudentData.v_NumEntries := 0;
END LimitMajors;
LimitMajors.
. students , ,
:
Q mutating, sql
SQL> UPDATE students
2 SET major = 'History'
3
WHERE ID = 10003;
444
11
1 row updated.
SQL>
2
3
1 row
UPDATE students
SET major = 'History'
WHERE ID = 10002;
updated.
3 WHERE ID = 10009;
UPDATE students
*
ERROR at line 1:
ORA-20000: Too many students of major History because of student 10009
ORA-06512: at "EXAMPLE.SLIMITMAJORS", line 19
ORA-04088: error during execution of trigger 'EXAMPLE.SLIMITMAJORS'
( 1:
ORA-20000: - - 10009
ORA-06512: 19 "EXAMPLE.SLIMITMAJORS"
ORA-04088: 'EXAMPLE.SLIMITMAJORS')
, .
ORA-4091, .
AFTER. PL/SQL.
:
PL/SQL ,
, . ,
, , .
- StudentData. v_NumEntries.
0, .
, UPDATE,
, .
, , SLimitMajors. ,
AFTER, v_CurrentStudents
, ,
. v_CurrentStudents + 1,
LimitMajors, v_CurrentStudents.
445
PL/SQL
. , , UPDATE, ( OracleSz
). PL/SQL , .
PL/SQL Oracle. ,
. OracleS , DML, ,
.
PL/SQL.
12
448
12
3 11 PL/SQL.
.
"OracleS :
PL/SQL" (. "") Oracle.
PL/SQL, . , SQL, (bulk binds),
, ,
.
PL/SQL Oracle SQL. , .
. ,
. Java , .
, , .
OracleS PL/SQL
(, ) DBMSJPIPE
/ DBMS_ALERT. -, OCI (Oracle Call Interface Oracle) .
OracleS
. , , PL/SQL,
PL/SQL.
PL/SQL PL/SQL ( ), .
PL/SQL , . OracleS
( ). OracleS .
PL/SQL AS EXTERNAL.
449
OracleS i Java.
PL/SQL .
( )
PL/SQL. AS LANGUAGE.
(shared) , .
extproc. -,
. ,
.
, - sendMail
:
rj
int sendMail(
char subject,
char message,
char from,
char recipient);
, , /libs/libmail.so, :
:
1_J
AS EXTERNAL
, PARAMETERS
PL/SQL .
SendMailC PL/SQL.
- sendMail, .
450
12
.
,
extproc ( Net8). extproc , LIBRARY, .
Java
Java Java (
Java Oracle).
, ,
PL/SQL . ,
.
, Java :
Qj public class sendMail
{
public static void send (
String subject,
String message,
String from,
String recipient)
PL/SQL , ,
.
PL/SQL:
CREATE OR REPLACE PROCEDURE SendMailJavaC
p_Subject IN VARCHAR2,
p_Message IN VARCHAR2,
p_From IN VARCHAR2,
p_Recipient IN VARQHAR2)
AS LANGUAGE JAVA
NAME Java,
. ,
. ,
S e n d M a i l J a v a
PL/SQL, Java- sendMail. sendQ,
.
, Java
.
Java Java . extproc.
451
SQL
PL/SQL
SQL. , DML
PL/SQL.
SQL. SQL , PL/SQL.
SQL PL/SQL.
DBMS_SQL (. " "). OracleSz SQL.
SQL . , DBMS_SQL.
PL/SQL ,
,
(DML DDL) PL/SQL, EXECUTE IMMEDIATE.
SQL*Plus:
] execlmmediate.sql
SQL> DECLARE
2
v_SQLString VARCHAR2(200);
3
v_PLSQLBlock VARCHAR2(200);
4 BEGIN
*
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
- , . ,
- .
EXECUTE IMMEDIATE
'CREATE TABLE execute_table (call VARCHAR2(10))';
- , .
- .
FOR v_Counter IN 1..10 LOOP
v_SQLString :=
'INSERT INTO execute_table
VALUES ( " R o w ' 11 v_Counter 11 ' " ) ' ;
EXECUTE IMMEDIATE v_SQLString;
END LOOP;
- PL/SQL.
-
- ( ).
v_PLSQLBlock :=
'BEGIN
FOR v_Rec IN (SELECT * FROM execute_table) LOOP
DBMS_OUTPUT.PUT_LINE(v_Rec.call);
END LOOP;
END;';
452
12
28
29
30
31
32
33
- .
EXECUTE IMMEDIATE v_PLSQLBlock;
-- .
EXECUTE IMMEDIATE 'DROP TABLE execute_table-;
34 END;
35 /
Row 1
Row 2
Row 3
Row 4
Row 5
Row 6
Row 7
Row 8
Row 9
Row 10
PL/SQL procedure successfully completed.
EXECUTE
IMMEDIATE: DDL, DML PL/SQL.
, ( CREATE TABLE DROP TABLE) PL/SQL ( INSERT
). ,
DML DDL, .
EXECUTE IMMEDIATE
.
, .
PL/SQL,
USING EXECUTE IMMEDIATE, :
execBind.sql
DECLARE
v_SQLString VARCHAR2(1000);
v_PLSQLBlock VARCHAR2(1000);
CURSOR c_EconMajor IS
SELECT *
FROM students
WHERE major = 'Economies';
BEGIN
- ECN 103 classes,
- SQL.
v_SQLString :=
'INSERT INTO CLASSES (department, course, description,
max_students, current_students,
num_credits)
VALUS(:dep, :course, :descr, :max_s, :cur_s, :num_c)';
453
- INSERT, .
EXECUTE IMMEDIATE v_SQLString USING
'ECN', 103, 'Economics 103', 10, 0, 3;
- Economics .
FOR v_StudentRec IN c_EconMajor LOOP
- SQL, PL/SOL
- USING.
ECECUTE IMMEDIATE
'INSERT INTO registered_students
(student_ID, department, course, grade)
VALUES (:id, :dep, :course, NULL)'
USING v_Studentflec.ID, 'ENC', 103;
- , PL/SQL.
v_PLSQLBlock :=
'BEGIN
UPDATE classes SET current_students = current_students + 1
WHERE department = :d and course = :c;
END; ' ;
EXECUTE IMMEDIATE v_PLSQLBlock USING 'ECN', 103;
END LOOP;
END;
OPEN FOR . , , , PL/SQL, .
,
. USING,
EXECUTE IMMEDIATE. :
| -- NativeDynamic.sql
CREATE OR REPLACE PACKAGE NativeDynamic AS
TYPE t_RefCur IS REF CURSOR;
- students, WHERE,
- .
FUNCTION StudentsQuery(p_WhereClauseIN VARCHAR2)
RETURN t_RefCur;
- students
- .
FUNCTION StudentsQuery2(p_Major IN VARCHAR2)
RETURN t_RefCur;
END NativeDynamic;
CREATE OR REPLACE PACKAGE BODY NativeDynamic AS
- students WHERE
- .
FUNCTION StudentsQuery(p_WhereClause IN VARCHAR2)
454
12
RETURN t_RefCur IS
v_ReturnCursor t_RefCur;
v_SQLStatement VARCHAR2(500);
BEGIN
- WHERE.
v_SQLStatement := 'SELECT * FROM students ' || p_WhereClause;
- ,
OPEN v_ReturnCursor FOR v_SQLStatement;
RETURN v_ReturnCursor;
END StudentsQuery;
- students
- .
FUNCTION StudentsQuery2(p_Major IN VARCHAR2)
RETURN t_RefCur IS
v_ReturnCursor t_RefCur;
v_SQLStatement VARCHAR2(500);
BEGIN
v_SQLStatement := 'SELECT * FROM students WHERE major = :m';
- .
OPEN v_ReturnCursor FOR v_SQLStatement USING p_Major;
RETURN v_ReturnCursor;
END StudentsQuery2;
END NativeDynamic;
NativeDynamic :
| NativeDynamic. sql
SQL> DECLARE
2
vJStudent students%ROWTYPE;
3
v_StudentCur NativeDynamics.t_RefCur;
4 BEGIN
5
- StudentQuery,
6
-- ID
7
v_StudentCur :=
8
NativeDynamic.StudentsQueryCWHERE MOD(id, 2) = 0');
9
10
11
12
13
14
15
16
17
18
19
-
DBMS_OUTPUT.PUT_LINE('The following students have even IDs: ');
LOOP
FETCH v_StudentCur INTO v_Student;
EXIT WHEN v_StudentCur%NOTFOUND;
DBMS_OUTPUT.PUT_LINEC ' 1 1 v_Student.id | | ':
v_Student.first_name 1 1
v_Student.last_name);
END LOOP;
CLOSE v_StudentCur;
20
21
- StudentsQuery2,
22
23
455
v_StudentCur :=
NativeDynamic.StudentsQuery2(' Music');
24
25 -
26 DBMS_OUTPUT.PUT_LINE(
27
'The following students are music majors:');
28 LOOP
29
FETCH v_StudentCur INTO v_Student;
30
EXIT WHEN v_StudentCur%NOTFOUND;
31
DBMS_OUTPUT.PuT_LINE(' ' || v_Student.id || ': ' ||
32
v_Student.first_name 1 1 ' ' I I
33
v_Student.last_name);
34 END LOOP;
35 CLOSE v_StudentCur;
36 END;
37 /
The following students have even IDs:
10000: Scott Smith
10002: Joanne Junebug
10004: Patrick Poll
10006: Barbara Blues
10008: Ester Elegant
10010: Rita Razmataz
The following students are music majors:
10007: David Dinsmore
10009: Rose Riznit
PL/SQL procedure successfully completed.
EXECUTE IMMEDIATE EXECUTE IMMEDIATE , .
(. ) . ,
. :
| - NativeDynamic.sql
SQL> DECLARE
2
v_SQLQuery VARCHAR2(200);
3 v_Class classes%ROWTYPE;
4 v_Description classes.description%TYPE;
5 BEGIN
6
-
7 v_SQLOuery :=
8
'SELECT description ' 1 1
9
' FROM classes ' 1 1
10
' WHERE department = "ECN"' ||
11
'AND course = 203';
12
13 EXECUTE IMMEDIATE v_SQLQuery
14
INTO v_Description;
456
12
15
16
17
18 - ,
19 v_SQLQuery :=
20
'SELECT * ' 1 1
21
' FROM classes ' 1 1
22
' WHERE description = idescription';
23
EXECUTE IMMEDIATE v_SQLQuery
24
INTO v_Class
25
USING v.Description;
26
27 DBMS_OUTPUT.PUT_LINE(
28
'Fetched ' || v_Class.department || ' ' || v_Class.course);
29
30
- , ORA-1422.
31 v_SQLQuery := 'SELECT * FROM classes';
32
EXECUTE IMMEDIATE v_SQLQuery
33
INTO v_Class;
34 END;
35 /
Fetched Economics 203
Fetched ECN 203
DECLARE
*
ERROR at line 1:
ORA-01422: exact fetch returns more than requested number of rows
ORA-06512: at line 32
ORA-1422 ,
.
SQL PL/SQL
SQL,
PL/SQL ( ). ,
,
PL/SQL, FOR
SQL.
PL/SQL SQL .
OracleSz
SQL ,
. ,
FORALL, :
]
~ FORALL.sql
DECLARE
457
- 1000 .
PrintTotalRowsCAfter first insert');
501 1000.
FORALL v_Count IN 501..1000
INSERT INTO temp_table VALUES
(v_Numbers(v_count), v_Strings(v_Count));
- 1500 .
PrintTotalRowsC'After second insert');
.
FORALL v_Count IN 1..1000
UPDATE tempjtable
SET char_col = 'Changed!'
WHERE num_col = v_Numbers(v_Count);
- , 1000 ,
- 1500 , WHERE
- 2 500 .
DBMS_OUTPUT.PUT_LINE(
'Update processed ' || SQL%ROWCOUNT || 'rows.');
458
12
, DELETE 300 .
FORALL V_Count IN 401..600
DELETE FROM tempjtable
WHERE nun_col = v_Numbers(v_Count);
- 1200 .
PrintTotalRowsCAfter delete');
END;
. :
[j| After first insert: Count is 1000
After second insert: Count is 1500
Update processed 1500 rows.
After delete: Count is 1200
, FORALL FOR.
INSERT, DELETE UPDATE. FORALL
,
.
DML
, . . OCI . :
) - .FORALL.sql
SQL> DECLARE
2
TYPE t_Strings IS TABLE OF temp_table.char_col%TYPE
3
INDEX BY BINARY_INTEGER;
4
TYPE t_Numbers IS TABLE OF temp_table. num_col%TYPE
5
INDEX BY BINARY_INTEGER;
6
v_Strings t_Strings;
7
v_Numbers t_Numbers;
8 BEGIN
10
11
12
13
14
15
16
17
18
19
20
21
22
- .
23
24
25
26
27
28
29
30
31
32
459
- ,
- 5 .
FORALL v_Count IN 1..10
UPDATE temp_table
SET char_col = char_col 1 1 v_Strings(v_Count)
WHERE num_col = V_Nunbers(v_Count);
EXCEPTION
WHEN OTHERS THEN
DBMS_OUTPUT. PUT_LINE('Got exception: ' ||SQLERRM);
COMMIT;
33 END:
34 /
2
3
FROM temp_table
ORDER BY num_col;
CHAR_COL
1-23456789012345678901234567890123456789012345678901234567890
123456789012345678901234567890123456789012345678901234567890
123456789012345678901234567890123456789012345678901234567890
123456789012345678901234567890123456789012345678901234567890
123456789012345678901234567890123456789012345678901234567890
123456789012345678901234567890
123456789012345678901234567890
123456789012345678901234567890
123456789012345678901234567890
123456789012345678901234567890
10 row selected
Oracle9z FORALL
SAVE EXCEPTIONS. , , , .
SQL%BULK_EXCEPTIONS, PL/SQL.
SQL*Plus:
Q FORALL. sql
SQL> DECLARE
2
3
4
5
6
7
8
460
9 BEGIN
10
- .
11 DELETE FROM temp_table;
12 FOR v_Count IN 1. .10 LOOP
13
v_Strings(v_Count) := '1234567890123456789012345678901;
14
v_Numbers(v_Count) := v_Count;
15 END LOOP;
16
17 FORALL v_Count IN 1.. 10
18
INSERT INTO temp_table (num_col, char_col)
19
VALUES (v_Numbers(v_Count), v_Strings(v_Count));
20
21
- t_Strings(6).
22 v_Strings(6) := v_Strings(6) || 'a';
23
24
- ,
25
- .
26 FORALL v_Count IN 1..10 SAVE EXCEPTIONS
27
UPDATE tempjtable
28
SET char_col = char_col 1 1 v_Strings(v_count)
29
WHERE num_col = v_Numbers(v_Count);
30 EXCEPTION
31 WHEN OTHERS THEN
32
DBMS_OUTPUT.PUT_LINECGot exception: ' || SQLERRM);
33
-- .
34
v_NumErrors := SQL%BULK_EXCEPTIONS.COUNT;
35
DBMS_OUTPUT.PUT_LINE(
36
' Number of errors during processing: ' || v_NumErrors);
37 FOR v_Count IN 1. .v_NumErrors LOOP
38
DBMS_OUTPUT.PUT_LINECError ' || v_Count || ' , iteration ' ||
39
SQL%BULK_EXCEPTIONS(v_Count).error_indexil 'is: ' ||
40
SQLERRM(0 - SQL%BULK_EXCEPTIONS(v_Count).error_code));
41 END LOOP;
42
43 COMMIT;
44 END;
45 /
Got exception: ORA-24381: error(s) in array DML
Number of errors during processing: 1
Error 1, iteration 6 is: ORA-01401: inserted value too large for column
PL/SQL procedure successfully completed.
SQL> -- , 1 - 5 7 - 10
SQL> -- , , 6 .
SQL> SELECT char_col
2 FROM temp_table
3 ORDER BY num_col;
CHAR_COL
123456789012345678901234567890123456789012345678901234567890
461
123456789012345678901234567890123456789012345678901234567890
123456789012345678901234567890123456789012345678901234567890
123456789012345678901234567890123456789012345678901234567890
123456789012345678901234567890123456789012345678901234567890
123456789012345678901234567890
123456789012345678901234567890123456789012345678901234567890
123456789012345678901234567890123456789012345678901234567890
123456789012345678901234567890123456789012345678901234567890
123456789012345678901234567890123456789012345678901234567890
10 row selected.
BULK COLLECT
FORALL DML.
BULK COLLECT.
SELECT INTO, FETCH INTO
RETURNING INTO. BULK COLLECT , :
] BULK_COLLECT. sql
DECLARE
TYPE tjlumbers IS TABLE OF temp_table.num_col%TYPE;
TYPE t_Strings IS TABLE OF temp_table. char_col%TYPE;
v_Numbers t_Numbers := t_Numbers(1);
v_String t_Strings := t_Strings(1);
v_Numbers2 t_Numbers;
v_Strings2 t_Strings;
CURSOR c_char IS
SELECT char_col
FROM tempjtable
WHERE num_col > 800
ORDER BY nuin_col;
BEGIN
- .
v_Numbers.EXTEND(1500);
v_Strings.EXTEND(1500);
FOR v_Count IN 1..1000 LOOP
v_Numbers.(v_Count) := v_Count;
v_Strings(v_Count) := 'Elements' || v_Count;
IF v_Count > 500 THEN
v_Numbers(v_Count + 500) := v_Count;
v_Strings(v_Count + 500) := 'Element' || v_Count;
END IF;
END LOOP;
DELETE FROM temp_table;
FORALL v_Count IN 1..1500
INSERT INTO temp_table(num_col, char_col)
462
12
- .
SELECT num_col, char_col
BULK COLLECT INTO v_Numbers, v_Strings
FROM tempjtable
ORDER BY num_col;
DBMS_OUTPUT.PUT_LINE(
'First query fetched ' || v_Numbers.COUNT || ' rows');
- ,
- BULK COLLECT .
SELECT num_col
BULK COLLECT INTO v_Numbers2
FROM tempjtable;
DBMS_OUTPUT.PUT_LINE(
'Second query fetched ' || v_Numbers2. COUNT || ' rows');
- .
OPEN c_char;
FETCH c_char BULK COLLECT INTO v_Strings2;
CLOSE c_char;
DBMS_OUTPUT.PUT_LINE(
'Cursor fetch retrieved ' || v_Strings2.COUNT || ' rows');
END;
:
FJ First query fetched 1500 rows
Second query fetched 1500 rows
Cursor fetch retrieved 400 rows
PL/SQL procedure successfully completed.
BULK COLLECT
(SELECT INTO), (FETCH INTO).
, 1,
,
.
BULK COLLECT RETURNING INTO BULK COLLECT
RETURNING INTO
DML,
:
) - BULK_COLLECT. sql
SQL> DECLARE
2 TYPE t_Numbers IS TABLE OF temp_table. num_col%TYPE
3
INDEX BY BINARY_INTEGER;
4
TYPE t_Strings IS TABLE OF temp_table.char_col%TYPE
5
INDEX BY BINARY_INTEGER:
6 v_Numbers t_Numbers;
7
v_Strings t_Strings;
463
8 BEGIN
9 - , 55 .
10
- t_Numbers.
11 DELETE FROM tem_table;
12 FOR v_0uter IN 1. .10 LOOP
13
FOR v_Inner IN 1. .v_0uter LOOP
14
INSERT INTO temp_table (num_col, char_col)
15
VALUES (v_0uter, 'Element' | | v_Inner);
16
END LOOP;
17
v_Numbers(v_Outer) := v_0uter;
18 END LOOP;
19
20
- , .
21 FORALL v_Count IN 1..5
22
DELETE FROM temp_table
23
WHERE num_col = v_Numbers(v_Count)
24
RETURNING char_col BULK COLLECT INTO v_Strings;
25
26
- v_Strings 15 , 1+2+3+4+5.
27 DBMS_OUTPUT.PUT_LINE('After delete:');
28 FOR v_Count IN 1. . v_Strings.COUNT LOOP
29
DBMS_OUTPUT. PUT_LINE(
30
' v_Strings(' | v_Count [| ') = ' || v_Strings(v_Count));
31
END LOOP;
32 END;
33 /
After delete:
v_Strings(1) = Element #1
v_Strings(2) = Element #1
v_Strings(3) = Element #2
v_Strings(4) = Element #1
v_Strings(5) = Element #2
v_Strings(6) = Element #3
v_Strings(7) = Element #1
v_Strings(8) = Element #2
v_Strings(9) = Element #3
v_Strings(10) = Element #4
v_Strings(11) = Element #1
v_Strings(12) = Element #2
v_Strlngs(13) = Element #3
v_Strings(14) = Element #4
v_Strings(15) = Element #5
PL/SQL procedure successfully completed.
PL/SQL OracleS
. OracleS Oracle? . . , Point, :
464
12
] Point. sql
CREATE OR REPLACE TYPE Point AS OBJECT (
- .
NUMBER;
NUMBER;
- '(, )'.
MEMBER FUNCTION ToString RETURN VARCHAR2,
PRAGMA RESTRICT_REFERENCES(ToString, RNDS, WNDS, RNPS, WNPS),
- Point (SELF).
- , (, ).
MEMBER FUNCTION Distance(p IN Point DEFAULT Point(0, 0))
RETURN NUMBER
PRAGMA RESTRICT_REFERENCES( Distance, RNDS, WNDS, RNPS, WNPS),
- Point.
MEMBER FUNCTION Plus(p IN Point) RETURN Point;
PRAGMA RESTRICT_REFERENCES(Plus, RNDS, WNDS, RNPS, WNPS),
- Point * n
MEMBER FUNCTION Times(n IN NUMBER) RETURN Point,
PRAGMA RESTRICT_REFERENCES(Times, RNDS, WNDS, RNPS, WNPS)
CREATE OR REPLACE TYPE BODY Point AS
- '(, )'.
MEMBER FUNCTION ToString RETURN VARCHAR2 IS
v_Result VARCHAR2(20);
v_xString VARCHAR2(8) := SUBSTR(TO_CHAR(x), 1, 8);
v_yString VARCHAR2(8) := SUBSTR(TO_CHAR(y), 1, 8);
BEGIN
v_Result := '(' I I x_vString || ', ';
v_Result := v_Result || v_yString || ')';
RETURN v_Result;
END ToString;
- Point (SELF).
- , (, ).
MEMBER FUNCTION Distance(p IN Point DEFAULT Point (0,0))
RETURN NUMBER IS
BEGIN
RETURN SQRT(POWER(x - p.x, 2) + POWER(y - p.y, 2));
END Distance;
- Point.
MEMBER FUNCTION Plus(p IN Point) RETURN Point IS
v_Result Point;
BEGIN
v_Result := Point(x + p.x, + p.y);
RETURN v_Result;
END Plus;
465
- Point * .
MEMBER FUNCTION Times(n IN NUMBER) RETURN Point IS
v_Result Point;
BEGIN
v_Result := Point(x * n, * n);
RETURN v_Result;
END Times;
END;
Point . :
,
. , .
, , PL/SQL. , ToString, Distance, Plus
Times, PL/SQL, MEMBER.
PL/SQL,
.
, SQL*Plus:
rj Point, sql
SQL> DECLARE
2 v_Point1 Point := Point(1, 2);
3 v_Point2 Point;'
4 v_Point3 Point;
5 BEGIN
6 v_Point2 := v_Point1.Times(4);
7 v_Point3 := v_Point1.Plus(v_Point2);
8 DBMS_OUTPUT.PUT_LINECPoint 2: ' 1 1 v_Point2.ToString);
9 DBMSJXJTPUT. PUT_LINEf Point 3: ' | | v_Point3.ToString);
10 DBMSJHJTPUT.PUT_LINE('Distance between origins and point 1: ' ||
11
v_Point1.Distance);
12 DBMS.OUTPUT. PUT_LINEf Distance between point 1 and point 2: ' ||
13
v_Point1.Distance(v_Point2));
14 END;
15 /
Point 2: (4, 8)
Point 3: (5, 10)
Distance between origin and point 1:
2.23606797749978969640917366873127623544
Distance between point 1 point 2:
6.70820393249936908922752100619382870632
PL/SQL procedure successfully completed.
466
12
, ,
. .
SQL. , ,
. , SQL :
j_j - PointSQL.sql
SQL> CREATE TABLE point_object_tab OF Point;
Table created.
SQL> CREATE TABLE point_column_tab (
2
key VARCHAR2(20),
3
value Point);
Table created.
SQL>
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
28
29
30
31
DECLARE
v_Point Point ;= Point(1, 1);
v_NewPoint Point;
v_Key point_column_tab.ket%TYPE;
v_XCoord NUMBER;
v_YCoord NUMBER;
BEGIN
- .
INSERT INTO point_object_tab VALUES (v_Poi,nt);
INSERT INTO point_column_tab VALUES ('My Point', v_Point);
-
- , .
SELECT *
INTO v_XCoord, v_YCoord
FROM point_object_tab;
DBMS_OUTPUT.PUT_LINE('Relational query of object table: ' ||
v_XCoord || ', ' || v_YCoord);
- VALUE,
- .
SELECT VALUE(ot)
INTO v_NewPoint
FROM point_object_tab ot;
DBMS_OUTPUT.PUT_LINECobject table; ' | | v_NewPoint.ToString);
-
- .
SELECT key, velue
INTO v_Key, vJJewPoint
FROM point_column_tab;
32
467
33
34 END;
35 /
468
12
31 END;
32 /
(LOB, large object) , ,
. Oracle
? Oracle? VARCHAR2
2000 . , VARCHAR2
, . LONG 2
, a LONG RAW . LONG
LONG RAW Oracle?
LOB. LONG LONG
RAW , , LONG LONG RAW.
, LONG
LONG RAW Oracle Call,
LONG DBMS_SQL. LONG LONG DATA ,
.
Oracle? LOB.
OracleS LONG LONG RAW (
), VARCHAR2 4000 . . , OracleS
LOB. LOB, : CLOB, NCLOB, BLOB
BFILE (. 12.1).
12.1. LOB
LOB
CLOB
LONG Oracle?, CLOB ,
.
NCLOB NCLOB
. Oracle8/ NCLOB
.
BLOB
LONG RAW Oracle?, BLOB
, .
BFILE
BFILE ,
Oracle. LOB,
BFILE , Oracle.
. BFILE
Oracle.
469
6 );
Table created.
SQL> -- INSERT .
SQL> INSERT INTO lobdemo (key, clob_lob, blob.col, bfile_col)
2 VALUES (50, 'This is a character literal',
3
HEXTORAW('FEFEFEFEFEFEFEFEFE'),
4
NULL);
1 row created.
470
12
1 row created.
SQL> -- INSERT .
SQL> -- 50 51 60 61.
SOL> INSERT INTO lobdemo
2
SELECT key + 10, clob_col, blob_col, NULL
3
FROM lobdemo
4
WHERE key IN (50, 51);
2 rows created.
SQL> -- blob_col .
SQL> UPDATE lobdemo
2
SET blob_col = HEXTORAWCCDCDCDCDCOCDCDCDCDCD')
3
WHERE key IN (60, 61);
2 rows updated.
SQL> -- , 61.
SQL> DELETE FROM lobdemo
2 WHERE key = 61;
1 row deleted.
, LOB ,
VARCHAR2 RAW,
4000 (
VARCHAR2).
.
PL/SQL REF CURSOR, . REF
CURSOR , .
,
. OracleQ . (
)
SQL, .
, , . ,
, . ,
20 :
) pipelined.sql
CREATE TYPE MyType AS OBJECT (
fieldl NUMBER,
471
field2 VARCHAR2(50));
CREATE TYPE MyTypeList AS TABLE OF MyType;
CREATE OR REPLACE FUNCTION PipelineMe(
RETURN MyTypeList PIPELINED AS
v_MyType MyType;
BEGIN
FOR v_Count IN 1..20 LOOP
v_MyType := MyType(v_Count, 'Row ' | v_Count);
PIPE ROW(v_MyType);
END LOOP;
RETURN;
END PipeLineMe;
. PIPE ROW . RETURN.
SQL TABLE:
Q - pipelined.sql
SQL> SELECT *
2
FROM TABLE (PipelineMe);
FIELD1 FIEL02
Row 1
2 Row 2
3 Row 3
4
5
6
7
8
9
10
11
Row 4
Row 5
Row 6
Row 7
Row 8
Row 9
Row 10
Row 11
12 Row 12
13 Row
Row
Row
Row
17 Row
18 Row
19 Row
20 Row
14
15
16
13
14
15
16
17
18
19
20
20 rows selected.
, . .
472
12
PL/SQL , , . ,
.
.
DBMS_SQL
DBMS_SQL SQL PL/SQL.
,
SQL ( 18 ).
DBMS_SQL
, , . DBMS_SQL.
Q - dynamicDML sql
CREATE OR REPLACE PROCEDURE UpdateClasses(
/* DBMS_SQL ,
- .
*/
p_Department IN classes.department%TYPE,
p_NewCredits IN classes. num_credits%TYPE,
p_RowsUpdated OUT INTEGER) AS
v_CursorID INTEGER;
vJJpdateStmt VARCHAR2(100);
BEGIN
- .
v_CursorID := DBMS_SQL.OPEN_CURSOR;
- SQL.
v_UpdateStmt :=
'UPDATE classes
SET num_credits = :nc
WHERE department = :dept';
- .
DBHS_SQL.PARSE(v_CursorID, vJjpdateStrat, DBMS_SQL.NATIVE);
- p_NewCredits :.
- BIND_VARIABLE p_NewCredits NUMBER,
- .
DBMS_SQL.BIND._VARIABLE(v_CursorID, ':nc', p_NewCredits);
- p_Department :dept.
- BIND_VARIABLE p_Department CHAR, .
DBMS_SQL.BIND_VARIABLE_CHAR(v_CursorID, ':depf, p_Department);
-
473
p_RowsUpdated := DBMS_SQL.EXECUTE(v_CursorID);
-
DBMS_SQL.CLOSE_CURSOR(v_CursorID);
EXCEPTION
RAISE;
END UpdateClasses;
DBMS_PIPE
DBMS_PIPE , .
, .
PL/SQL , . , DBMS_PIPE
*.
, .
(pipe)
. , , , , ROLLBACK. ,
.
, , .
. , SQL*Plus :
rj PipeSend.sql
DECLARE
v_PipeName VARCHAR2(30) := 'MyPipe';
v_Status INTEGER;
BEGIN
- . ,
varchar2.
DBMS_PIPE.PACK_MESSAGE(SYSDATE);
DBMS_PIPE.PACK_MESSAGE(123456);
474
12
, , , MyPipe. ( )
SQL*Plus, , :
Q "~ PipeReceive.sql
DECLARE
END;
DBMS_PIPE ,
VARCHAR2, NUMBER, DATE, RAW ROWID.
DBMS_PIPE.
Oracle Advanced Queuing.
DBMS_ALERT
DBMS_PIPE, DBMS_ALERT
, . :
(alert) . ,
COMMIT. ,
.
. ,
. , , .
475
,
. .
, .
,
.
DBMS_ALERT.SIGNAL:
- AlertSend.sql
DECLARE
v_AlertName VARCHAR2(30) := 'MyAlerf;
BEGIN
- SIGNAL.
DBMS_ALERT.SIGNAL(v_AlertName, 'Alert! Alert! Alert!');
- , COMMIT.
COMMIT;
END;
END IF;
END;
UTL_FILE
PL/SQL
; SQL.
UTL_FILE PL/SQL
.
, ,
(, NFS).
476
12
UTL_FILE , .
.
:
, Oracle.
UTL_FILE_DIR init.ora.
UTL_FILE_DIR
(*), , .
. :
- UTL_FILE.sql
DECLARE
v_FileHandle UTL_FILE.FILE_TYPE;
BEGIN
- /tmp7utl_file.txt .
- , .
- , .
v_FileHandle := UTL.FILE.FOPENC/tmp/1, 'utl_file.txt', 'w');
- .
UTL_FILE.PUT._LINE(v_FileHandle, 'This is line 1);
FOR v_Counter IN 2..11 LOOP
UTL_FILE.PUTF(v_FileHandle, 'This is line Xs!\n', v_Counter);
END LOOP;
- .
UTL_FILE. FCLOSE(v_FileHandle);
END;
/tmp7utl_file.txt
:
This
This
This
This
This
This
This
This
This
This
This
is line 1!
is line 2!
is line 3!
is line 4!
is line 5!
is line 6!
is line 7!
is line 8!
is line 9!
is line 10!
is line 11!
UTL_FILE
. , UTL_FILE .
477
UTLJTCP
UTL_FILE, UTLJTCP PL/SQL
. UTLJTCP
, TCP. UTL_TCP
HTTP :
PJ - UTL_TCP,sql
DECLARE
v_Connection UTLJCP.CONNECTION;
v_NumWritten PLS_INTEGER;
BEGIN
- 80, HTTP.
v_Connection := UTL_TCP.OPEN_CONNECTION('www.oracle.com', 80);
- HTTP,
v_NumWritten := UTL_TCP.WRITE_LINE(v_Connection, 'GET /HTTP/1.01);
v_NumWritten := UTL_TCP.WRITE_LINE(v_Connection);
- 10 .
BEGIN
FOR v__Count IN 1. . 10 LOOP
DBMS_OUTPUT.PUT_LINE(UTL_TCP.GET_LINE(v_Connection, TRUE));
END LOOP;
EXCEPTION
WHEN UTL_TCP.END_OF_INPUTTHEN
NULL;
END;
UTL_TCP.CLOSE_CONNECTION(v_Connection);
END;
UTL_SMTP
UTL_SMTP UTL_TCP SMTP, e-mail.
SMTP . :
]
-- UTL_SMTP.sql
DECLARE
v_FromAddr VARCHAR2(50) := 'Oracle';
v_ToAddr VARCHAR2(50) := 'YOUR_EMAIL_ADDRESS';
v_Message VARCHAR2(200);
- SMTP. Unix 'localhost'.
vJlailHost VARCHAR2(50) := 'localhosf ;
v MailConnection UTL_SMTP.Connection;
478
12
BEGIN
- . (from, subject ..)
- ,
-- CHR(10).
v_Message :=
'From: ' || v_FromAddr || CHR(10) ||
'Subject: Hello from PL/SQL1 || CHR(10) ||
'This message sent to you courtesy of the UTL_SMTP package.';
- .
v_MailConnection := UTL_SMTP.OPEN_CONNECTION(v..MailHost);
- SMTP, e-mail.
UTL_SMTP.HELO(v_MailConnection, v_MailHost);
UTL_SMTP.MAIL(v_MailConnection, v_FromAddr);
UTL_SMTP.RCPT(v_MailConnection, v_ToAddr);
UTL_SMTP.DATA(v_MailConnection, v_Message);
- .
UTL_SMTP.QUIT(v_MailConnection);
END;
UTL_SMTP e-mail
SMTP; SMTP.
UTL_HTTP
UTLJHTTP HTTP PL/SQL
HTTP ( Web). UTL_HTTP OracleS (
). HTTP
( UTLJHTTP.REQUEST)
( UTLJHTTP.REQUEST J?IECES).
:
] - UTL_HTTP.sql
CREATE TABLE http_results (
sequence_no NUMBER PRIMARY KEY,
piece VARCHAR2(2000));
DECLARE
v_Result UTL_HTTP.HTML_PIECES;
vJJRL VARCHAR2(100) := 'http://www.oracle.com';
v_Proxy VARCHAR2(100) := 'YOUR_PROXY_SERVER';
BEGIN
- UTL_HTTP
- 8.0.6. 10 ,
- 2000 .
v_Result := UTL_HTTP.REQUEST_PIECES(v_URL, 10, v_Proxy);
FOR v_Count IN 1..10 LOOP
INSERT INTO http_results VALUES (v_Count, v_Result(v_Count));
END LOOP;
479
END;
UTLJNADDR
UTL_INADDR GET_HOST_ADDRESS,
IP- . GET_HOST_NAME
.
Oracle9 GET_HOST_NAME IP- .
UTLJNADDR:
- UTL_INADDR.sql
DECLARE
END;
DBMS_JOB
DBMS_JOB PL/SQL , UNDC- .
Oracle. , in it. :
JOB_QUEUE_PROCESSES
. 0 ,
.
JOB_QUEUE_INTERVAL , ,
.
JOB_QUEUE_INTERVAL .
, Templnsert:
- DBMS_JOB.sql
CREATE SEQUENCE temp_seq
START WITH 1
INCREMENT BY 1;
CREATE OR REPLACE PROCEDURE Templnsert AS
BEGIN
480
12
Templnsert 90 SQL*Plus:
Q
DBMS_JOB.sql
SQL> VARIABLE v_JobNum NUMBER
SQL> BEGIN
2
DBMS_JOB,SUBMIT(:v_JobNura, 'Teraplnsert;', SYSDATE,
3
'SYSDATE+ (90/(24*60*60))');
COMMIT;
5 END;
6
SUBMIT .
90 'SYSDATE + (90/(24*60*60))', .
, COMMIT , , Templnsert. , ,
, .
,
. ,
DBMSJOB.REMOVE:
DBMS_JOB.sql
BEGIN
DBMS_JOB.REMOVE(:v_JobNum);
COMMIT;
END;
DBMSJ.OB
PL/SQL LOB DBMSJLOB. , CLOB,
NCLOB, BLOB BFILE. DBMS_LOB LOB, LOB, LOB , LOB, INSTR SUBSTR,
481
482
12
- .
- , - .
v_InputOffset := 1;
v_0utput0ffset := v_LOBLength + 1;
- LOB LOB.
LOOP
- , ..
- v_InputOffset v_LOBLength.
EXIT WHEN vJnputOffset > v_LOBLength;
- LOB p_ChunkSize,
- . , .
IF (v_LOBLength - v_InputOffset + 1) > p_ChunkSize THEN
v_CurrentChunkSize := p_ChunkSize;
ELSE
v_CurrentChunksize := v_LOBLength - v_InputOffset + 1;
END IF;
- .
vJMputOffset := v_0utput0ffset - v_CurrentChunksize;
- .
DBMS_LOB.COPY(p_OutputLocator,
p_InputLocator,
v_CurrentChunksize,
v_0utput0ffset,
v_InputOffset);
- .
v_InputOffset := v_InputOffset + v_CurrentChunkSize;
END LOOP;
END ReverseLOB;
SQL*Plus ReverseLOB:
|
- DBMS_LOB.sql
SQL> CREATE TABLE lobdemo (
2
key NUMBER;
3 clob_col CLOB;
4 blob_col BLOB);
Table created.
2 VALUES (4, EMPTY_CLOB());
1 row created.
SQL> INSERT INTO lobdemo(key, clob_col)
2 VALUES (5, EMPTY_CLOB());
1 row created.
SQL> INSERT INTO lobdemo(key, clob_col)
2 VALUES (6, EMPTY_CLOB(;
1 row created.
SQL> COMMIT;
Commit complete.
SQL> SELECT key, clob_col
2
FROM lobdemo
3 WHERE key BETWEEN 1 AND 6
4 ORDER BY key;
KEY CLOB COL
1 abcdefghijklmnopqrstuvwxyz
2
3
4
5
6
6 rows selected.
SQL> DECLARE
2 v_Source CLOB;
3 v_Destination CLOB;
4 v_Key NUMBER;
5 CURSOR ^Destinations IS
6
SELECT key, clob_col
7
FROM lobdemo
8
WHERE key BETWEEN 2 and 6
9
FOR UPDATE;
10 BEGIN
11 SELECT clob_col
12
INTO v_Source
13
FROM lobdemo
14
WHERE key = 1;
15
16 - 2 - 6 1
17 - .
18 OPEN ^Destinations;
19 LOOP
20
FETCH c_Destinations INTO v_Key, v_Destination;
21
EXIT WHEN c_Destinations%NOTFOUND;
22
23
IF (v_Key = 2) THEN
24
ReverseLOB(v_Source, v_Destination, 4);
25
ELSIF (v_Key = 3) THEN
26
ReverseLOB(v_Source, v_Destination, 2);
483
484
12
27
28
29
30
31
32
33
END IF;
34
END LOOP;
35
CLOSE ^Destinations;
36
COMMIT;
37 END;
38 /
PL/SQL, :
.
PL/SQL . , SQL, , .
DBMS_SQL, DBMS_PIPE, DBMS_ALERT,
UTL_FILE, UTL_TCP, UTL_SMTP, UTL_HTTP, UTLJNADDR,
DBMS JOB DBMS_LOB.
488
,
PL/SQL.
PL/SQL , .
SYS, , , SYS
. , SYS, EXECUTE . catproc.sql,
$ORACLE_HOME/rdbms/admin. Oracle. , ,
catproc. sql.
.
, , .
"Oracle 8 : PL/SQL" (. ""), " Oracle".
DBMS_ALERT
7.3
DBMS_ALERT
, . (alerts) , .. . SIGNAL,
WAITONE WAITANY. ,
REGISTER.
dbms_alert_info.
DBMS_APPLICATION_INFO
7.3
DBMS_APPLICATION_INFO (info)
v$session. , (applications)
. , DBMS_APPLICATION_INFO
module, action
client_info v$session .
489
DBMS_AQ
OracleS
DBMS_AQ
,
Oracle/AQ. OracleS Java
Oracle/AQ. AQ
.
DBMS_AQADM
OracleS
DBMS_AQADM
AQ. .
DMBS_AQELM
19
DMBS_AQELM AQ no e-mail HTTP.
, , , e-mail
HTTP.
DBMS_BACKUP_RESTORE
OracleSi 8.1.6
,
Windows NT. UNIX
8.1.6.
DBMS_DDL
7.3
490
DBMS_DDL PL/SQL-
DDL, PL/SQL . SQL, DBMS_DDL .
DBMS_DLL ALTER_COMPILE, , , , ANALYZE_OBJECT,
, .
DBMS_DEBUG
OracleS ( ,
8 )
DBMS_DEBUG PL/SQL
Probe. . DBMS_DEBUG :
, . , DEBUG .
DBMS DEFER
OracleS
DBMS_DEFER .
.
DBMS_DEFER_QUERY
OracleS
DBMS_DEFER_QUERY , DBMS_DEFER.
, DBMS_DEFER_QUERY .
DBMS_DEFER_SYS
OracleS
DBMS_DEFER_SYS , DBMS_DEFER, ,
. .
491
DBMS_DESCRIBE
7.3
DBMS_DESCRJBE DESCRIBE_PROCEDURE.
DESCRIBE_PROCEDURE , . ,
.
Oracle 9 DBMS_METADATA,
, .
DBMS_DISTRIBUTED_TRUST_ADMIN
OracleS
. ,
.
,
. Oracle 9 LDAP .
DBMS_FGA
19
DBMS_FGA . : ADD_POLICY,
; DROP_POLICY, ;
ENABLE_POLICY DISABLE_POLICY, .
DBMS_FLASHBACK
19
DBMS_FLASHBACK .
. (flashback)
(SCN). GET_SYSTEM_CHANGE_NUMBER SCN, ENABLE_AT_TIME ENABLE_AT_SYSTEM_CHANGE_NUMBER
. DISABLE .
492
DBMS_HS
OracleS
DBMS_HS
, , (HS, Heterogeneous Services) Oracle. Oracle HS
SQL , Oracle,
Oracle.
DBMS_HS_PASSTHROUGH
OracleS
DBMS_HS_PASSTHROUGH API , .
, , , ,
DBMS_SQL. DBMS_HS_PASSTHROUGH , Oracle .
DBMSJOT
OracleS
DBMSJOT
ANALYZE , . : BUILD_CHAIN_ROWS_TABLE
BUILD_EXCEPTIONS_TABLE, ,
, , .
DBMS_JAVA
OracleS
DBMSJAVA , Java Oracle, Java. , DBMSJAVA.SET_OUTPUT
System.out , DBMS_OUTPUT.
SQL*Plus.
DBMS_JOB
7.3
DBMSJOB PL/SQL . . (job)
PL/SQL, .
493
DBMS_LDAP
OracleSz
DBMS_LDAP API,
LDAP, . , DBMS_LDAP .
catldap. sql.
SSL LDAP.
DBMSJ.IBCACHE
OracleQz
DBMS_LIBCACHE
COMPILE_CURSORS_FROM_REMOTE.
SQL PL/SQL (instance)
. , . , , , .
DBMSJ.OB
OracleS
DBMS_LOB (LOB, Large Object): CLOB, BLOB, NCLOB
BFILE. DBMSJLOB LOB
. LOB , OCI JDBC.
DBMS_LOCK
7.3
DBMS_LOCK (lock). ,
Oracle. ,
. "UL", Oracle.
494
DBMS LOGMNR
OracleSi
DBMS_LOGMNR , Log Miner.
. ,
.
&
DBMS_LOGMNR_CDC_PUBLISH
OracleQj
Oracle (Change Data Capture, CDC)
.
DBMS_LOGMNR_CDC_PUBLISH .
DBMS_LOGMNR_CDC_SUBSCRIBE
OracleQi
Oracle (Change Data Capture, CDC)
.
DBMS_LOGMNR_CDC_SUBSCRIBE , DBMS_LOGMNR_CDC_PUBLISH.
DBMSJLOGMNR_D
OracleSi
DBMS_LOGMNR_D
Log Miner. BUILD, ,
.
DBMS_METADATA
19
DBMS_METADATA , . XML. DBMS_METADATA
DBMS_DESCRIBE.
DBMS_MVIEW (DBMS_SNAPSHOT)
19
DBMS_MVIEW .
495
, .
DBMS_SNAPSHOT DBMS_MVTEW,
,
.
DBMS_OBFUSCATION_TOOLKIT
OracleSz
DBMS_ODCI
19
DBMS_ODCI
ESTIMATE_CPU_UNITS.
CPU,
, .
DBMS_OFFLINE_OG
OracleSz
DBMS_OFFLINE_OG
-. DBMS_OFFLJNE_
SNAPSHOT DBMS_REPCAT_INSTANTIATE
.
DBMS_OFFLINE_SNAPSHOT
OracleSz
DBMS_OFFLINE_SNAPSHOT
.
DBMS_OFFLINE_OG DBMS_REPCAT_INSTANTIATE .
DBMS_OLAP
Oracle 8
, Oracle Trace.
.
496
DBMS_ORACLE_TRACE_AGENT
OracleS
DBMS_ORACLE_TRACE_AGENT SET_ORACLE_TRACE_IN_SESSION.
.
DBMS_ORACLE_TRACE_USER
OracleS
DBMS_ORACLE_TRACE_USER SET_ORACLE_TRACE. .
DBMS_OUTLN
19
DBMS_OUTLN , . (stored
outline) , SQL. OracleS i OUTLN_PKG,
OUTLN_PKG OracleQ .
DBMS_OUTLN_EDIT
Otacle9z
DBMS_OUTLN_EDIT
. , DBMS_OUTLN.
DBMS_OUTPUT
7.3
DBMS_OUTPUT ( SQL*Plus Server
Manager) PL/SQL.
PL/SQL. DBMS_OUTPUT
Oracle Reports.
DBMS_PCLXUTIL
OracleS i
. ,
, .
497
DBMS_PIPE
7.3
DBMS_ALERT, DBMS_PIPE
, , . , (pipes), . ,
, .
DBMS_PROFILER
OracleS
DBMS_PROFILER API PL/SQL Profiler,
/ PL/SQL.
.
DBMS_RANDOM
OracleS
DBMS_RANDOM .
, PL/SQL, Oracle.
OracleS DBMS_RANDOM
.
PL/SQL (Cryptographic Toolkit)
catoctk. sgl.
DBMS_CRYPTO_TOOLKIT,
DBMS_RANDOM.
DBMS_RECITIFIER_DIFF
OracleS
DBMS_REPCAT_* .
DBMSJtEDIFINITION
Oracle9i
DBMS_REDIFINITION .
.
498
DBMS_REFRESH
7.8
DBMS_REFRESH ( ), .
, , .
DBMS_REPAIR
OracleSi
DBMS_REPAIR ,
. , , .
DBMS_REPCAT, DBMS_REPCAT_ADMIN,
DBMS_REPCAT_INSTANTIATE,DBMS_REPCAT_RGT
DBMS_REPUTIL
OracleS
Oracle.
. Oracle.
DBMS_REPCAT
DBMS_REPCAT_ADMIN
DBMS_REPCAT_INSTANTIATE
DBMS_REPCAT_RGT
DBMS_REPUTIL
DBMS_RESOURCE_MANAGER
DBMS_RESOURCE_MANAGER_PRIVS
OracleS i
499
, ,
.
DBMS_RESUMABLE
OracleQi
DBMS_RESUMABLE .
,
, .
.
DBMS_RLS
OracleS
DBMS_RLS
. DBMS_RLS , , , . (Enterprise Edition) OracleSz
19.
DBMS_ROWID
OracleS
OracleS ROWID ( ) ,
Oracle?, OracleS ROWID .
DBMS_ROWID
ROWID Oracle? OracleS
ROWID.
DBMS_SESSION
7.3
ALTER SESSION
PL/SQL. DBMS_SESSION ALTER SESSION,
PL/SQL. DBMS_SESSION
SQL, , ALTER SESSION.
DBMS_SHARED_POOL
7.3
DBMS_SHARED_POOL (shared pool).
500
,
. PL/SQL.
DBMS_SPACE DBMS_SPACE_ADMIN
OracleS
DBMS_SPACE
, DBMS_SPACE_ADMIN
.
DBMS_SQL
7.3
DBMS_SQL PL/SQL.
SQL PL/SQL . , DBMS_SQL
PL/SQL DDL. OracleS SQL, , DBMS_SQL.
DBMS_STANDARD STANDARD
7.3
DBMS_STANDARD STANDARD
PL/SQL. ,
.
DBMS_STATS
OracleS
DBMS_STATS ,
.
.
DBMS_TRACE
OracleS
DBMS_TRACE PL/SQL .
PL/SQL ,
, SQL.
DBMSJTRANSACTION
7.3
DBMS_TRANSACTION , .
SQL- PL/SQL. DBMSJTRANSACTION SET TRANSACTION.
DBMS .TRANSFORM
OracleQz
DBMS_TRANSFORM ,
,
Oracle Advanced Quening.
DBMS_TTS
OracleSz
DBMS_TTS .
TRANSPORT_SET_CHECK ,
, DOWNGRADE ,
.
DBMS_TYPES
19
DBMS_TYPES , ,
. interMedia.
DBMS_UTILITY
7.3
DBMSJLJTILITY ,
. DBMS_UTILITY FORMAT_
CALL_STACK FORMAT_ERROR_STACK,
PL/SQL .
DBMS_WM
19
DBMS_WM API Workspace Manager.
502
,
, .
DEBUG_EXTPROC
OracleS
DEBUG_EXTPROC . STARTUP_
EXTPROC_AGENT, .
.
UTL_COLL
OracleS
UTL_COLL
IS_LOCATOR, ,
.
UTL_ENCODE
19
UTL_ENCODE RAW ,
. : base64,
uuencode quoted printable. e-mail.
503
UTL_FILE
7.3
UTL_FILE PL/SQL /. PL/SQL , ,
. .
UTL_FILE ; .
UTL_HTTP
7.3
UTL_HTTP HTTP-
PL/SQL SQL. Oracle Internet Application Server, web- . UTL_HTTP
: REQUEST REQUEST_PIECES. REQUEST 2000 Web, a
REQUEST_PIECES PL/SQL. OracleS
REQUEST REQUEST_PIECES .
UTLJNADDR
19
UTL_PG
7.3
UTL_PG
COBOL Oracle.
UTL_RAW.
UTL_RAW
7.3
UTL_RAW
RAW
RAW . RAWTOHEX
HEXTORAW STANDARD.
504
UTL_REF
OracleS
UTL_REF
PL/SQL. SQL
. UTL_REF , ,
.
UTL_SMTP
OracleS
UTL_SMTP
SMTP, e-mail. e-mail SMTP,
.
UTLJTCP
OracleS
UTL_TCP TCP,
-. ,
UTL_HTTP UTL_SMTP
UTL_TCP. UTL_TCP .
UTL_URL
19
UTL_URL UTL ( ).
UTL %.
PL/SQL
506
1, , PL/SQL.
( , ..).
SQL, , , .
PL/SQL,
Oracle. 18 19
.
. , 18
19' (, AUTHID NULLIF).
, 19,
, , SQL, (*). ,
, . .
, Oracle, ,
, ,
STANDARD.
ABORT
ALL*
ARRAY
ASSERT
AUTHID
BEGIN
BOOLEAN
CHAR*
CLUSTER*
COLLECT
COMPRESS*
CREATE*
DATABASE
DBA
DECLARE
DELETE*
ACCEPT
ALTER*
ARRAYLEN
ASSIGN
AUTHORIZATION
BETWEEN*
BULK
CHAR.BASE
CLUSTERS
COLUMN*
CONNECT*
CURRENT*
DATABASE
DEBUGOFF
DEFAULT*
DESC*
ACCESS*
AND*
AS*
AT
Average
BINARYJNTEGER
BY*
CHECK*
COALESCE
COMMENT*
CONSTANT
CURRVAL
DATE*
DEBUGON
DEFINITION
DIGITS
ADD*
ANY*
ASC*
AUDIT*
BASEJABLE
BODY
CASE
CLOSE
COLAUTH
COMMIT
CRASH
CURSOR
DAY
DECIMAL*
DELAY
DISPOSE
507
PL/SQL
DISTINCT*
DO
DROP*
ELSE*
ELSIF
END
ENTRY
EXCEPTION
EXCEPTIONJNIT
EXIT
EXCLUSIVE*
EXECUTE
EXISTS*
EXTENDS
EXTRACT
FALSE
FETCH
FILE*
FLOAT*
FOR*
FORALL
FORM*
FROM*
FUNCTION
GENERIC
GOTO
GRANT*
HAVING*
HEAP
HOUR
GROUP*
IDENTIFIED*
IF
IMMEDIATE*
IN*
INCREMENT*
INDEX*
INDEXES
INDICATOR
INITIAL*
INSERT*
INTEGER*
INTERFACE
INTERSECT*
INTERVAL
INTO*
IS*
ISOLATION
JAVA
LEVEL*
LIKE*
LIMITED
LOCK*
LONG*
LOOP
MAX
MAXEXTENTS*
MIN
MINUS*
MINUTE
MLSUBEL*
MOD
MODE*
MONTH
NATURAL
NATURALN
NEW
NEXTVAL
NOAUDIT*
NOCOMPRESS*
NOCOPY
NOT*
NOWAIT*
NULL*
NULLIF
NUMBER*
NUMBER.BASE
OCIROWID
OF*
OFFLINE*
ON*
ONLINE*
OPAQUE
OPEN
OPERATOR
OPTION*
OR*
ORDER*
ORGANIZATION
OTHERS
OUT
PACKAGE
PARTITION
PCTFREE*
PLSJNTEGER
POSITIVE
POSITIVEN
PRAGMA
PRIOR*
PRIVATE
PRIVILEGES*
PROCEDURE
PUBLIC*
RAISE
RANGE
RAW*
REAL
RECORD
REF
RELEASE
REMR
RENAME*
RESOURCE*
RETURN
REVERSE
REVOKE*
ROLLBACK
ROW*
ROWID*
ROWLABEL*
ROWNUM
ROWS*
ROWTYPE
RUN
SAVEPOINT
SCHEMA
SECOND
SELECT*
SEPARATE
SESSION*
SET*
SHARE*
SMALLINT*
SPACE
SQL
SQLCODE
SQLERRM
START*
STATEMENT
STDDEV
SUBTYPE
SUCCESSFUL*
SUM
SYNONYM*
SYSDATE*
TABAUTH
TERMINATE
TABLE*
TABLES*
THEN*
TIME
TASK
508
TIMESTAMP
TIMEZONE.ABBR
TIMEZONE_HOUR
TIMEZONE .MINUTE
TIMEZONE.REGION
TO*
TRIGGER*
TRUE
TYPE
Ul
UID*
UNION*
UNIQUE*
UPDATE*
USE
USER*
VALIDATE*
VALUES*
VARCHAR*
VARCHAR2 *
VARIANCE
VIEW*
VIEWS
WHEN
WHENEVER*
WHERE*
WHILE
WITH*
WORK
WRITE
XOR
YEAR
ZONE
,
. ,
:
)
DECLARE
"BEGIN" NUMBER;
BEGIN
"BEGIN" := 7;
END;
510
, PL/SQL.
, . , .
(data dictionary) , Oracle . ,
, .
, ,
.
Oracle SYS.
, ,
. PL/SQL . catalog.sql,
. Unix catalog.sql $ORACLE_HOME/rdbms/admin. SYS, SQLDBA
H3SQL*Plus.
(
, , v$) "Oracle Sever Reference".
, user_*, all_* dba_*. , :
user_source, all_source dba_source. ,
user_* , ,
al 1_* , ( ), dba_* .
SQL PL/SQL .
( ).
. ,
user_objects object_name, . SQL*Plus
user_objects:
511
VALID
UPPER:
( ClassPackage 9).
SYS.
SYS
DBA. , DBA, user_,
all_* . dba_* ,
SELECT .
SYS. . Oracle
(
) . , u0801070.sql
8.1.7 . , catproc. sql.
.
, .
, , LOB
OracleS Oracle9
,
,
512
.
"Oracle Server Reference".
dictionary,
.
,
.
:
,
, -
Oracle,
,
Oracle ,
.
all_clusters
Oracle?
dba_clusters
Oracle?
user clusters
Oracle?
all_cluster_hash_
expressions
Oracle?
dba_cluster_hash_
Oracle?
expressions
user_cluster_hash_ - ,
Oracle?
expressions
dba_clu_columns
Oracle?
Oracle?
513
all_all_tables
. (
)
OracleB
dba_all_tables
( ) Oracle8
user_all_tables
( )
OracleS
all_col_comments
Oracle?
dba_col_comments
Oracle?
user_col_comments
Oracle?
all_partial_
drop_tabs
OracleS/
dba_partial_
drop_tabs
OracleS/
user_partial_
drop_tabs
OracleS/
all_refs
(REF)
OracleS
dba_refs
(REF)
,
OracleS
user_refs
(REF)
OracleS
,
all_tab_columns
Oracle?
dba_tab_columns
Oracle?
user_tab_coluinns
Oracle?
all_tab_comments
Oracle?
dba_tab_comments
Oracle?
user_tab_comments
,
Oracle?
all_tables
Oracle?
dba_tables
Oracle?
user_tables
Oracle?
514
all_unused_
col_tabs
OracleS/
dba_unused_
col_tabs
OracleS/
user_unused_
col_tabs
OracleS/
all_updatable_
columns
OracleS
dba_updatable_
columns
OracleS
user_updatable_
columns
,
,
OracleS
all_views
Oracle?
dba_views
Oracle?
user_views
Oracle?
, LOB,
OracleS
: ,
LOB :
all_coll_types
dba_coll_types
user_coll_types
allvarrays
dba_varrays
,
varray varray
( )
,
varray
OracleS
OracleS
OracleS
OracleS/
OracleS/
515
user_varrays
,
varray
,
,
,
,
LOB,
LOB
LOB,
,
OracleS/
all_nested_tables
dba_nested_tables
user_nested_
tables
all_lobs
dba_lobs
user lobs
all_type_attrs
dba_type_attrs
user_type_attrs
all_type_methods
dba_type_methods
user_type_methods
all__types
dba_types
userjtypes
all_object_tables
dba_object_tables
user_object_tables
,
,
OracleS
OracleS
OracleS
OracleS
OracleS
OracleS
OracleS
OracleS
OracleS
OracleS
OracleS
OracleS
OracleS
OracleS
OracleS
OracleS
OracleS
OracleS
OracleS/ Oracle?/
, 18 19, :
516
Oracle,
all_context
dba_context
all_dimensions
dba_dimensions
user_dimensions
all_dim_attributes
dba_dim_attributes
user_dim_attributes
all_dim_child_of
dba_dim_child_of
user_dim_crtild_of
all_dim_hierarchies
dba_dim_hierarchies
user_dim_hierarchies
all_dim_join_key
dba_dim_join_key
user_dim_join_key
all_dim_levels
dba_dim_levels
OracleS/
OracleS/
OracleS/
OracleS/
OracleS/
OracleS/
OracleS/
OracleS/
OracleS/
OracleS/
OracleS/
OracleS/
OracleS/
OracleS/
OracleS/
OracleS/
OracleS/
OracleS/
OracleS/
517
user_dim_levels
OracleS/
all_din_level_key
OracleS/
dba_dim_level_key
OracleS/
user_dim_level_key
OracleS/
all_external_tables ,
dba_external_tables
user_external_tables ,
all_opancillary
OracleQ/
!9/
OracleS/
dba_opancillary
OracleS/
user_opancillary
OracleS/
all_oparguments
!/
OracleS/
dba_oparguments
OracleS/
user_oparguments
OracleS/
all_opbindings
OracleS/'
dba_opbindings
user_opbindings
OracleS/
all_operators
dba_operators
OracleS/'
user_operators
OracleS/'
all_outline_hints
OracleS/
dba_outline_hints
user_outline_hints
,
,
OracleS/
OracleS/
all_outlines
OracleS/
dba_outlines
OracleS/
OracleS/
user_outlines
OracleS/
OracleS/
518
all_policies
OracleS/
dba_policies
user_policies
OracleS/
OracleS/
, ,
.
:
all_jobs
Oracle?
user_jobs
,
dba_jobs_running ,
all_db_links
dba_db_links
,
user_db_links
all_.di rectories
dba_directories
all_libraries
dba_libraries
user_libraries
,
all_sequences
dba_sequences
user_sequences
,
dba_jobs
Oracle?
Oracle?
Oracle?
Oracle?
Oracle?
Oracle?
OracleS
OracleS
OracleS
OracleS
OracleS
Oracle?
Oracle?
Oracle?
519
all_synonyms
Oracle?
Oracle?
, - Oracle?
dba_synonyms
user_synonyms
, OracleS, , .
OracleS ,
LOB.
.
all_part_col_statistics
dba__part_col_statistics
user_part_col_statistics
all_part_histograins
dba_part_histograms
user_part_histograms
all_part_indexes
dba_part_indexes
user_part_indexes
all_part_key_columns
dba_part_key_columns
user_part_key_columns
all_part_lobs
dba_part_lobs
user_part_lobs
LOB
LOB
LOB
OracleS
OracleS
OracleS
OracleS
OracleS
OracleS
OracleS
OracleS
OracleS
OracleS
OracleS
OracleS
OracleS/
OracleS/
OracleS/
520
all_part_tables
dba_part_tables
user_part_tables
,
all_subpart_col_statistics
dba_subpart_col_statistics
,
user_subpart_col_
statistics
all_subpart_histogra(ns
dba_subpart_histograms
,
user_subpart_histograms
,
all_subpart_key_columns
"/"
dba_subpart_key_columns
,
"/"
user_subpart_key_columns
,
"/"
all_tab_partitions
dba_tab_partitions
user_tab_partitions
all_tab_subpartitions
dba_tab_subpartitions
user_tab_subpartitions
LOB,
all_lob_partitions
dba_lob_partitions
LOB
user_lob_partitions
LOB,
all_lob_subpartitions
LOB,
dba_lob_subpartitions
LOB
user_lob_subpartitions
LOB,
all_ind_partitions
dba_ind_partitions
OracleS
OracleS
Oracle8
OracleS/
OracleS/
OracleS/
OracleS/
OracleS/
OracleS/
OracleS/
OracleS/
OracleS/
OracleS
OracleS
OracleS
OracleS/
OracleS/
OracleS/
OracleS/
OracleS/
OracleSi
OracleSi
OracleS/
OracleS/
OracleS
OracleS
521
user_ifid_partitions
OracleS
all_ind_subpartitions
dba_ind_subpartitions
user_ind_subpartitions
OracleS/'
OracleS/
OracleS/
, .
, , ,
Oracle.
all_ind_colLimns
,
,
,
Oracle?
Oracle?
Oracle?
Oracleu'
dba_ind_columns
user_ind_columns
all_ind_expressions
dba_ind_expressions
user_ind_expressions
all_indexes
dba_indexes
user_indexes
all_indextypes
dba_indextypes
user_indextypes
all_indextype_operators
dba_indextype_operators
user_indextype_operators
OracleS/
OracleS/'
Oracle?
Oracle?
Oracle?
OracleS/'
OracleS/
OracleS/
OracleS/'
OracleS/'
OracleS/
522
,
Oracle?, OracleSz
.
, .
,
,
Oracle9/
dba_base_table_
mviews
,
,
19/
user_base_
table mviews
,
,
19/
all_mview_
aggregates
OracleS/
dba_mview_
aggregates
OracleS/
user_mview_
aggregates
OracleB/
all_mview_analysis
.
OracleS/
all_base_table_
mviews
dba_mview_analysis OracleS/'
user_mview_analysis
OracleS/
all_mview_detail relations
(
) FROM
OracleS/
523
dba_mview_detail_
relations
OracleS/
(
) FROM
user_mview_detail_
relations
OracleS/
(
) FROM
all_mview_joins
OracleS/
WHERE
dba_mview_joins
WHERE
user_mview_joins
OracleS/
WHERE
all_mview_keys
GROUP BY
OracleS/'
dba_mview_keys
GROUP BY
OracleS/
user_mview_keys
GROUP BY
OracleS/
alljnyiews
OracleS/
dbajnviews
OracleS/
user_mviews
OracleS/
all_refresh
OracleS
dba_refresh
OracleS
user_ref resh
OracleS
all_refresh_
children
OracleS
dba_ref resh__
children
OracleS
OracleS/
524
user_ref resh_
children
18
all_ref resh_
dependencies
OracleS/
all_registered_
snapshots
OracleS
dba_registered_
snapshots
OracleS
user_registered_
snapshots
OracleS
all_snapshot_logs
OracleS
dba_snapshot_logs
OracleS
user_snapshot_logs
OracleS
all_snapshot_refresh_times
OracleS
dba_snapshot_refresh_times
OracleS
user_snapshot_refresh_times
OracleS
all_snapshots
Oracle?
dba_snapshots
Oracle?
user_snapshpts
Oracle?
all_summaries
OracleS/
dba_summaries
OracleS/
user_summaries
OracleS/
,
, ( ),
.
525
all_arguments
( )
Oracle?
user_arguments
( )
Oracle?
all_method_
pa rams
OracleS
dbajnethocL
pa rams
OracleS
user_method_
pa rams
OracleS
all_method_
results
OracleS
dba_method_
results
OracleS
user_method_
results
OracleS
all_internal_
triggers
OracleS/
dba_internal_
triggers
OracleS/
user_internal_
triggers
OracleS/
all_triggers
Oracle?
dba_triggers
Oracle?
user_triggers
Oracle?
all_trigger_cols
Oracle?
dba_trigger_cols , Oracle?
user_trigger_
cols
,
,
Oracle?
, . *_t riggers (. ).
526
all_er rs
dba_errors
user_errors
all_sou rce
dba_source
user_sou rce
,
, , , ,
,
, ,
, , , ,
.
, ,
, , , ,
,
, , ,
, ,
, ,
, ,
, ,
Oracle?
Oracle?
Oracle?
Oracle?
Oracle?
Oracle?
all_dependencies
Oracle?
dba_dependencies
user_dependencies
all_cons_columns
dba_cons_columns
user_cons_columns
all_constraints
dba_constraints
user constraints
Oracle?
Oracle?
Oracle?
Oracle?
Oracle?
Oracle?
Oracle?
Oracle?
527
all_associations
OracleS/
dba_associations
OracleS/
user_associations
OracleS/
all_ustats
OracleS/
dba_ustats
OracleS/
user_ustats
OracleS/
all_tab_col_
statistics
OracleS
dba_tab_col_
statistics
OracleS
user_tab_col_
statistics
all_tab_histograms
OracleS
dba_tab_histograms
OracleS
OracleS
OracleS
all_def_aijdit_opts
Oracle?
audit actions
Oracle?
, ,
.
,
PUBLIC
Oracle?
all_col_privs
528
dba_col_privs
Oracle?
user_col_p'rivs
,
,
Oracle?
all_col_privs_
made
Oracle?
user_col_privs_
made
all_col_privs_
reed
Oracle?
Oracle?
,
PUBLIC
user_col_privs_
Oracle?
reed
,
all_tab_privs
,
PUBUC
pracle?
dba_tab_privs
Oracle?
user_tab_.privs
,
,
Oracle?
all_tab_privs_
made
Oracle?
user_tab_privs_
made
all_tab_privs_
reed
user_tab_privs_
reed
dba_sys_privs
Oracle?
,
PUBLIC
Oracle?
Oracle?
Oracle?
Oracle?
user_sys_privs
ORACLG
ORACLE9/
Oracle
7.x, 8/ 9/
,
Oraple, PL/SQL.
. ,
PL/SQL
.
Oracle Press
Web-
OraclePressBooks.com
:
PL/SQL
PL/SQL, ,
, ,
SQL
SQL
OracleQi
,
DML,
PL/SQL,
,
SQL
D S RN
REQUIRED READING ', information Age
""
www.lory-press.ru