4. Dil yenilikləri
•
SEQUENCE istifadəsi
•
CONTİNUE əmri
•
Qarışıq parameter dəstəyi
•
FORALL bulk bind atribute
dəstəyi
5. SEQUENCE
DECLARE
l_new_id NUMBER;
BEGIN
-- Kohne sequence istifade sintaksisi
SELECT employees_seq.NEXTVAL INTO
l_new_id FROM DUAL;
DBMS_OUTPUT.put_line ('New id = ' ||
l_new_id);
END;
DECLARE
l_new_id NUMBER;
BEGIN
-- Yeni sequence istifade sintaksisi
l_new_id := employees_seq.NEXTVAL;
DBMS_OUTPUT.put_line ('New id = ' ||
l_new_id);
6. CONTINUE
begin -- CONTINUE
for k in 1 .. 20
loop
if mod(k, 2)=0 then
continue;
end if;
dbms_output.put_line(k);
end loop;
end;
begin -- CONTINUE WHEN
for k in 1 .. 20
loop
continue when mod(k, 2)=0;
dbms_output.put_line(k);
end loop;
end;
7. Qarışıq parameter dəstəyi
create or replace function full_name(p_first_name in varchar2,
p_last_name in varchar2)
return varchar2
is
begin
return p_first_name || ' ' || p_last_name;
end full_name;
select employee_id, full_name(first_name, last_name) employee, salary
from hr.employees
-- Yeni imkan
select employee_id, full_name(p_first_name => first_name, p_last_name
=> last_name) employee, salary from hr.employees
select employee_id, full_name(p_last_name => last_name, p_first_name
=> first_name) employee, salary from hr.employees
select employee_id, full_name(first_name, p_last_name => last_name)
employee, salary from hr.employees
8. FORALL bulk bind atribute dəstəyi
declare
type employee_aat is table of hr.employees
%rowtype index by pls_integer;
l_employees employee_aat;
begin
select * bulk collect into l_employees from
hr.employees;
forall i in 1..l_employees.count
update hr.employees
set salary = l_employees(i).salary - 100
where employee_id =
l_employees(i).employee_id;
dbms_output.put_line(SQL%ROWCOUNT || ' rows
updated');
end;
9. FORALL bulk bind atribute dəstəyi
Oracle Error
ORA-06550: line 9, column 22:
PLS-00436: implementation restriction: cannot
reference fields of BULK In-BIND table of records
ORA-06550: line 9, column 22:
PLS-00382: expression is of wrong type
13. SİMPLE_İNTEGER
Oracle 11g VBİS-də yeni SIMPLE_INTEGER adlı ədəd tipi
əlavə edilmişdir, onun qiymət aralığı -232 və 232-1 intervalında
ola bilər, NULL qiyməti qəbul etmir.
Bu intervalın alt sərhədini keçəndə qiymət avtomatik olaraq üst
sərhədə bərabər olur, oxşar şəkildə də üst sərhədi keçəndə
onun qiyməti avtomatik alt sərhədin qiymətinə bərabər olur.
Oracle şirkəti PLS_İNTEGER tipinin əvəzinə yeni
SİMPLE_İNTEGER tipini istifadə etməyi tövsiyə edir. Bu tipdə
olan dəyişkənlər ilə hesablamalar daha sürətli olur. Sadə testlər
əsasında aşağıdakı sürət fərqlərini demək olar:
INTERPRETED rejimdə PLS_İNTEGER-ə görə 10%,
NUMBER tipinə görə isə 2-2.5 dəfə daha sürətli işləyir.
NATİVE rejimdə isə PLS_İNTEGER-ə görə 8-10 dəfə,
NUMBER tipinə görə isə 30 dəfə daha sürətli işləyir.
14. RESULT_CACHE
CREATE OR REPLACE FUNCTION get_employee
(p_employee_id IN employees.employee_id%TYPE)
RETURN employees%ROWTYPE
RESULT_CACHE RELIES_ON (employees)
IS
l_employee employees%ROWTYPE;
BEGIN
SELECT *
INTO l_employee
FROM employees
WHERE employee_id = p_employee_id;
RETURN l_employee;
EXCEPTION
WHEN NO_DATA_FOUND
THEN
/* Return an empty record. */
RETURN l_employee;
END get_employee;
15. COMPOUND TRIGGER
CREATE TRIGGER trigger_name
FOR [INSERT | UPDATE | DELETE] OF [COLUMN] ON
[TABLE]
COMPOUND TRIGGER
BEFORE STATEMENT IS
BEGIN
…
END BEFORE STATEMENT;
AFTER STATEMENT IS
BEGIN
…
END AFTER STATEMENT;
BEFORE EACH ROW IS
BEGIN
…
END BEFORE EACH ROW;
17. Yeni funksional imkanlar
•
Triggerlərin işləmə sırası
•
DBMS_SQL CLOB dəstəyi
•
DBMS_SQL təhlükəsizlik
•
UTL_* paketləri üçün
səlahiyyət
18. Triggerlərin işləmə sırası
İlk dəfə Oracle 11g VBİS-də bir cədvəl üzərində olan triggerlərin
işləmə ardıcıllığını təyin etmək mümkün oldu, bunun üçün yeni
FOLLOWS adlı açar söz əlavə edildi.
create table test_table(
x number
);
create or replace trigger trigger1
after insert on test_table
for each row
begin
dbms_output.put_line('Trigger1 - value = ' || :NEW.x);
end trigger1;
19. Triggerlərin işləmə sırası
create or replace trigger trigger2
after insert on test_table
for each row
follows trigger1
begin
dbms_output.put_line('Trigger2 - value = ' || :NEW.x);
end trigger2;
create or replace trigger trigger3
after insert on test_table
for each row
follows trigger2
begin
dbms_output.put_line('Trigger3 - value = ' || :NEW.x);
end trigger3;
20. Triggerlərin işləmə sırası
insert into test_table values(1);
insert into test_table values(2);
insert into test_table values(3);
Nəticə
Trigger1 - value = 1
Trigger2 - value = 1
Trigger3 - value = 1
Trigger1 - value = 2
Trigger2 - value = 2
Trigger3 - value = 2
Trigger1 - value = 3
Trigger2 - value = 3
Trigger3 - value = 3
23. Qaynaqlar
•
Sam R. Alapati, Charles Kim, Oracle Database 11g - New
Features for DBAs and Developers, Apress
•
http
://docs.oracle.com/cd/E14072_01/appdev.112/e10472/whatsnew.htm
•
http
://www.oracle.com/technology/tech/pl_sql/pdf/PL/SQL_new_in_11gr1.pdf
, Oracle White Paper, PL/SQL Enhancements in Oracle
Database 11g
•
http://
docs.oracle.com/cd/E11882_01/appdev.112/e10471/adfns_dependencies.h
•
http://
www.oracle.com/technetwork/articles/sql/11g-efficient-coding-093640.html
•
http://www.oracle-developer.net/display.php?id=507