Oracle Database 12c new features for the developers.
1. Oracle 12c VBİS-də proqramçılar üçün yeniliklər
Ramin Orucov http://raminorucov.wordpress.com
SCJP 6, OCE Java EE 6 Web Component Developer
http://www.azeroug.org
2. http://www.azeroug.org
2/
Özüm haqda
Şənbə, 14 Sentyabr 2013
Azercell Telekom
İKT/Daxili proqramların yaradılması
qrupunun rəhbəri
Qafqaz Universiteti
Java, Java web, Android
proqramlaşdırma üzrə müəllim
Ramin Orucov
4. http://www.azeroug.org
4/
SQL yenilikləri
Şənbə, 14 Sentyabr 2013
Sütun default value üçün SEQUENCE qiyməti
İDENTİTY sütunu
VARCHAR2, NVARCHAR2 32K limit
SQL sorğularında LİMİT, OFFSET dəstəyi
Görünməz(invisible) sütun dəstəyi
SQL WITH ifadəsindən PL/SQL funksiya
imkanı
Ramin Orucov
5. http://www.azeroug.org
5/
Sütun default value sequence
Şənbə, 14 Sentyabr 2013
create sequence test_seq
start with 1
increment by 1;
create table test_table(
id number default test_seq.nextval primary key
);
http://docs.oracle.com/cd/E16655_01/server.121/
e17209/statements_7002.htm#SQLRF54458
Ramin Orucov
6. http://www.azeroug.org
6/
IDENTITY sütunu
Şənbə, 14 Sentyabr 2013
MySQL,MS SQL Server auto increment/identity
create table test_table(
id number generated by default on null as identity,
name varchar2(10)
)
insert into test_table(name) values(‘ramin’)
insert into test_table(id,name) values(null, ‘ramin’)
http://docs.oracle.com/cd/E16655_01/gateways.121/e
22508/migr_tools_feat.htm#DRDAA109
Ramin Orucov
8. http://www.azeroug.org
8/
SQL sorğularında Limit, Offset dəstəyi
Şənbə, 14 Sentyabr 2013 Ramin Orucov
select *
from (
select rownum rn, id, e.*
from employees e
)
where rn between 1 AND 10
order by 1;
10. http://www.azeroug.org
10/
SQL sorğularında Limit, Offset dəstəyi
Şənbə, 14 Sentyabr 2013
SELECT employee_id, last_name
FROM employees
ORDER BY salary
FETCH FIRST 10 ROWS ONLY;
SELECT employee_id, last_name
FROM employees
ORDER BY salary
OFFSET 5 ROWS FETCH NEXT 10 ROWS ONLY;
Ramin Orucov
11. http://www.azeroug.org
11/
SQL sorğularında Limit, Offset dəstəyi
Şənbə, 14 Sentyabr 2013
Min maaş alan işçilərin 5% + sonuncu sətirdəkinə
bərabər maaş alan bütün işçilər
SELECT employee_id, last_name, salary
FROM employees
ORDER BY salary
FETCH FIRST 5 PERCENT ROWS WITH TIES;
http://docs.oracle.com/cd/E16655_01/server.121/
e17209/statements_10002.htm#SQLRF55636
Ramin Orucov
12. http://www.azeroug.org
12/
Görünməz(invisible) sütun dəstəyi
Şənbə, 14 Sentyabr 2013
create table app_user(
id number generated by default on null as
identity,
username varchar2(100) not null,
passwd varchar(100) invisible
);
select * from app_user;
http://docs.oracle.com/cd/E16655_01/server.121/
e17636/tables.htm#ADMIN13866
Ramin Orucov
13. http://www.azeroug.org
13/
SQL WITH ifadəsi PL/SQL funksiya
Şənbə, 14 Sentyabr 2013
with
function sqr(p_num in number)
return number
is
begin
return p_num * p_num;
end;
select u.user_id, sqr(u.user_id) from all_users
where rownum <= 10;
2.5-3x dəfə performanslı
http://docs.oracle.com/cd/E16655_01/server.121/e17209/sRamin Orucov
14. http://www.azeroug.org
14/
PL/SQL yenilikləri
Şənbə, 14 Sentyabr 2013
Prosedurdan cursor qaytarmaq
ACCESSIBLE BY ilə paket qadağası
Yeni UTL_CALL_STACK paketi
JDBC üçün PL/SQL boolean və s. tip dəstəyi
SQL kontekstdə PL/SQL tiplərinin istifadəsi
Invoker right funksiyasına result cache dəstəyi
Ramin Orucov
15. http://www.azeroug.org
15/
PL/SQL prosedurdan cursor qaytarmaq
Şənbə, 14 Sentyabr 2013
create procedure get_customer_list
as
cur_customer sys_refcursor;
begin
open cur_customer for
select * from customer;
dbms_sql.return_result(cur_customer);
end get_customer_list;
http://docs.oracle.com/cd/E16655_01/java.121/e1
7657/getsta.htm#JJDBC29004
Ramin Orucov
17. http://www.azeroug.org
17/
ACCESSİBLE BY ilə paket qadağası
Şənbə, 14 Sentyabr 2013
package pkg_api;
package pkg_api_utility;
pkg_api_utility paketi yalnız pkg_api daxilində
istifadə üçün nəzərdə tutulub, ayrılıqda istifadə
olunmamalıdır.
ACCESSİBLE BY
Ramin Orucov
18. http://www.azeroug.org
18/
ACCESSİBLE BY ilə paket qadağası
Şənbə, 14 Sentyabr 2013
CREATE OR REPLACE PACKAGE pkg_api_utility
ACCESSIBLE BY (pkg_api)
IS
PROCEDURE h1;
PROCEDURE h2;
END pkg_api_utility;
CREATE OR REPLACE PACKAGE BODY pkg_api_utility
IS
PROCEDURE h1 IS
BEGIN
DBMS_OUTPUT.PUT_LINE('Helper procedure h1');
END;
PROCEDURE h2 IS
BEGIN
DBMS_OUTPUT.PUT_LINE('Helper procedure h2');
END;
END pkg_api_utility;
Ramin Orucov
19. http://www.azeroug.org
19/
ACCESSİBLE BY ilə paket qadağası
Şənbə, 14 Sentyabr 2013
begin
pkg_api.p1;
pkg_api.p2;
end;
/
begin
pkg_api_utility.h1;
pkg_api_utility.h2;
end;
/
ORA-06550
PLS-00904: insufficient privilege to access object PKG_API_UTILITY
Ramin Orucov
21. http://www.azeroug.org
21/
JDBC daha yaxşı PL/SQL tip dəstəyi
Şənbə, 14 Sentyabr 2013
create or replace package TEST_PKG is
type V_TYP is varray(10) of varchar2(200);
type R_TYP is record(c1 pls_integer, c2 varchar2(100));
procedure VARR_PROC(p1 in V_TYP, p2 OUT V_TYP);
procedure REC_PROC(p1 in R_TYP, p2 OUT R_TYP);
end;
/
Ramin Orucov
22. http://www.azeroug.org
22/
JDBC daha yaxşı PL/SQL tip dəstəyi
Şənbə, 14 Sentyabr 2013
create or replace package body TEST_PKG is
procedure VARR_PROC(p1 in V_TYP, p2 OUT V_TYP) is
begin
p2 := p1;
end;
procedure REC_PROC(p1 in R_TYP, p2 OUT R_TYP) is
begin
p2 := p1;
end;
end;
Ramin Orucov
23. http://www.azeroug.org
23/
JDBC daha yaxşı PL/SQL tip dəstəyi
Şənbə, 14 Sentyabr 2013
CallableStatement cstmt = null;
try {
cstmt = conn.prepareCall("{ call TEST_PKG.VARR_PROC(?,?) }");
Array arr = ((OracleConnection)conn).createArray("TEST_PKG.V_TYP",
new String[]{"A", "B"});
cstmt.setArray(1, arr);
cstmt.registerOutParameter(2, Types.ARRAY, "TEST_PKG.V_TYP");
cstmt.execute();
//get PLSQL VARRAY type out parameter value
Array outArr = cstmt.getArray(2);
} catch( Exception e) {
e.printStackTrace();
}
Ramin Orucov
24. http://www.azeroug.org
24/
JDBC daha yaxşı PL/SQL tip dəstəyi
Şənbə, 14 Sentyabr 2013
try {
cstmt = conn.prepareCall("{ call TEST_PKG.REC_PROC(?,?) }");
//PLSQL RECORD type binding
Struct struct = conn.createStruct("TEST_PKG.R_TYP", new
Object[]{12345, "B"});
cstmt.setObject(1, struct);
cstmt.registerOutParameter(2, Types.STRUCT, "TEST_PKG.R_TYP");
cstmt.execute();
//get PLSQL RECORD type out parameter value
Struct outStruct = (Struct)cstmt.getObject(2);
} catch( Exception e) {
e.printStackTrace();
}
Ramin Orucov
25. http://www.azeroug.org
25/
JDBC daha yaxşı PL/SQL tip dəstəyi
Şənbə, 14 Sentyabr 2013
CREATE OR REPLACE PACKAGE PACK1 AS
TYPE EMPLOYEE_ROWTYPE_ARRAY IS TABLE OF
EMPLOYEES%ROWTYPE;
END PACK1;
CallableStatement cstmt = conn.prepareCall("BEGIN SELECT
* BULK COLLECT INTO :1 FROM EMPLOYEE; END;");
cstmt.registerOutParameter(1,OracleTypes.ARRAY,
"PACK1.EMPLOYEE_ROWTYPE_ARRAY");
cstmt.execute();
Array a = cstmt.getArray(1);
Ramin Orucov