SlideShare a Scribd company logo
1 of 68
Copyright © 2012, Oracle and/or its affiliates. All rights reserved. Confidential – Oracle Restricted1
New SQL & PL/SQL Capabilities
in
Oracle Database 12c
Thomas Kyte
http://asktom.oracle.com/
Copyright © 2012, Oracle and/or its affiliates. All rights reserved. Confidential – Oracle Restricted2
The following is intended to outline our general product
direction. It is intended for information purposes only, and
may not be incorporated into any contract. It is not a
commitment to deliver any material, code, or functionality,
and should not be relied upon in making purchasing
decisions. The development, release, and timing of any
features or functionality described for Oracle’s products
remains at the sole discretion of Oracle.
Small print
Copyright © 2012, Oracle and/or its affiliates. All rights reserved. Confidential – Oracle Restricted3
PL/SQL
 More Bind Types
– Booleans
– PL/SQL Records
– PL/SQL Collections
Copyright © 2012, Oracle and/or its affiliates. All rights reserved. Confidential – Oracle Restricted4
PL/SQL
c##tkyte%CDB1> CREATE OR REPLACE PROCEDURE p
(x BOOLEAN) AUTHID CURRENT_USER AS
2 BEGIN
3 IF x THEN
4 DBMS_OUTPUT.PUT_LINE('x is true');
5 END IF;
6 END;
7 /
Procedure created.
Copyright © 2012, Oracle and/or its affiliates. All rights reserved. Confidential – Oracle Restricted5
PL/SQL
ops$tkyte%ORA11GR2> DECLARE
2 dyn_stmt VARCHAR2(200);
3 b BOOLEAN := TRUE;
4 BEGIN
5 dyn_stmt := 'BEGIN p(:x); END;';
6 EXECUTE IMMEDIATE dyn_stmt USING b;
7 END;
8 /
EXECUTE IMMEDIATE dyn_stmt USING b;
*
ERROR at line 6:
ORA-06550: line 6, column 36:
PLS-00457: expressions have to be of SQL types
ORA-06550: line 6, column 3:
PL/SQL: Statement ignored
Copyright © 2012, Oracle and/or its affiliates. All rights reserved. Confidential – Oracle Restricted6
PL/SQL
c##tkyte%CDB1> DECLARE
2 dyn_stmt VARCHAR2(200);
3 b BOOLEAN := TRUE;
4 BEGIN
5 dyn_stmt := 'BEGIN p(:x); END;';
6 EXECUTE IMMEDIATE dyn_stmt USING b;
7 END;
8 /
x is true
PL/SQL procedure successfully completed.
Copyright © 2012, Oracle and/or its affiliates. All rights reserved. Confidential – Oracle Restricted7
PL/SQL
 Query PL/SQL Table Type Directly
– No more need to create SQL Types
– Less namespace clutter
Copyright © 2012, Oracle and/or its affiliates. All rights reserved. Confidential – Oracle Restricted8
PL/SQL
c##tkyte%CDB1> create or replace package my_pkg
2 as
3 type my_collection is table of emp%rowtype;
4
5 procedure p;
6 end my_pkg;
7 /
Package created.
Copyright © 2012, Oracle and/or its affiliates. All rights reserved. Confidential – Oracle Restricted9
PL/SQL
c##tkyte%CDB1> create or replace package body my_pkg
2 as
3
4 procedure p
5 is
6 l_data my_collection;
7 begin
8 select * bulk collect into l_data from emp;
9
10 for x in (select * from TABLE(l_data))
11 loop
12 dbms_output.put_line( x.ename );
13 end loop;
14 end;
15
16 end my_pkg;
17 /
Package body created.
Copyright © 2012, Oracle and/or its affiliates. All rights reserved. Confidential – Oracle Restricted10
PL/SQL
ops$tkyte%ORA11GR2> show err
Errors for PACKAGE BODY MY_PKG:
LINE/COL ERROR
-------- -----------------------------------------------------------------
10/15 PL/SQL: SQL Statement ignored
10/29 PL/SQL: ORA-22905: cannot access rows from a non-nested table
item
10/35 PLS-00642: local collection types not allowed in SQL statements
12/9 PL/SQL: Statement ignored
12/31 PLS-00364: loop index variable 'X' use is invalid
Copyright © 2012, Oracle and/or its affiliates. All rights reserved. Confidential – Oracle Restricted11
PL/SQL
 Grant Roles to Code
– Especially useful for invokers rights routines
– Code will run with current set of privileges of the
Invoker plus that role(s)
– Role is only enabled during execution of that
procedure
– Also, INHERIT PRIVILEGES – new privilege
Copyright © 2012, Oracle and/or its affiliates. All rights reserved. Confidential – Oracle Restricted12
Granting a role to a PL/SQL unit
 Consider this best practice
• Give access to an application’s data only via PL/SQL
subprograms
• Reinforce this by having end-user sessions authorize
as a different database owner than the one that owns the
application’s artifacts
• Arrange this by using definer’s rights units in a single schema or
a couple of schemas. Then grant Execute on these to end-users
– but don’t grant privileges on the tables to end-users
 This means that each unit can access very many tables
because the owner of the units can
Copyright © 2012, Oracle and/or its affiliates. All rights reserved. Confidential – Oracle Restricted13
Granting a role to a PL/SQL unit
 12.1 lets us have a fine-grained scheme where each unit
with the same owner can have different privileges on the
owner’s tables
• The end-user is low-privileged, just as in the old scheme
• The units are invoker’s rights, so “as is” would not allow end-
users to access the data
• The privilege for each unit is elevated for exactly and only that
unit’s purpose by granting a role that has the appropriate
privileges to the unit. Such a role cannot be disabled.
• The unit’s owner must already have that same role (but it need
not be enabled)
Copyright © 2012, Oracle and/or its affiliates. All rights reserved. Confidential – Oracle Restricted14
Granting a role to a PL/SQL unit
 This scenario lets us illustrate the idea
• There are two users App and Client
• There are two tables App.t1 and App.t2
• There are two IR procedures App.Show_t1 and App.Show_t2 to
run select statements against the tables
• Client has Execute on App.Show_t1 and App.Show_t2
• App creates two roles r_Show_t1 and r_Show_t2
• App grants Select on App.t1 to r_Show_t1 – and similar for ~2
• App grants r_Show_t1 to App.Show_t1 – and similar for ~2
Copyright © 2012, Oracle and/or its affiliates. All rights reserved. Confidential – Oracle Restricted15
Granting a role to a PL/SQL unit
create procedure Show_t1 authid Current_User is
begin
for j in (select Fact from App.t1 order by 1) loop -- Notice the schema-qualification
...
end loop;
end Show_t1;
/
grant Execute on App.Show_t1 to Client
/
-- this has the side-effect of granting the role to App with Admin option
-- other non-schema object types like directories and editions behave the same
create role r_Show_t1
/
grant select on t1 to r_Show_t1
/
grant r_Show_t1 to procedure Show_t1
/
select Object_Name, Object_Type, Role
from User_Code_Role_Privs
/
....... ......... .........
SHOW_T1 PROCEDURE R_SHOW_T1
Copyright © 2012, Oracle and/or its affiliates. All rights reserved. Confidential – Oracle Restricted16
Granting a role to a PL/SQL unit
 When Client invokes App.Show_t1, then no matter what
careless mistakes the programmer of the procedure might
later make, its power is limited to just what the role confers.
Copyright © 2012, Oracle and/or its affiliates. All rights reserved. Confidential – Oracle Restricted17
PL/SQL
 White List
– ‘Accessible By’ clause
– Specifies a specific list of code that can invoke your
code
– Fine grained privilege to protect code
Copyright © 2012, Oracle and/or its affiliates. All rights reserved. Confidential – Oracle Restricted18
accessible by clause
package Helper authid Definer accessible by (Good_Guy, Bad_Guy)
is
procedure p;
end Helper;
package body Good_Guy is
procedure p is
begin
Helper.p();
...
end p;
end Good_Guy;
package body Bad_Guy is
procedure p is
begin
Helper.p();
...
end p;
end Bad_Guy;
PLS-00904: insufficient privilege to access object HELPER
_______
Copyright © 2012, Oracle and/or its affiliates. All rights reserved. Confidential – Oracle Restricted19
Even better
PL/SQL from SQL
Copyright © 2012, Oracle and/or its affiliates. All rights reserved. Confidential – Oracle Restricted20
Defining a PL/SQL function in the
with clause of a subquery
function Print(n in integer) return varchar2 authid Definer is
K constant number not null := 1024;
M constant number not null := K*K;
G constant number not null := M*K;
T constant number not null := G*K;
begin
return
case
when n <= K-1 then To_Char(n, '999999')||'byte'
when n/K <= K-1 then To_Char(n/K, '999999')||'K'
when n/M <= K-1 then To_Char(n/M, '999999')||'M'
when n/G <= K-1 then To_Char(n/G, '999999')||'G'
else To_Char(n/T, '999999')||'T'
end;
end Print;
 Use case: pretty-print an integer as a multiple of
an appropriate power of 1024: plain, K, M, B, or T
Copyright © 2012, Oracle and/or its affiliates. All rights reserved. Confidential – Oracle Restricted21
Use the PL/SQL function in SQL
on a table with three number columns
select PK,
Print(n1) "n1",
Print(n2) "n2",
Print(n3) "n3"
from t
1 1 K 1 G 566 G
2 1 K 157 M 416 G
3 2 K 1 G 971 G
4 578 byte 1 G 1 T
5 2 K 1 G 220 G
6 1 K 2 G 1 T
7 48 byte 1 G 2 T
8 992 byte 42 M 3 T
9 794 byte 2 G 1 T
10 2 K 302 M 672 G
Copyright © 2012, Oracle and/or its affiliates. All rights reserved. Confidential – Oracle Restricted22
Try it in pure SQL!
select
PK,
case
when n1 <= 1023 then To_Char(n1, '999999')||' byte'
when n1/1024 <= 1023 then To_Char(n1/1024, '999999')||' K'
when n1/1048576 <= 1023 then To_Char(n1/1048576, '999999')||' M'
when n1/1073741824 <= 1023 then To_Char(n1/1073741824, '999999')||' G'
else To_Char(n1/1099511627776, '999999')||' T'
end
"n1",
case
when n2 <= 1023 then To_Char(n2, '999999')||' byte'
when n2/1024 <= 1023 then To_Char(n2/1024, '999999')||' K'
when n2/1048576 <= 1023 then To_Char(n2/1048576, '999999')||' M'
when n2/1073741824 <= 1023 then To_Char(n2/1073741824, '999999')||' G'
else To_Char(n2/1099511627776, '999999')||' T'
end
"n2",
case
when n3 <= 1023 then To_Char(n3, '999999')||' byte'
when n3/1024 <= 1023 then To_Char(n3/1024, '999999')||' K'
when n3/1048576 <= 1023 then To_Char(n3/1048576, '999999')||' M'
when n3/1073741824 <= 1023 then To_Char(n3/1073741824, '999999')||' G'
else To_Char(n3/1099511627776, '999999')||' T'
end
"n3"
from t
Copyright © 2012, Oracle and/or its affiliates. All rights reserved. Confidential – Oracle Restricted23
Get the performance of SQL with the
clarity and reusability of PL/SQL
function Print(n in integer) return varchar2 authid Definer is
K constant number not null := 1024;
M constant number not null := K*K;
G constant number not null := M*K;
T constant number not null := G*K;
begin
return
case
when n <= K-1 then To_Char(n, '999999')||'byte'
when n/K <= K-1 then To_Char(n/K, '999999')||'K'
when n/M <= K-1 then To_Char(n/M, '999999')||'M'
when n/G <= K-1 then To_Char(n/G, '999999')||'G'
else To_Char(n/T, '999999')||'T'
end;
end Print;
pragma UDF;
Copyright © 2012, Oracle and/or its affiliates. All rights reserved. Confidential – Oracle Restricted24
Declare the PL/SQL function
in the subquery’s with clause
function Print(n in integer) return varchar2 is
K constant number not null := 1024;
M constant number not null := K*K;
G constant number not null := M*K;
T constant number not null := G*K;
begin
return
case
when n <= K-1 then To_Char(n, '999999')||' byte'
when n/K <= K-1 then To_Char(n/K, '999999')||' K'
when n/M <= K-1 then To_Char(n/M, '999999')||' M'
when n/G <= K-1 then To_Char(n/G, '999999')||' G'
else To_Char(n/T, '999999')||' T'
end;
end Print;
select PK,
Print(n1) "n1",
Print(n2) "n2",
Print(n3) "n3"
from t
with
Copyright © 2012, Oracle and/or its affiliates. All rights reserved. Confidential – Oracle Restricted25
Performance comparison
 Pure SQL
is fastest
 Schema-level function with pragma UDF
is close
 Function in the with clause
is similar
 Pre-12.1 ordinary schema-level function
is very much the slowest
1.0 – the baseline
3.8x
3.9x
5.0x
Copyright © 2012, Oracle and/or its affiliates. All rights reserved. Confidential – Oracle Restricted26
Better client
binding
Copyright © 2012, Oracle and/or its affiliates. All rights reserved. Confidential – Oracle Restricted27
Improved support for binding PL/SQL types in JDBC
 Before 12.1
• Generate a schema level object type to mirror the
structure of the non-SQL package type
• Populate and bind the object into a custom PL/SQL
wrapper around the desired PL/SQL subprogram
• Convert the object to the package type in the wrapper
and call the PL/SQL subprogram with the package type
Copyright © 2012, Oracle and/or its affiliates. All rights reserved. Confidential – Oracle Restricted28
Improved support for binding PL/SQL types in JDBC
 New in 12.1
• PL/SQL package types supported as binds in JDBC
• Can now execute PL/SQL subprograms with non-SQL
types
• Supported types include records, index-by tables,
nested tables and varrays
• Table%rowtype, view%rowtype and package defined
cursor%rowtype also supported. They’re technically
record types
Copyright © 2012, Oracle and/or its affiliates. All rights reserved. Confidential – Oracle Restricted29
Example1: Bind a single record from Java
into a PL/SQL procedure, modify it,
and bind it back out to Java
package Emp_Info is
type employee is record(First_Name Employees.First_Name%type,
Last_Name Employees.Last_Name%type,
Employee_Id Employees.Employee_Id%type,
Is_CEO boolean);
procedure Get_Emp_Name(Emp_p in out Employee);
end;
Copyright © 2012, Oracle and/or its affiliates. All rights reserved. Confidential – Oracle Restricted30
Example1:
 Use the EmpinfoEmployee class, generated by
JPub, to implement the Employee formal parameter
{ …
EmpinfoEmployee Employee = new EmpinfoEmployee();
Employee.setEmployeeId(new java.math.BigDecimal(100)); // Use Employee ID 100
// Call Get_Emp_Name() with the Employee object
OracleCallableStatement cstmt =
(OracleCallableStatement)conn.prepareCall("call EmpInfo.Get_Emp_Name(?)");
cstmt.setObject(1, Employee, OracleTypes.STRUCT);
// Use "PACKAGE.TYPE NAME" as the type name
cstmt.registerOutParameter(1, OracleTypes.STRUCT, "EMPINFO.EMPLOYEE");
cstmt.execute();
// Get and print the contents of the Employee object
EmpinfoEmployee oraData =
(EmpinfoEmployee)cstmt.getORAData(1, EmpinfoEmployee.getORADataFactory());
System.out.println("Employee: " + oraData.getFirstName() + " " + oraData.getLastName());
System.out.println("Is the CEO? " + oraData.getIsceo());
}
Copyright © 2012, Oracle and/or its affiliates. All rights reserved. Confidential – Oracle Restricted31
Example 2: populate a collection of table%rowtype
using a bulk collect statement, and pass the collection
as an out parameter back to the caller
package EmpRow is
type Table_of_Emp is table of Employees%Rowtype;
procedure GetEmps(Out_Rows out Table_of_Emp);
end;
package Body EmpRow is
procedure GetEmps(Out_Rows out Table_of_Emp) is
begin
select *
bulk collect into Out_Rows
from Employees;
end;
end;
Copyright © 2012, Oracle and/or its affiliates. All rights reserved. Confidential – Oracle Restricted32
Example 2:
{ …
// Call GetEmps() to get the ARRAY of table row data objects
CallableStatement cstmt = conn.prepareCall("call EmpRow.GetEmps(?)");
// Use "PACKAGE.COLLECTION NAME" as the type name
cstmt.registerOutParameter(1, OracleTypes.ARRAY, "EMPROW.TABLE_OF_EMP");
cstmt.execute();
// Print the Employee Table rows
Array a = cstmt.getArray(1);
String s = Debug.printArray ((ARRAY)a, "",
((ARRAY)a).getSQLTypeName () +"( ", conn);
System.out.println(s);
}
Copyright © 2012, Oracle and/or its affiliates. All rights reserved. Confidential – Oracle Restricted33
Improved
Introspection
Copyright © 2012, Oracle and/or its affiliates. All rights reserved. Confidential – Oracle Restricted34
Improved call stack introspection
 Before 12.1, you used three functions in the
DBMS_Utility package
• Format_Call_Stack()
• Format_Error_Stack()
• Format_Error_Backtrace()
 New in 12.1
• The package UTL_Call_Stack solves the
same problem properly
Copyright © 2012, Oracle and/or its affiliates. All rights reserved. Confidential – Oracle Restricted35
Code to be introspected
package body Pkg is
procedure p is
procedure q is
procedure r is
procedure p is
begin
Print_Call_Stack();
end p;
begin
p();
end r;
begin
r();
end q;
begin
q();
end p;
end Pkg;
Copyright © 2012, Oracle and/or its affiliates. All rights reserved. Confidential – Oracle Restricted36
Pre 12.1 Print_Call_Stack()
procedure Print_Call_Stack authid Definer is
Depth pls_integer := UTL_Call_Stack.Dynamic_Depth();
begin
DBMS_Output.Put_Line(DBMS_Utility.Format_Call_Stack());
end;
----- PL/SQL Call Stack -----
object line object
handle number name
0x631f6e88 12 procedure USR.PRINT_CALL_STACK
0x68587700 7 package body USR.PKG
0x68587700 10 package body USR.PKG
0x68587700 13 package body USR.PKG
0x68587700 16 package body USR.PKG
0x69253ca8 1 anonymous block
Copyright © 2012, Oracle and/or its affiliates. All rights reserved. Confidential – Oracle Restricted37
12.1 Print_Call_Stack()
procedure Print_Call_Stack authid Definer is
Depth pls_integer := UTL_Call_Stack.Dynamic_Depth();
begin
for j in reverse 2..Depth loop
DBMS_Output.Put_Line(
(j - 1)||
To_Char(UTL_Call_Stack.Unit_Line(j), '99')||
UTL_Call_Stack.Concatenate_Subprogram(UTL_Call_Stack.Subprogram(j)));
end loop;
end;
5 1 __anonymous_block
4 16 PKG.P
3 13 PKG.P.Q
2 10 PKG.P.Q.R
1 7 PKG.P.Q.R.P
Copyright © 2012, Oracle and/or its affiliates. All rights reserved. Confidential – Oracle Restricted38
Improved call stack introspection
 Symmetrical subprograms for error stack and
backtrace
 Plus
• Owner(Depth)
• Current_Edition(Depth)
• Lexical_Depth(Depth)
Copyright © 2012, Oracle and/or its affiliates. All rights reserved. Confidential – Oracle Restricted39
Agenda
 Improved client <> PL/SQL <> SQL
interoperability
 A new security capability
 Improved programmer usability
 Miscellaneous
Copyright © 2012, Oracle and/or its affiliates. All rights reserved. Confidential – Oracle Restricted40
Invisible Columns
Copyright © 2012, Oracle and/or its affiliates. All rights reserved. Confidential – Oracle Restricted41
Invisible Columns
ops$tkyte%ORA12CR1> create table t
2 ( x int,
3 y int
4 )
5 /
Table created.
ops$tkyte%ORA12CR1> insert into t values ( 1, 2 );
1 row created.
Copyright © 2012, Oracle and/or its affiliates. All rights reserved. Confidential – Oracle Restricted42
Invisible Columns
ops$tkyte%ORA12CR1> alter table t add
( z int INVISIBLE );
Table altered.
Copyright © 2012, Oracle and/or its affiliates. All rights reserved. Confidential – Oracle Restricted43
Invisible Columns
ops$tkyte%ORA12CR1> desc t
Name Null? Type
----------------- -------- ------------
X NUMBER(38)
Y NUMBER(38)
Copyright © 2012, Oracle and/or its affiliates. All rights reserved. Confidential – Oracle Restricted44
Invisible Columns
ops$tkyte%ORA12CR1> insert into t values ( 3, 4 );
1 row created.
Copyright © 2012, Oracle and/or its affiliates. All rights reserved. Confidential – Oracle Restricted45
Invisible Columns
ops$tkyte%ORA12CR1> select * from t;
X Y
---------- ----------
1 2
3 4
Copyright © 2012, Oracle and/or its affiliates. All rights reserved. Confidential – Oracle Restricted46
Invisible Columns
ops$tkyte%ORA12CR1> insert into t (x,y,z)
values ( 5,6,7 );
1 row created.
ops$tkyte%ORA12CR1> select x, y, z from t;
X Y Z
---------- ---------- ----------
1 2
3 4
5 6 7
Copyright © 2012, Oracle and/or its affiliates. All rights reserved. Confidential – Oracle Restricted47
Invisible Columns
ops$tkyte%ORA12CR1> alter table t modify z visible;
Table altered.
ops$tkyte%ORA12CR1> select * from t;
X Y Z
---------- ---------- ----------
1 2
3 4
5 6 7
Copyright © 2012, Oracle and/or its affiliates. All rights reserved. Confidential – Oracle Restricted48
Multiple Same
Column Indexes
Copyright © 2012, Oracle and/or its affiliates. All rights reserved. Confidential – Oracle Restricted49
Indexing
ops$tkyte%ORA11GR2> create table t ( x int, y int, z int );
Table created.
ops$tkyte%ORA11GR2> create index t_idx on t(x,y);
Index created.
ops$tkyte%ORA11GR2> create bitmap index t_idx2 on t(x,y);
create bitmap index t_idx2 on t(x,y)
*
ERROR at line 1:
ORA-01408: such column list already indexed
ops$tkyte%ORA11GR2> create bitmap index t_idx2 on t(x,y) invisible;
create bitmap index t_idx2 on t(x,y) invisible
*
ERROR at line 1:
ORA-01408: such column list already indexed
Copyright © 2012, Oracle and/or its affiliates. All rights reserved. Confidential – Oracle Restricted50
Indexing
ops$tkyte%ORA12CR1> create table t ( x int, y int, z int );
Table created.
ops$tkyte%ORA12CR1> create index t_idx on t(x,y);
Index created.
ops$tkyte%ORA12CR1> create bitmap index t_idx2 on t(x,y) invisible;
Index created.
Copyright © 2012, Oracle and/or its affiliates. All rights reserved. Confidential – Oracle Restricted51
Indexing
ops$tkyte%ORA12CR1> alter session set
optimizer_use_invisible_indexes=true;
Session altered.
ops$tkyte%ORA12CR1> exec dbms_stats.set_table_stats( user, 'T',
numrows => 1000000, numblks => 100000 );
PL/SQL procedure successfully completed.
Copyright © 2012, Oracle and/or its affiliates. All rights reserved. Confidential – Oracle Restricted52
Indexing
ops$tkyte%ORA12CR1> set autotrace traceonly explain
ops$tkyte%ORA12CR1> select count(*) from t;
Execution Plan
----------------------------------------------------------
Plan hash value: 1106681275
---------------------------------------------------------------------
| Id | Operation | Name | Rows | Cost (%CPU)|
---------------------------------------------------------------------
| 0 | SELECT STATEMENT | | 1 | 0 (0)|
| 1 | SORT AGGREGATE | | 1 | |
| 2 | BITMAP CONVERSION COUNT | | 1000K| |
| 3 | BITMAP INDEX FAST FULL SCAN| T_IDX2 | | |
---------------------------------------------------------------------
ops$tkyte%ORA12CR1> set autotrace off
Copyright © 2012, Oracle and/or its affiliates. All rights reserved. Confidential – Oracle Restricted53
Temporal Validity
Copyright © 2012, Oracle and/or its affiliates. All rights reserved. Confidential – Oracle Restricted54
Temporal Validity
ops$tkyte%ORA12CR1> create table addresses
2 ( empno number,
3 addr_data varchar2(30),
4 start_date date,
5 end_date date,
6 period for valid(start_date,end_date)
7 )
8 /
Table created.
Copyright © 2012, Oracle and/or its affiliates. All rights reserved. Confidential – Oracle Restricted55
Temporal Validity
ops$tkyte%ORA12CR1> insert into addresses (empno, addr_data, start_date, end_date )
2 values ( 1234, '123 Main Street', trunc(sysdate-5), trunc(sysdate-2) );
1 row created.
ops$tkyte%ORA12CR1> insert into addresses (empno, addr_data, start_date, end_date )
2 values ( 1234, '456 Fleet Street', trunc(sysdate-1), trunc(sysdate+1) );
1 row created.
ops$tkyte%ORA12CR1> insert into addresses (empno, addr_data, start_date, end_date )
2 values ( 1234, '789 1st Ave', trunc(sysdate+2), null );
1 row created.
Copyright © 2012, Oracle and/or its affiliates. All rights reserved. Confidential – Oracle Restricted56
Temporal Validity
ops$tkyte%ORA12CR1> select * from addresses;
EMPNO ADDR_DATA START_DAT END_DATE
---------- ------------------------------ --------- ---------
1234 123 Main Street 12-MAY-13 15-MAY-13
1234 456 Fleet Street 16-MAY-13 18-MAY-13
1234 789 1st Ave 19-MAY-13
Copyright © 2012, Oracle and/or its affiliates. All rights reserved. Confidential – Oracle Restricted57
Temporal Validity
ops$tkyte%ORA12CR1> select * from addresses as of period for valid sysdate-3;
EMPNO ADDR_DATA START_DAT END_DATE
---------- ------------------------------ --------- ---------
1234 123 Main Street 12-MAY-13 15-MAY-13
ops$tkyte%ORA12CR1> select * from addresses as of period for valid sysdate;
EMPNO ADDR_DATA START_DAT END_DATE
---------- ------------------------------ --------- ---------
1234 456 Fleet Street 16-MAY-13 18-MAY-13
ops$tkyte%ORA12CR1> select * from addresses as of period for valid sysdate+3;
EMPNO ADDR_DATA START_DAT END_DATE
---------- ------------------------------ --------- ---------
1234 789 1st Ave 19-MAY-13
Copyright © 2012, Oracle and/or its affiliates. All rights reserved. Confidential – Oracle Restricted58
SQL Text
Expansion
Copyright © 2012, Oracle and/or its affiliates. All rights reserved. Confidential – Oracle Restricted59
SQL Text Expansion
ops$tkyte%ORA12CR1> variable x clob
ops$tkyte%ORA12CR1> begin
2 dbms_utility.expand_sql_text
3 ( input_sql_text => 'select * from all_users',
4 output_sql_text => :x );
5 end;
6 /
PL/SQL procedure successfully completed.
Copyright © 2012, Oracle and/or its affiliates. All rights reserved. Confidential – Oracle Restricted60
SQL Text Expansion
ops$tkyte%ORA12CR1> print x
X
--------------------------------------------------------------------------------
SELECT "A1"."USERNAME" "USERNAME","A1"."USER_ID" "USER_ID","A1"."CREATED" "CREAT
ED","A1"."COMMON" "COMMON" FROM (SELECT "A4"."NAME" "USERNAME","A4"."USER#" "US
ER_ID","A4"."CTIME" "CREATED",DECODE(BITAND("A4"."SPARE1",128),128,'YES','NO') "
COMMON" FROM "SYS"."USER$" "A4","SYS"."TS$" "A3","SYS"."TS$" "A2" WHERE "A4"."DA
TATS#"="A3"."TS#" AND "A4"."TEMPTS#"="A2"."TS#" AND "A4"."TYPE#"=1) "A1"
Copyright © 2012, Oracle and/or its affiliates. All rights reserved. Confidential – Oracle Restricted61
SQL Text Expansion
ops$tkyte%ORA12CR1> create or replace
2 function my_security_function( p_schema in varchar2,
3 p_object in varchar2 )
4 return varchar2
5 as
6 begin
7 return 'owner = USER';
8 end;
9 /
Function created.
Copyright © 2012, Oracle and/or its affiliates. All rights reserved. Confidential – Oracle Restricted62
SQL Text Expansion
ops$tkyte%ORA12CR1> create table my_table
2 ( data varchar2(30),
3 OWNER varchar2(30) default USER
4 )
5 /
Table created.
Copyright © 2012, Oracle and/or its affiliates. All rights reserved. Confidential – Oracle Restricted63
SQL Text Expansion
ops$tkyte%ORA12CR1> begin
2 dbms_rls.add_policy
3 ( object_schema => user,
4 object_name => 'MY_TABLE',
5 policy_name => 'MY_POLICY',
6 function_schema => user,
7 policy_function => 'My_Security_Function',
8 statement_types => 'select, insert, update, delete' ,
9 update_check => TRUE );
10 end;
11 /
PL/SQL procedure successfully completed.
Copyright © 2012, Oracle and/or its affiliates. All rights reserved. Confidential – Oracle Restricted64
SQL Text Expansion
ops$tkyte%ORA12CR1> begin
2 dbms_utility.expand_sql_text
3 ( input_sql_text => 'select * from my_table',
4 output_sql_text => :x );
5 end;
6 /
PL/SQL procedure successfully completed.
ops$tkyte%ORA12CR1> print x
X
--------------------------------------------------------------------------------
SELECT "A1"."DATA" "DATA","A1"."OWNER" "OWNER" FROM (SELECT "A2"."DATA" "DATA",
"A2"."OWNER" "OWNER" FROM "OPS$TKYTE"."MY_TABLE" "A2" WHERE "A2"."OWNER"=USER@!)
"A1"
Copyright © 2012, Oracle and/or its affiliates. All rights reserved. Confidential – Oracle Restricted65
Etc…
Copyright © 2012, Oracle and/or its affiliates. All rights reserved. Confidential – Oracle Restricted66
Other enhancements brought by 12.1
 Improved Defaults
 Row Limiting Clause
 Row Pattern Matching
 Partitioning Improvements
 Temporary Undo
Copyright © 2012, Oracle and/or its affiliates. All rights reserved. Confidential – Oracle Restricted67
Other enhancements brought by 12.1
 You can now result-cache an invoker’s rights function
(the current user becomes part of the cache lookup key)
 Safe callouts (implemented via extproc) are faster
(motivated by Oracle R Enterprise – which saw a 20x
speedup)
 Edition-based redefinition can now be adopted without
needing to change how objects are disposed among
schemas – so no reason at all for you not to use EBR for
every patch that changes only PL/SQL, views, or synonyms
Copyright © 2012, Oracle and/or its affiliates. All rights reserved. Confidential – Oracle Restricted68

More Related Content

What's hot

09 Managing Dependencies
09 Managing Dependencies09 Managing Dependencies
09 Managing Dependenciesrehaniltifat
 
07 Using Oracle-Supported Package in Application Development
07 Using Oracle-Supported Package in Application Development07 Using Oracle-Supported Package in Application Development
07 Using Oracle-Supported Package in Application Developmentrehaniltifat
 
Novidades do Java SE 8
Novidades do Java SE 8Novidades do Java SE 8
Novidades do Java SE 8Bruno Borges
 
05 Creating Stored Procedures
05 Creating Stored Procedures05 Creating Stored Procedures
05 Creating Stored Proceduresrehaniltifat
 
Oracle Data Redaction - EOUC
Oracle Data Redaction - EOUCOracle Data Redaction - EOUC
Oracle Data Redaction - EOUCAlex Zaballa
 
How to upgrade your application with no downtime (using edition-based redefin...
How to upgrade your application with no downtime (using edition-based redefin...How to upgrade your application with no downtime (using edition-based redefin...
How to upgrade your application with no downtime (using edition-based redefin...Oren Nakdimon
 
What's New in Java 8
What's New in Java 8What's New in Java 8
What's New in Java 8javafxpert
 
Write Less (code) With More (Oracle Database 12c New Features)
Write Less (code) With More (Oracle Database 12c New Features)Write Less (code) With More (Oracle Database 12c New Features)
Write Less (code) With More (Oracle Database 12c New Features)Oren Nakdimon
 
Indexes and Indexing in Oracle 12c
Indexes and Indexing in Oracle 12cIndexes and Indexing in Oracle 12c
Indexes and Indexing in Oracle 12cOren Nakdimon
 
Whats New in Java 5, 6, & 7 (Webinar Presentation - June 2013)
Whats New in Java 5, 6, & 7 (Webinar Presentation - June 2013)Whats New in Java 5, 6, & 7 (Webinar Presentation - June 2013)
Whats New in Java 5, 6, & 7 (Webinar Presentation - June 2013)DevelopIntelligence
 
JDK 14 Lots of New Features
JDK 14 Lots of New FeaturesJDK 14 Lots of New Features
JDK 14 Lots of New FeaturesSimon Ritter
 
Project Jigsaw in JDK9
Project Jigsaw in JDK9Project Jigsaw in JDK9
Project Jigsaw in JDK9Simon Ritter
 
Oracle Developer Live: Deploying MySQL InnoDB Cluster on OCI with Terraform
Oracle Developer Live: Deploying MySQL InnoDB Cluster on OCI with TerraformOracle Developer Live: Deploying MySQL InnoDB Cluster on OCI with Terraform
Oracle Developer Live: Deploying MySQL InnoDB Cluster on OCI with TerraformFrederic Descamps
 
Edition Based Redefinition Made Easy - Oren Nakdimon
Edition Based Redefinition Made Easy - Oren NakdimonEdition Based Redefinition Made Easy - Oren Nakdimon
Edition Based Redefinition Made Easy - Oren NakdimonOren Nakdimon
 
Basic of oracle application Login steps
Basic of oracle application Login stepsBasic of oracle application Login steps
Basic of oracle application Login stepsGirishchandra Darvesh
 
JDK 9, 10, 11 and Beyond
JDK 9, 10, 11 and BeyondJDK 9, 10, 11 and Beyond
JDK 9, 10, 11 and BeyondSimon Ritter
 

What's hot (20)

09 Managing Dependencies
09 Managing Dependencies09 Managing Dependencies
09 Managing Dependencies
 
07 Using Oracle-Supported Package in Application Development
07 Using Oracle-Supported Package in Application Development07 Using Oracle-Supported Package in Application Development
07 Using Oracle-Supported Package in Application Development
 
Novidades do Java SE 8
Novidades do Java SE 8Novidades do Java SE 8
Novidades do Java SE 8
 
Java after 8
Java after 8Java after 8
Java after 8
 
05 Creating Stored Procedures
05 Creating Stored Procedures05 Creating Stored Procedures
05 Creating Stored Procedures
 
Oracle Data Redaction - EOUC
Oracle Data Redaction - EOUCOracle Data Redaction - EOUC
Oracle Data Redaction - EOUC
 
How to upgrade your application with no downtime (using edition-based redefin...
How to upgrade your application with no downtime (using edition-based redefin...How to upgrade your application with no downtime (using edition-based redefin...
How to upgrade your application with no downtime (using edition-based redefin...
 
What's New in Java 8
What's New in Java 8What's New in Java 8
What's New in Java 8
 
Write Less (code) With More (Oracle Database 12c New Features)
Write Less (code) With More (Oracle Database 12c New Features)Write Less (code) With More (Oracle Database 12c New Features)
Write Less (code) With More (Oracle Database 12c New Features)
 
Indexes and Indexing in Oracle 12c
Indexes and Indexing in Oracle 12cIndexes and Indexing in Oracle 12c
Indexes and Indexing in Oracle 12c
 
Whats New in Java 5, 6, & 7 (Webinar Presentation - June 2013)
Whats New in Java 5, 6, & 7 (Webinar Presentation - June 2013)Whats New in Java 5, 6, & 7 (Webinar Presentation - June 2013)
Whats New in Java 5, 6, & 7 (Webinar Presentation - June 2013)
 
Plsql les04
Plsql les04Plsql les04
Plsql les04
 
JDK 14 Lots of New Features
JDK 14 Lots of New FeaturesJDK 14 Lots of New Features
JDK 14 Lots of New Features
 
Project Jigsaw in JDK9
Project Jigsaw in JDK9Project Jigsaw in JDK9
Project Jigsaw in JDK9
 
Oracle Developer Live: Deploying MySQL InnoDB Cluster on OCI with Terraform
Oracle Developer Live: Deploying MySQL InnoDB Cluster on OCI with TerraformOracle Developer Live: Deploying MySQL InnoDB Cluster on OCI with Terraform
Oracle Developer Live: Deploying MySQL InnoDB Cluster on OCI with Terraform
 
PHP Oracle
PHP OraclePHP Oracle
PHP Oracle
 
Edition Based Redefinition Made Easy - Oren Nakdimon
Edition Based Redefinition Made Easy - Oren NakdimonEdition Based Redefinition Made Easy - Oren Nakdimon
Edition Based Redefinition Made Easy - Oren Nakdimon
 
Basic of oracle application Login steps
Basic of oracle application Login stepsBasic of oracle application Login steps
Basic of oracle application Login steps
 
JDK 9, 10, 11 and Beyond
JDK 9, 10, 11 and BeyondJDK 9, 10, 11 and Beyond
JDK 9, 10, 11 and Beyond
 
Jdbc basic features
Jdbc basic featuresJdbc basic features
Jdbc basic features
 

Similar to New PLSQL in Oracle Database 12c

How Oracle Single/Multitenant will change a DBA's life
How Oracle Single/Multitenant will change a DBA's lifeHow Oracle Single/Multitenant will change a DBA's life
How Oracle Single/Multitenant will change a DBA's lifeGuatemala User Group
 
The Amazing and Elegant PL/SQL Function Result Cache
The Amazing and Elegant PL/SQL Function Result CacheThe Amazing and Elegant PL/SQL Function Result Cache
The Amazing and Elegant PL/SQL Function Result CacheSteven Feuerstein
 
Less08 managing data and concurrency
Less08 managing data and concurrencyLess08 managing data and concurrency
Less08 managing data and concurrencyImran Ali
 
Why User-Mode Threads Are Good for Performance
Why User-Mode Threads Are Good for PerformanceWhy User-Mode Threads Are Good for Performance
Why User-Mode Threads Are Good for PerformanceScyllaDB
 
Oracle Solaris 11.1 New Features
Oracle Solaris 11.1 New FeaturesOracle Solaris 11.1 New Features
Oracle Solaris 11.1 New FeaturesOrgad Kimchi
 
OSI_MySQL_Performance Schema
OSI_MySQL_Performance SchemaOSI_MySQL_Performance Schema
OSI_MySQL_Performance SchemaMayank Prasad
 
0396 oracle-goldengate-12c-tutorial
0396 oracle-goldengate-12c-tutorial0396 oracle-goldengate-12c-tutorial
0396 oracle-goldengate-12c-tutorialKlausePaulino
 
Meetup my sql5.6_cluster
Meetup my sql5.6_clusterMeetup my sql5.6_cluster
Meetup my sql5.6_clusterLee Stigile
 
OUGLS 2016: Guided Tour On The MySQL Source Code
OUGLS 2016: Guided Tour On The MySQL Source CodeOUGLS 2016: Guided Tour On The MySQL Source Code
OUGLS 2016: Guided Tour On The MySQL Source CodeGeorgi Kodinov
 
Oracle Database 12c - The Best Oracle Database 12c Tuning Features for Develo...
Oracle Database 12c - The Best Oracle Database 12c Tuning Features for Develo...Oracle Database 12c - The Best Oracle Database 12c Tuning Features for Develo...
Oracle Database 12c - The Best Oracle Database 12c Tuning Features for Develo...Alex Zaballa
 
Batch Applications for the Java Platform
Batch Applications for the Java PlatformBatch Applications for the Java Platform
Batch Applications for the Java PlatformSivakumar Thyagarajan
 
D73549GC10_06.pptx
D73549GC10_06.pptxD73549GC10_06.pptx
D73549GC10_06.pptxVLQuyNhn
 
MySQL 5.7 NEW FEATURES, BETTER PERFORMANCE, AND THINGS THAT WILL BREAK -- Mid...
MySQL 5.7 NEW FEATURES, BETTER PERFORMANCE, AND THINGS THAT WILL BREAK -- Mid...MySQL 5.7 NEW FEATURES, BETTER PERFORMANCE, AND THINGS THAT WILL BREAK -- Mid...
MySQL 5.7 NEW FEATURES, BETTER PERFORMANCE, AND THINGS THAT WILL BREAK -- Mid...Dave Stokes
 
Five more things about Oracle SQL and PLSQL
Five more things about Oracle SQL and PLSQLFive more things about Oracle SQL and PLSQL
Five more things about Oracle SQL and PLSQLConnor McDonald
 
Less04 instance
Less04 instanceLess04 instance
Less04 instanceImran Ali
 
5675212318661411677_TRN4034_How_to_Migrate_to_Oracle_Autonomous_Database_Clou...
5675212318661411677_TRN4034_How_to_Migrate_to_Oracle_Autonomous_Database_Clou...5675212318661411677_TRN4034_How_to_Migrate_to_Oracle_Autonomous_Database_Clou...
5675212318661411677_TRN4034_How_to_Migrate_to_Oracle_Autonomous_Database_Clou...NomanKhalid56
 
Batch Applications for Java Platform 1.0: Java EE 7 and GlassFish
Batch Applications for Java Platform 1.0: Java EE 7 and GlassFishBatch Applications for Java Platform 1.0: Java EE 7 and GlassFish
Batch Applications for Java Platform 1.0: Java EE 7 and GlassFishArun Gupta
 
Oracle SQL Developer: 3 Features You're Not Using But Should Be
Oracle SQL Developer: 3 Features You're Not Using But Should BeOracle SQL Developer: 3 Features You're Not Using But Should Be
Oracle SQL Developer: 3 Features You're Not Using But Should BeJeff Smith
 
oracle upgrade 2015_509_Swonger_ppt.pptx
oracle upgrade 2015_509_Swonger_ppt.pptxoracle upgrade 2015_509_Swonger_ppt.pptx
oracle upgrade 2015_509_Swonger_ppt.pptxssuser670564
 

Similar to New PLSQL in Oracle Database 12c (20)

Cursores.ppt
Cursores.pptCursores.ppt
Cursores.ppt
 
How Oracle Single/Multitenant will change a DBA's life
How Oracle Single/Multitenant will change a DBA's lifeHow Oracle Single/Multitenant will change a DBA's life
How Oracle Single/Multitenant will change a DBA's life
 
The Amazing and Elegant PL/SQL Function Result Cache
The Amazing and Elegant PL/SQL Function Result CacheThe Amazing and Elegant PL/SQL Function Result Cache
The Amazing and Elegant PL/SQL Function Result Cache
 
Less08 managing data and concurrency
Less08 managing data and concurrencyLess08 managing data and concurrency
Less08 managing data and concurrency
 
Why User-Mode Threads Are Good for Performance
Why User-Mode Threads Are Good for PerformanceWhy User-Mode Threads Are Good for Performance
Why User-Mode Threads Are Good for Performance
 
Oracle Solaris 11.1 New Features
Oracle Solaris 11.1 New FeaturesOracle Solaris 11.1 New Features
Oracle Solaris 11.1 New Features
 
OSI_MySQL_Performance Schema
OSI_MySQL_Performance SchemaOSI_MySQL_Performance Schema
OSI_MySQL_Performance Schema
 
0396 oracle-goldengate-12c-tutorial
0396 oracle-goldengate-12c-tutorial0396 oracle-goldengate-12c-tutorial
0396 oracle-goldengate-12c-tutorial
 
Meetup my sql5.6_cluster
Meetup my sql5.6_clusterMeetup my sql5.6_cluster
Meetup my sql5.6_cluster
 
OUGLS 2016: Guided Tour On The MySQL Source Code
OUGLS 2016: Guided Tour On The MySQL Source CodeOUGLS 2016: Guided Tour On The MySQL Source Code
OUGLS 2016: Guided Tour On The MySQL Source Code
 
Oracle Database 12c - The Best Oracle Database 12c Tuning Features for Develo...
Oracle Database 12c - The Best Oracle Database 12c Tuning Features for Develo...Oracle Database 12c - The Best Oracle Database 12c Tuning Features for Develo...
Oracle Database 12c - The Best Oracle Database 12c Tuning Features for Develo...
 
Batch Applications for the Java Platform
Batch Applications for the Java PlatformBatch Applications for the Java Platform
Batch Applications for the Java Platform
 
D73549GC10_06.pptx
D73549GC10_06.pptxD73549GC10_06.pptx
D73549GC10_06.pptx
 
MySQL 5.7 NEW FEATURES, BETTER PERFORMANCE, AND THINGS THAT WILL BREAK -- Mid...
MySQL 5.7 NEW FEATURES, BETTER PERFORMANCE, AND THINGS THAT WILL BREAK -- Mid...MySQL 5.7 NEW FEATURES, BETTER PERFORMANCE, AND THINGS THAT WILL BREAK -- Mid...
MySQL 5.7 NEW FEATURES, BETTER PERFORMANCE, AND THINGS THAT WILL BREAK -- Mid...
 
Five more things about Oracle SQL and PLSQL
Five more things about Oracle SQL and PLSQLFive more things about Oracle SQL and PLSQL
Five more things about Oracle SQL and PLSQL
 
Less04 instance
Less04 instanceLess04 instance
Less04 instance
 
5675212318661411677_TRN4034_How_to_Migrate_to_Oracle_Autonomous_Database_Clou...
5675212318661411677_TRN4034_How_to_Migrate_to_Oracle_Autonomous_Database_Clou...5675212318661411677_TRN4034_How_to_Migrate_to_Oracle_Autonomous_Database_Clou...
5675212318661411677_TRN4034_How_to_Migrate_to_Oracle_Autonomous_Database_Clou...
 
Batch Applications for Java Platform 1.0: Java EE 7 and GlassFish
Batch Applications for Java Platform 1.0: Java EE 7 and GlassFishBatch Applications for Java Platform 1.0: Java EE 7 and GlassFish
Batch Applications for Java Platform 1.0: Java EE 7 and GlassFish
 
Oracle SQL Developer: 3 Features You're Not Using But Should Be
Oracle SQL Developer: 3 Features You're Not Using But Should BeOracle SQL Developer: 3 Features You're Not Using But Should Be
Oracle SQL Developer: 3 Features You're Not Using But Should Be
 
oracle upgrade 2015_509_Swonger_ppt.pptx
oracle upgrade 2015_509_Swonger_ppt.pptxoracle upgrade 2015_509_Swonger_ppt.pptx
oracle upgrade 2015_509_Swonger_ppt.pptx
 

More from Connor McDonald

Sangam 19 - PLSQL still the coolest
Sangam 19 - PLSQL still the coolestSangam 19 - PLSQL still the coolest
Sangam 19 - PLSQL still the coolestConnor McDonald
 
Sangam 19 - Analytic SQL
Sangam 19 - Analytic SQLSangam 19 - Analytic SQL
Sangam 19 - Analytic SQLConnor McDonald
 
UKOUG - 25 years of hints and tips
UKOUG - 25 years of hints and tipsUKOUG - 25 years of hints and tips
UKOUG - 25 years of hints and tipsConnor McDonald
 
Sangam 19 - Successful Applications on Autonomous
Sangam 19 - Successful Applications on AutonomousSangam 19 - Successful Applications on Autonomous
Sangam 19 - Successful Applications on AutonomousConnor McDonald
 
Sangam 2019 - The Latest Features
Sangam 2019 - The Latest FeaturesSangam 2019 - The Latest Features
Sangam 2019 - The Latest FeaturesConnor McDonald
 
UKOUG 2019 - SQL features
UKOUG 2019 - SQL featuresUKOUG 2019 - SQL features
UKOUG 2019 - SQL featuresConnor McDonald
 
APEX tour 2019 - successful development with autonomous
APEX tour 2019 - successful development with autonomousAPEX tour 2019 - successful development with autonomous
APEX tour 2019 - successful development with autonomousConnor McDonald
 
APAC Groundbreakers 2019 - Perth/Melbourne
APAC Groundbreakers 2019 - Perth/Melbourne APAC Groundbreakers 2019 - Perth/Melbourne
APAC Groundbreakers 2019 - Perth/Melbourne Connor McDonald
 
OOW19 - Flashback, not just for DBAs
OOW19 - Flashback, not just for DBAsOOW19 - Flashback, not just for DBAs
OOW19 - Flashback, not just for DBAsConnor McDonald
 
OOW19 - Read consistency
OOW19 - Read consistencyOOW19 - Read consistency
OOW19 - Read consistencyConnor McDonald
 
OOW19 - Slower and less secure applications
OOW19 - Slower and less secure applicationsOOW19 - Slower and less secure applications
OOW19 - Slower and less secure applicationsConnor McDonald
 
OOW19 - Killing database sessions
OOW19 - Killing database sessionsOOW19 - Killing database sessions
OOW19 - Killing database sessionsConnor McDonald
 
OOW19 - Ten Amazing SQL features
OOW19 - Ten Amazing SQL featuresOOW19 - Ten Amazing SQL features
OOW19 - Ten Amazing SQL featuresConnor McDonald
 
Latin America Tour 2019 - 18c and 19c featues
Latin America Tour 2019   - 18c and 19c featuesLatin America Tour 2019   - 18c and 19c featues
Latin America Tour 2019 - 18c and 19c featuesConnor McDonald
 
Latin America tour 2019 - Flashback
Latin America tour 2019 -  FlashbackLatin America tour 2019 -  Flashback
Latin America tour 2019 - FlashbackConnor McDonald
 
Latin America Tour 2019 - 10 great sql features
Latin America Tour 2019  - 10 great sql featuresLatin America Tour 2019  - 10 great sql features
Latin America Tour 2019 - 10 great sql featuresConnor McDonald
 
Latin America Tour 2019 - pattern matching
Latin America Tour 2019 - pattern matchingLatin America Tour 2019 - pattern matching
Latin America Tour 2019 - pattern matchingConnor McDonald
 
Latin America Tour 2019 - slow data and sql processing
Latin America Tour 2019  - slow data and sql processingLatin America Tour 2019  - slow data and sql processing
Latin America Tour 2019 - slow data and sql processingConnor McDonald
 

More from Connor McDonald (20)

Flashback ITOUG
Flashback ITOUGFlashback ITOUG
Flashback ITOUG
 
Sangam 19 - PLSQL still the coolest
Sangam 19 - PLSQL still the coolestSangam 19 - PLSQL still the coolest
Sangam 19 - PLSQL still the coolest
 
Sangam 19 - Analytic SQL
Sangam 19 - Analytic SQLSangam 19 - Analytic SQL
Sangam 19 - Analytic SQL
 
UKOUG - 25 years of hints and tips
UKOUG - 25 years of hints and tipsUKOUG - 25 years of hints and tips
UKOUG - 25 years of hints and tips
 
Sangam 19 - Successful Applications on Autonomous
Sangam 19 - Successful Applications on AutonomousSangam 19 - Successful Applications on Autonomous
Sangam 19 - Successful Applications on Autonomous
 
Sangam 2019 - The Latest Features
Sangam 2019 - The Latest FeaturesSangam 2019 - The Latest Features
Sangam 2019 - The Latest Features
 
UKOUG 2019 - SQL features
UKOUG 2019 - SQL featuresUKOUG 2019 - SQL features
UKOUG 2019 - SQL features
 
APEX tour 2019 - successful development with autonomous
APEX tour 2019 - successful development with autonomousAPEX tour 2019 - successful development with autonomous
APEX tour 2019 - successful development with autonomous
 
APAC Groundbreakers 2019 - Perth/Melbourne
APAC Groundbreakers 2019 - Perth/Melbourne APAC Groundbreakers 2019 - Perth/Melbourne
APAC Groundbreakers 2019 - Perth/Melbourne
 
OOW19 - Flashback, not just for DBAs
OOW19 - Flashback, not just for DBAsOOW19 - Flashback, not just for DBAs
OOW19 - Flashback, not just for DBAs
 
OOW19 - Read consistency
OOW19 - Read consistencyOOW19 - Read consistency
OOW19 - Read consistency
 
OOW19 - Slower and less secure applications
OOW19 - Slower and less secure applicationsOOW19 - Slower and less secure applications
OOW19 - Slower and less secure applications
 
OOW19 - Killing database sessions
OOW19 - Killing database sessionsOOW19 - Killing database sessions
OOW19 - Killing database sessions
 
OOW19 - Ten Amazing SQL features
OOW19 - Ten Amazing SQL featuresOOW19 - Ten Amazing SQL features
OOW19 - Ten Amazing SQL features
 
Latin America Tour 2019 - 18c and 19c featues
Latin America Tour 2019   - 18c and 19c featuesLatin America Tour 2019   - 18c and 19c featues
Latin America Tour 2019 - 18c and 19c featues
 
Latin America tour 2019 - Flashback
Latin America tour 2019 -  FlashbackLatin America tour 2019 -  Flashback
Latin America tour 2019 - Flashback
 
Latin America Tour 2019 - 10 great sql features
Latin America Tour 2019  - 10 great sql featuresLatin America Tour 2019  - 10 great sql features
Latin America Tour 2019 - 10 great sql features
 
Latin America Tour 2019 - pattern matching
Latin America Tour 2019 - pattern matchingLatin America Tour 2019 - pattern matching
Latin America Tour 2019 - pattern matching
 
Latin America Tour 2019 - slow data and sql processing
Latin America Tour 2019  - slow data and sql processingLatin America Tour 2019  - slow data and sql processing
Latin America Tour 2019 - slow data and sql processing
 
ANSI vs Oracle language
ANSI vs Oracle languageANSI vs Oracle language
ANSI vs Oracle language
 

Recently uploaded

Pigging Solutions Piggable Sweeping Elbows
Pigging Solutions Piggable Sweeping ElbowsPigging Solutions Piggable Sweeping Elbows
Pigging Solutions Piggable Sweeping ElbowsPigging Solutions
 
08448380779 Call Girls In Friends Colony Women Seeking Men
08448380779 Call Girls In Friends Colony Women Seeking Men08448380779 Call Girls In Friends Colony Women Seeking Men
08448380779 Call Girls In Friends Colony Women Seeking MenDelhi Call girls
 
Beyond Boundaries: Leveraging No-Code Solutions for Industry Innovation
Beyond Boundaries: Leveraging No-Code Solutions for Industry InnovationBeyond Boundaries: Leveraging No-Code Solutions for Industry Innovation
Beyond Boundaries: Leveraging No-Code Solutions for Industry InnovationSafe Software
 
Key Features Of Token Development (1).pptx
Key  Features Of Token  Development (1).pptxKey  Features Of Token  Development (1).pptx
Key Features Of Token Development (1).pptxLBM Solutions
 
Snow Chain-Integrated Tire for a Safe Drive on Winter Roads
Snow Chain-Integrated Tire for a Safe Drive on Winter RoadsSnow Chain-Integrated Tire for a Safe Drive on Winter Roads
Snow Chain-Integrated Tire for a Safe Drive on Winter RoadsHyundai Motor Group
 
WhatsApp 9892124323 ✓Call Girls In Kalyan ( Mumbai ) secure service
WhatsApp 9892124323 ✓Call Girls In Kalyan ( Mumbai ) secure serviceWhatsApp 9892124323 ✓Call Girls In Kalyan ( Mumbai ) secure service
WhatsApp 9892124323 ✓Call Girls In Kalyan ( Mumbai ) secure servicePooja Nehwal
 
Human Factors of XR: Using Human Factors to Design XR Systems
Human Factors of XR: Using Human Factors to Design XR SystemsHuman Factors of XR: Using Human Factors to Design XR Systems
Human Factors of XR: Using Human Factors to Design XR SystemsMark Billinghurst
 
#StandardsGoals for 2024: What’s new for BISAC - Tech Forum 2024
#StandardsGoals for 2024: What’s new for BISAC - Tech Forum 2024#StandardsGoals for 2024: What’s new for BISAC - Tech Forum 2024
#StandardsGoals for 2024: What’s new for BISAC - Tech Forum 2024BookNet Canada
 
Hyderabad Call Girls Khairatabad ✨ 7001305949 ✨ Cheap Price Your Budget
Hyderabad Call Girls Khairatabad ✨ 7001305949 ✨ Cheap Price Your BudgetHyderabad Call Girls Khairatabad ✨ 7001305949 ✨ Cheap Price Your Budget
Hyderabad Call Girls Khairatabad ✨ 7001305949 ✨ Cheap Price Your BudgetEnjoy Anytime
 
How to convert PDF to text with Nanonets
How to convert PDF to text with NanonetsHow to convert PDF to text with Nanonets
How to convert PDF to text with Nanonetsnaman860154
 
Artificial intelligence in the post-deep learning era
Artificial intelligence in the post-deep learning eraArtificial intelligence in the post-deep learning era
Artificial intelligence in the post-deep learning eraDeakin University
 
How to Remove Document Management Hurdles with X-Docs?
How to Remove Document Management Hurdles with X-Docs?How to Remove Document Management Hurdles with X-Docs?
How to Remove Document Management Hurdles with X-Docs?XfilesPro
 
08448380779 Call Girls In Civil Lines Women Seeking Men
08448380779 Call Girls In Civil Lines Women Seeking Men08448380779 Call Girls In Civil Lines Women Seeking Men
08448380779 Call Girls In Civil Lines Women Seeking MenDelhi Call girls
 
IAC 2024 - IA Fast Track to Search Focused AI Solutions
IAC 2024 - IA Fast Track to Search Focused AI SolutionsIAC 2024 - IA Fast Track to Search Focused AI Solutions
IAC 2024 - IA Fast Track to Search Focused AI SolutionsEnterprise Knowledge
 
Enhancing Worker Digital Experience: A Hands-on Workshop for Partners
Enhancing Worker Digital Experience: A Hands-on Workshop for PartnersEnhancing Worker Digital Experience: A Hands-on Workshop for Partners
Enhancing Worker Digital Experience: A Hands-on Workshop for PartnersThousandEyes
 
SIEMENS: RAPUNZEL – A Tale About Knowledge Graph
SIEMENS: RAPUNZEL – A Tale About Knowledge GraphSIEMENS: RAPUNZEL – A Tale About Knowledge Graph
SIEMENS: RAPUNZEL – A Tale About Knowledge GraphNeo4j
 
Transforming Data Streams with Kafka Connect: An Introduction to Single Messa...
Transforming Data Streams with Kafka Connect: An Introduction to Single Messa...Transforming Data Streams with Kafka Connect: An Introduction to Single Messa...
Transforming Data Streams with Kafka Connect: An Introduction to Single Messa...HostedbyConfluent
 
08448380779 Call Girls In Greater Kailash - I Women Seeking Men
08448380779 Call Girls In Greater Kailash - I Women Seeking Men08448380779 Call Girls In Greater Kailash - I Women Seeking Men
08448380779 Call Girls In Greater Kailash - I Women Seeking MenDelhi Call girls
 

Recently uploaded (20)

Pigging Solutions Piggable Sweeping Elbows
Pigging Solutions Piggable Sweeping ElbowsPigging Solutions Piggable Sweeping Elbows
Pigging Solutions Piggable Sweeping Elbows
 
08448380779 Call Girls In Friends Colony Women Seeking Men
08448380779 Call Girls In Friends Colony Women Seeking Men08448380779 Call Girls In Friends Colony Women Seeking Men
08448380779 Call Girls In Friends Colony Women Seeking Men
 
Beyond Boundaries: Leveraging No-Code Solutions for Industry Innovation
Beyond Boundaries: Leveraging No-Code Solutions for Industry InnovationBeyond Boundaries: Leveraging No-Code Solutions for Industry Innovation
Beyond Boundaries: Leveraging No-Code Solutions for Industry Innovation
 
Key Features Of Token Development (1).pptx
Key  Features Of Token  Development (1).pptxKey  Features Of Token  Development (1).pptx
Key Features Of Token Development (1).pptx
 
The transition to renewables in India.pdf
The transition to renewables in India.pdfThe transition to renewables in India.pdf
The transition to renewables in India.pdf
 
Snow Chain-Integrated Tire for a Safe Drive on Winter Roads
Snow Chain-Integrated Tire for a Safe Drive on Winter RoadsSnow Chain-Integrated Tire for a Safe Drive on Winter Roads
Snow Chain-Integrated Tire for a Safe Drive on Winter Roads
 
WhatsApp 9892124323 ✓Call Girls In Kalyan ( Mumbai ) secure service
WhatsApp 9892124323 ✓Call Girls In Kalyan ( Mumbai ) secure serviceWhatsApp 9892124323 ✓Call Girls In Kalyan ( Mumbai ) secure service
WhatsApp 9892124323 ✓Call Girls In Kalyan ( Mumbai ) secure service
 
Human Factors of XR: Using Human Factors to Design XR Systems
Human Factors of XR: Using Human Factors to Design XR SystemsHuman Factors of XR: Using Human Factors to Design XR Systems
Human Factors of XR: Using Human Factors to Design XR Systems
 
E-Vehicle_Hacking_by_Parul Sharma_null_owasp.pptx
E-Vehicle_Hacking_by_Parul Sharma_null_owasp.pptxE-Vehicle_Hacking_by_Parul Sharma_null_owasp.pptx
E-Vehicle_Hacking_by_Parul Sharma_null_owasp.pptx
 
#StandardsGoals for 2024: What’s new for BISAC - Tech Forum 2024
#StandardsGoals for 2024: What’s new for BISAC - Tech Forum 2024#StandardsGoals for 2024: What’s new for BISAC - Tech Forum 2024
#StandardsGoals for 2024: What’s new for BISAC - Tech Forum 2024
 
Hyderabad Call Girls Khairatabad ✨ 7001305949 ✨ Cheap Price Your Budget
Hyderabad Call Girls Khairatabad ✨ 7001305949 ✨ Cheap Price Your BudgetHyderabad Call Girls Khairatabad ✨ 7001305949 ✨ Cheap Price Your Budget
Hyderabad Call Girls Khairatabad ✨ 7001305949 ✨ Cheap Price Your Budget
 
How to convert PDF to text with Nanonets
How to convert PDF to text with NanonetsHow to convert PDF to text with Nanonets
How to convert PDF to text with Nanonets
 
Artificial intelligence in the post-deep learning era
Artificial intelligence in the post-deep learning eraArtificial intelligence in the post-deep learning era
Artificial intelligence in the post-deep learning era
 
How to Remove Document Management Hurdles with X-Docs?
How to Remove Document Management Hurdles with X-Docs?How to Remove Document Management Hurdles with X-Docs?
How to Remove Document Management Hurdles with X-Docs?
 
08448380779 Call Girls In Civil Lines Women Seeking Men
08448380779 Call Girls In Civil Lines Women Seeking Men08448380779 Call Girls In Civil Lines Women Seeking Men
08448380779 Call Girls In Civil Lines Women Seeking Men
 
IAC 2024 - IA Fast Track to Search Focused AI Solutions
IAC 2024 - IA Fast Track to Search Focused AI SolutionsIAC 2024 - IA Fast Track to Search Focused AI Solutions
IAC 2024 - IA Fast Track to Search Focused AI Solutions
 
Enhancing Worker Digital Experience: A Hands-on Workshop for Partners
Enhancing Worker Digital Experience: A Hands-on Workshop for PartnersEnhancing Worker Digital Experience: A Hands-on Workshop for Partners
Enhancing Worker Digital Experience: A Hands-on Workshop for Partners
 
SIEMENS: RAPUNZEL – A Tale About Knowledge Graph
SIEMENS: RAPUNZEL – A Tale About Knowledge GraphSIEMENS: RAPUNZEL – A Tale About Knowledge Graph
SIEMENS: RAPUNZEL – A Tale About Knowledge Graph
 
Transforming Data Streams with Kafka Connect: An Introduction to Single Messa...
Transforming Data Streams with Kafka Connect: An Introduction to Single Messa...Transforming Data Streams with Kafka Connect: An Introduction to Single Messa...
Transforming Data Streams with Kafka Connect: An Introduction to Single Messa...
 
08448380779 Call Girls In Greater Kailash - I Women Seeking Men
08448380779 Call Girls In Greater Kailash - I Women Seeking Men08448380779 Call Girls In Greater Kailash - I Women Seeking Men
08448380779 Call Girls In Greater Kailash - I Women Seeking Men
 

New PLSQL in Oracle Database 12c

  • 1. Copyright © 2012, Oracle and/or its affiliates. All rights reserved. Confidential – Oracle Restricted1 New SQL & PL/SQL Capabilities in Oracle Database 12c Thomas Kyte http://asktom.oracle.com/
  • 2. Copyright © 2012, Oracle and/or its affiliates. All rights reserved. Confidential – Oracle Restricted2 The following is intended to outline our general product direction. It is intended for information purposes only, and may not be incorporated into any contract. It is not a commitment to deliver any material, code, or functionality, and should not be relied upon in making purchasing decisions. The development, release, and timing of any features or functionality described for Oracle’s products remains at the sole discretion of Oracle. Small print
  • 3. Copyright © 2012, Oracle and/or its affiliates. All rights reserved. Confidential – Oracle Restricted3 PL/SQL  More Bind Types – Booleans – PL/SQL Records – PL/SQL Collections
  • 4. Copyright © 2012, Oracle and/or its affiliates. All rights reserved. Confidential – Oracle Restricted4 PL/SQL c##tkyte%CDB1> CREATE OR REPLACE PROCEDURE p (x BOOLEAN) AUTHID CURRENT_USER AS 2 BEGIN 3 IF x THEN 4 DBMS_OUTPUT.PUT_LINE('x is true'); 5 END IF; 6 END; 7 / Procedure created.
  • 5. Copyright © 2012, Oracle and/or its affiliates. All rights reserved. Confidential – Oracle Restricted5 PL/SQL ops$tkyte%ORA11GR2> DECLARE 2 dyn_stmt VARCHAR2(200); 3 b BOOLEAN := TRUE; 4 BEGIN 5 dyn_stmt := 'BEGIN p(:x); END;'; 6 EXECUTE IMMEDIATE dyn_stmt USING b; 7 END; 8 / EXECUTE IMMEDIATE dyn_stmt USING b; * ERROR at line 6: ORA-06550: line 6, column 36: PLS-00457: expressions have to be of SQL types ORA-06550: line 6, column 3: PL/SQL: Statement ignored
  • 6. Copyright © 2012, Oracle and/or its affiliates. All rights reserved. Confidential – Oracle Restricted6 PL/SQL c##tkyte%CDB1> DECLARE 2 dyn_stmt VARCHAR2(200); 3 b BOOLEAN := TRUE; 4 BEGIN 5 dyn_stmt := 'BEGIN p(:x); END;'; 6 EXECUTE IMMEDIATE dyn_stmt USING b; 7 END; 8 / x is true PL/SQL procedure successfully completed.
  • 7. Copyright © 2012, Oracle and/or its affiliates. All rights reserved. Confidential – Oracle Restricted7 PL/SQL  Query PL/SQL Table Type Directly – No more need to create SQL Types – Less namespace clutter
  • 8. Copyright © 2012, Oracle and/or its affiliates. All rights reserved. Confidential – Oracle Restricted8 PL/SQL c##tkyte%CDB1> create or replace package my_pkg 2 as 3 type my_collection is table of emp%rowtype; 4 5 procedure p; 6 end my_pkg; 7 / Package created.
  • 9. Copyright © 2012, Oracle and/or its affiliates. All rights reserved. Confidential – Oracle Restricted9 PL/SQL c##tkyte%CDB1> create or replace package body my_pkg 2 as 3 4 procedure p 5 is 6 l_data my_collection; 7 begin 8 select * bulk collect into l_data from emp; 9 10 for x in (select * from TABLE(l_data)) 11 loop 12 dbms_output.put_line( x.ename ); 13 end loop; 14 end; 15 16 end my_pkg; 17 / Package body created.
  • 10. Copyright © 2012, Oracle and/or its affiliates. All rights reserved. Confidential – Oracle Restricted10 PL/SQL ops$tkyte%ORA11GR2> show err Errors for PACKAGE BODY MY_PKG: LINE/COL ERROR -------- ----------------------------------------------------------------- 10/15 PL/SQL: SQL Statement ignored 10/29 PL/SQL: ORA-22905: cannot access rows from a non-nested table item 10/35 PLS-00642: local collection types not allowed in SQL statements 12/9 PL/SQL: Statement ignored 12/31 PLS-00364: loop index variable 'X' use is invalid
  • 11. Copyright © 2012, Oracle and/or its affiliates. All rights reserved. Confidential – Oracle Restricted11 PL/SQL  Grant Roles to Code – Especially useful for invokers rights routines – Code will run with current set of privileges of the Invoker plus that role(s) – Role is only enabled during execution of that procedure – Also, INHERIT PRIVILEGES – new privilege
  • 12. Copyright © 2012, Oracle and/or its affiliates. All rights reserved. Confidential – Oracle Restricted12 Granting a role to a PL/SQL unit  Consider this best practice • Give access to an application’s data only via PL/SQL subprograms • Reinforce this by having end-user sessions authorize as a different database owner than the one that owns the application’s artifacts • Arrange this by using definer’s rights units in a single schema or a couple of schemas. Then grant Execute on these to end-users – but don’t grant privileges on the tables to end-users  This means that each unit can access very many tables because the owner of the units can
  • 13. Copyright © 2012, Oracle and/or its affiliates. All rights reserved. Confidential – Oracle Restricted13 Granting a role to a PL/SQL unit  12.1 lets us have a fine-grained scheme where each unit with the same owner can have different privileges on the owner’s tables • The end-user is low-privileged, just as in the old scheme • The units are invoker’s rights, so “as is” would not allow end- users to access the data • The privilege for each unit is elevated for exactly and only that unit’s purpose by granting a role that has the appropriate privileges to the unit. Such a role cannot be disabled. • The unit’s owner must already have that same role (but it need not be enabled)
  • 14. Copyright © 2012, Oracle and/or its affiliates. All rights reserved. Confidential – Oracle Restricted14 Granting a role to a PL/SQL unit  This scenario lets us illustrate the idea • There are two users App and Client • There are two tables App.t1 and App.t2 • There are two IR procedures App.Show_t1 and App.Show_t2 to run select statements against the tables • Client has Execute on App.Show_t1 and App.Show_t2 • App creates two roles r_Show_t1 and r_Show_t2 • App grants Select on App.t1 to r_Show_t1 – and similar for ~2 • App grants r_Show_t1 to App.Show_t1 – and similar for ~2
  • 15. Copyright © 2012, Oracle and/or its affiliates. All rights reserved. Confidential – Oracle Restricted15 Granting a role to a PL/SQL unit create procedure Show_t1 authid Current_User is begin for j in (select Fact from App.t1 order by 1) loop -- Notice the schema-qualification ... end loop; end Show_t1; / grant Execute on App.Show_t1 to Client / -- this has the side-effect of granting the role to App with Admin option -- other non-schema object types like directories and editions behave the same create role r_Show_t1 / grant select on t1 to r_Show_t1 / grant r_Show_t1 to procedure Show_t1 / select Object_Name, Object_Type, Role from User_Code_Role_Privs / ....... ......... ......... SHOW_T1 PROCEDURE R_SHOW_T1
  • 16. Copyright © 2012, Oracle and/or its affiliates. All rights reserved. Confidential – Oracle Restricted16 Granting a role to a PL/SQL unit  When Client invokes App.Show_t1, then no matter what careless mistakes the programmer of the procedure might later make, its power is limited to just what the role confers.
  • 17. Copyright © 2012, Oracle and/or its affiliates. All rights reserved. Confidential – Oracle Restricted17 PL/SQL  White List – ‘Accessible By’ clause – Specifies a specific list of code that can invoke your code – Fine grained privilege to protect code
  • 18. Copyright © 2012, Oracle and/or its affiliates. All rights reserved. Confidential – Oracle Restricted18 accessible by clause package Helper authid Definer accessible by (Good_Guy, Bad_Guy) is procedure p; end Helper; package body Good_Guy is procedure p is begin Helper.p(); ... end p; end Good_Guy; package body Bad_Guy is procedure p is begin Helper.p(); ... end p; end Bad_Guy; PLS-00904: insufficient privilege to access object HELPER _______
  • 19. Copyright © 2012, Oracle and/or its affiliates. All rights reserved. Confidential – Oracle Restricted19 Even better PL/SQL from SQL
  • 20. Copyright © 2012, Oracle and/or its affiliates. All rights reserved. Confidential – Oracle Restricted20 Defining a PL/SQL function in the with clause of a subquery function Print(n in integer) return varchar2 authid Definer is K constant number not null := 1024; M constant number not null := K*K; G constant number not null := M*K; T constant number not null := G*K; begin return case when n <= K-1 then To_Char(n, '999999')||'byte' when n/K <= K-1 then To_Char(n/K, '999999')||'K' when n/M <= K-1 then To_Char(n/M, '999999')||'M' when n/G <= K-1 then To_Char(n/G, '999999')||'G' else To_Char(n/T, '999999')||'T' end; end Print;  Use case: pretty-print an integer as a multiple of an appropriate power of 1024: plain, K, M, B, or T
  • 21. Copyright © 2012, Oracle and/or its affiliates. All rights reserved. Confidential – Oracle Restricted21 Use the PL/SQL function in SQL on a table with three number columns select PK, Print(n1) "n1", Print(n2) "n2", Print(n3) "n3" from t 1 1 K 1 G 566 G 2 1 K 157 M 416 G 3 2 K 1 G 971 G 4 578 byte 1 G 1 T 5 2 K 1 G 220 G 6 1 K 2 G 1 T 7 48 byte 1 G 2 T 8 992 byte 42 M 3 T 9 794 byte 2 G 1 T 10 2 K 302 M 672 G
  • 22. Copyright © 2012, Oracle and/or its affiliates. All rights reserved. Confidential – Oracle Restricted22 Try it in pure SQL! select PK, case when n1 <= 1023 then To_Char(n1, '999999')||' byte' when n1/1024 <= 1023 then To_Char(n1/1024, '999999')||' K' when n1/1048576 <= 1023 then To_Char(n1/1048576, '999999')||' M' when n1/1073741824 <= 1023 then To_Char(n1/1073741824, '999999')||' G' else To_Char(n1/1099511627776, '999999')||' T' end "n1", case when n2 <= 1023 then To_Char(n2, '999999')||' byte' when n2/1024 <= 1023 then To_Char(n2/1024, '999999')||' K' when n2/1048576 <= 1023 then To_Char(n2/1048576, '999999')||' M' when n2/1073741824 <= 1023 then To_Char(n2/1073741824, '999999')||' G' else To_Char(n2/1099511627776, '999999')||' T' end "n2", case when n3 <= 1023 then To_Char(n3, '999999')||' byte' when n3/1024 <= 1023 then To_Char(n3/1024, '999999')||' K' when n3/1048576 <= 1023 then To_Char(n3/1048576, '999999')||' M' when n3/1073741824 <= 1023 then To_Char(n3/1073741824, '999999')||' G' else To_Char(n3/1099511627776, '999999')||' T' end "n3" from t
  • 23. Copyright © 2012, Oracle and/or its affiliates. All rights reserved. Confidential – Oracle Restricted23 Get the performance of SQL with the clarity and reusability of PL/SQL function Print(n in integer) return varchar2 authid Definer is K constant number not null := 1024; M constant number not null := K*K; G constant number not null := M*K; T constant number not null := G*K; begin return case when n <= K-1 then To_Char(n, '999999')||'byte' when n/K <= K-1 then To_Char(n/K, '999999')||'K' when n/M <= K-1 then To_Char(n/M, '999999')||'M' when n/G <= K-1 then To_Char(n/G, '999999')||'G' else To_Char(n/T, '999999')||'T' end; end Print; pragma UDF;
  • 24. Copyright © 2012, Oracle and/or its affiliates. All rights reserved. Confidential – Oracle Restricted24 Declare the PL/SQL function in the subquery’s with clause function Print(n in integer) return varchar2 is K constant number not null := 1024; M constant number not null := K*K; G constant number not null := M*K; T constant number not null := G*K; begin return case when n <= K-1 then To_Char(n, '999999')||' byte' when n/K <= K-1 then To_Char(n/K, '999999')||' K' when n/M <= K-1 then To_Char(n/M, '999999')||' M' when n/G <= K-1 then To_Char(n/G, '999999')||' G' else To_Char(n/T, '999999')||' T' end; end Print; select PK, Print(n1) "n1", Print(n2) "n2", Print(n3) "n3" from t with
  • 25. Copyright © 2012, Oracle and/or its affiliates. All rights reserved. Confidential – Oracle Restricted25 Performance comparison  Pure SQL is fastest  Schema-level function with pragma UDF is close  Function in the with clause is similar  Pre-12.1 ordinary schema-level function is very much the slowest 1.0 – the baseline 3.8x 3.9x 5.0x
  • 26. Copyright © 2012, Oracle and/or its affiliates. All rights reserved. Confidential – Oracle Restricted26 Better client binding
  • 27. Copyright © 2012, Oracle and/or its affiliates. All rights reserved. Confidential – Oracle Restricted27 Improved support for binding PL/SQL types in JDBC  Before 12.1 • Generate a schema level object type to mirror the structure of the non-SQL package type • Populate and bind the object into a custom PL/SQL wrapper around the desired PL/SQL subprogram • Convert the object to the package type in the wrapper and call the PL/SQL subprogram with the package type
  • 28. Copyright © 2012, Oracle and/or its affiliates. All rights reserved. Confidential – Oracle Restricted28 Improved support for binding PL/SQL types in JDBC  New in 12.1 • PL/SQL package types supported as binds in JDBC • Can now execute PL/SQL subprograms with non-SQL types • Supported types include records, index-by tables, nested tables and varrays • Table%rowtype, view%rowtype and package defined cursor%rowtype also supported. They’re technically record types
  • 29. Copyright © 2012, Oracle and/or its affiliates. All rights reserved. Confidential – Oracle Restricted29 Example1: Bind a single record from Java into a PL/SQL procedure, modify it, and bind it back out to Java package Emp_Info is type employee is record(First_Name Employees.First_Name%type, Last_Name Employees.Last_Name%type, Employee_Id Employees.Employee_Id%type, Is_CEO boolean); procedure Get_Emp_Name(Emp_p in out Employee); end;
  • 30. Copyright © 2012, Oracle and/or its affiliates. All rights reserved. Confidential – Oracle Restricted30 Example1:  Use the EmpinfoEmployee class, generated by JPub, to implement the Employee formal parameter { … EmpinfoEmployee Employee = new EmpinfoEmployee(); Employee.setEmployeeId(new java.math.BigDecimal(100)); // Use Employee ID 100 // Call Get_Emp_Name() with the Employee object OracleCallableStatement cstmt = (OracleCallableStatement)conn.prepareCall("call EmpInfo.Get_Emp_Name(?)"); cstmt.setObject(1, Employee, OracleTypes.STRUCT); // Use "PACKAGE.TYPE NAME" as the type name cstmt.registerOutParameter(1, OracleTypes.STRUCT, "EMPINFO.EMPLOYEE"); cstmt.execute(); // Get and print the contents of the Employee object EmpinfoEmployee oraData = (EmpinfoEmployee)cstmt.getORAData(1, EmpinfoEmployee.getORADataFactory()); System.out.println("Employee: " + oraData.getFirstName() + " " + oraData.getLastName()); System.out.println("Is the CEO? " + oraData.getIsceo()); }
  • 31. Copyright © 2012, Oracle and/or its affiliates. All rights reserved. Confidential – Oracle Restricted31 Example 2: populate a collection of table%rowtype using a bulk collect statement, and pass the collection as an out parameter back to the caller package EmpRow is type Table_of_Emp is table of Employees%Rowtype; procedure GetEmps(Out_Rows out Table_of_Emp); end; package Body EmpRow is procedure GetEmps(Out_Rows out Table_of_Emp) is begin select * bulk collect into Out_Rows from Employees; end; end;
  • 32. Copyright © 2012, Oracle and/or its affiliates. All rights reserved. Confidential – Oracle Restricted32 Example 2: { … // Call GetEmps() to get the ARRAY of table row data objects CallableStatement cstmt = conn.prepareCall("call EmpRow.GetEmps(?)"); // Use "PACKAGE.COLLECTION NAME" as the type name cstmt.registerOutParameter(1, OracleTypes.ARRAY, "EMPROW.TABLE_OF_EMP"); cstmt.execute(); // Print the Employee Table rows Array a = cstmt.getArray(1); String s = Debug.printArray ((ARRAY)a, "", ((ARRAY)a).getSQLTypeName () +"( ", conn); System.out.println(s); }
  • 33. Copyright © 2012, Oracle and/or its affiliates. All rights reserved. Confidential – Oracle Restricted33 Improved Introspection
  • 34. Copyright © 2012, Oracle and/or its affiliates. All rights reserved. Confidential – Oracle Restricted34 Improved call stack introspection  Before 12.1, you used three functions in the DBMS_Utility package • Format_Call_Stack() • Format_Error_Stack() • Format_Error_Backtrace()  New in 12.1 • The package UTL_Call_Stack solves the same problem properly
  • 35. Copyright © 2012, Oracle and/or its affiliates. All rights reserved. Confidential – Oracle Restricted35 Code to be introspected package body Pkg is procedure p is procedure q is procedure r is procedure p is begin Print_Call_Stack(); end p; begin p(); end r; begin r(); end q; begin q(); end p; end Pkg;
  • 36. Copyright © 2012, Oracle and/or its affiliates. All rights reserved. Confidential – Oracle Restricted36 Pre 12.1 Print_Call_Stack() procedure Print_Call_Stack authid Definer is Depth pls_integer := UTL_Call_Stack.Dynamic_Depth(); begin DBMS_Output.Put_Line(DBMS_Utility.Format_Call_Stack()); end; ----- PL/SQL Call Stack ----- object line object handle number name 0x631f6e88 12 procedure USR.PRINT_CALL_STACK 0x68587700 7 package body USR.PKG 0x68587700 10 package body USR.PKG 0x68587700 13 package body USR.PKG 0x68587700 16 package body USR.PKG 0x69253ca8 1 anonymous block
  • 37. Copyright © 2012, Oracle and/or its affiliates. All rights reserved. Confidential – Oracle Restricted37 12.1 Print_Call_Stack() procedure Print_Call_Stack authid Definer is Depth pls_integer := UTL_Call_Stack.Dynamic_Depth(); begin for j in reverse 2..Depth loop DBMS_Output.Put_Line( (j - 1)|| To_Char(UTL_Call_Stack.Unit_Line(j), '99')|| UTL_Call_Stack.Concatenate_Subprogram(UTL_Call_Stack.Subprogram(j))); end loop; end; 5 1 __anonymous_block 4 16 PKG.P 3 13 PKG.P.Q 2 10 PKG.P.Q.R 1 7 PKG.P.Q.R.P
  • 38. Copyright © 2012, Oracle and/or its affiliates. All rights reserved. Confidential – Oracle Restricted38 Improved call stack introspection  Symmetrical subprograms for error stack and backtrace  Plus • Owner(Depth) • Current_Edition(Depth) • Lexical_Depth(Depth)
  • 39. Copyright © 2012, Oracle and/or its affiliates. All rights reserved. Confidential – Oracle Restricted39 Agenda  Improved client <> PL/SQL <> SQL interoperability  A new security capability  Improved programmer usability  Miscellaneous
  • 40. Copyright © 2012, Oracle and/or its affiliates. All rights reserved. Confidential – Oracle Restricted40 Invisible Columns
  • 41. Copyright © 2012, Oracle and/or its affiliates. All rights reserved. Confidential – Oracle Restricted41 Invisible Columns ops$tkyte%ORA12CR1> create table t 2 ( x int, 3 y int 4 ) 5 / Table created. ops$tkyte%ORA12CR1> insert into t values ( 1, 2 ); 1 row created.
  • 42. Copyright © 2012, Oracle and/or its affiliates. All rights reserved. Confidential – Oracle Restricted42 Invisible Columns ops$tkyte%ORA12CR1> alter table t add ( z int INVISIBLE ); Table altered.
  • 43. Copyright © 2012, Oracle and/or its affiliates. All rights reserved. Confidential – Oracle Restricted43 Invisible Columns ops$tkyte%ORA12CR1> desc t Name Null? Type ----------------- -------- ------------ X NUMBER(38) Y NUMBER(38)
  • 44. Copyright © 2012, Oracle and/or its affiliates. All rights reserved. Confidential – Oracle Restricted44 Invisible Columns ops$tkyte%ORA12CR1> insert into t values ( 3, 4 ); 1 row created.
  • 45. Copyright © 2012, Oracle and/or its affiliates. All rights reserved. Confidential – Oracle Restricted45 Invisible Columns ops$tkyte%ORA12CR1> select * from t; X Y ---------- ---------- 1 2 3 4
  • 46. Copyright © 2012, Oracle and/or its affiliates. All rights reserved. Confidential – Oracle Restricted46 Invisible Columns ops$tkyte%ORA12CR1> insert into t (x,y,z) values ( 5,6,7 ); 1 row created. ops$tkyte%ORA12CR1> select x, y, z from t; X Y Z ---------- ---------- ---------- 1 2 3 4 5 6 7
  • 47. Copyright © 2012, Oracle and/or its affiliates. All rights reserved. Confidential – Oracle Restricted47 Invisible Columns ops$tkyte%ORA12CR1> alter table t modify z visible; Table altered. ops$tkyte%ORA12CR1> select * from t; X Y Z ---------- ---------- ---------- 1 2 3 4 5 6 7
  • 48. Copyright © 2012, Oracle and/or its affiliates. All rights reserved. Confidential – Oracle Restricted48 Multiple Same Column Indexes
  • 49. Copyright © 2012, Oracle and/or its affiliates. All rights reserved. Confidential – Oracle Restricted49 Indexing ops$tkyte%ORA11GR2> create table t ( x int, y int, z int ); Table created. ops$tkyte%ORA11GR2> create index t_idx on t(x,y); Index created. ops$tkyte%ORA11GR2> create bitmap index t_idx2 on t(x,y); create bitmap index t_idx2 on t(x,y) * ERROR at line 1: ORA-01408: such column list already indexed ops$tkyte%ORA11GR2> create bitmap index t_idx2 on t(x,y) invisible; create bitmap index t_idx2 on t(x,y) invisible * ERROR at line 1: ORA-01408: such column list already indexed
  • 50. Copyright © 2012, Oracle and/or its affiliates. All rights reserved. Confidential – Oracle Restricted50 Indexing ops$tkyte%ORA12CR1> create table t ( x int, y int, z int ); Table created. ops$tkyte%ORA12CR1> create index t_idx on t(x,y); Index created. ops$tkyte%ORA12CR1> create bitmap index t_idx2 on t(x,y) invisible; Index created.
  • 51. Copyright © 2012, Oracle and/or its affiliates. All rights reserved. Confidential – Oracle Restricted51 Indexing ops$tkyte%ORA12CR1> alter session set optimizer_use_invisible_indexes=true; Session altered. ops$tkyte%ORA12CR1> exec dbms_stats.set_table_stats( user, 'T', numrows => 1000000, numblks => 100000 ); PL/SQL procedure successfully completed.
  • 52. Copyright © 2012, Oracle and/or its affiliates. All rights reserved. Confidential – Oracle Restricted52 Indexing ops$tkyte%ORA12CR1> set autotrace traceonly explain ops$tkyte%ORA12CR1> select count(*) from t; Execution Plan ---------------------------------------------------------- Plan hash value: 1106681275 --------------------------------------------------------------------- | Id | Operation | Name | Rows | Cost (%CPU)| --------------------------------------------------------------------- | 0 | SELECT STATEMENT | | 1 | 0 (0)| | 1 | SORT AGGREGATE | | 1 | | | 2 | BITMAP CONVERSION COUNT | | 1000K| | | 3 | BITMAP INDEX FAST FULL SCAN| T_IDX2 | | | --------------------------------------------------------------------- ops$tkyte%ORA12CR1> set autotrace off
  • 53. Copyright © 2012, Oracle and/or its affiliates. All rights reserved. Confidential – Oracle Restricted53 Temporal Validity
  • 54. Copyright © 2012, Oracle and/or its affiliates. All rights reserved. Confidential – Oracle Restricted54 Temporal Validity ops$tkyte%ORA12CR1> create table addresses 2 ( empno number, 3 addr_data varchar2(30), 4 start_date date, 5 end_date date, 6 period for valid(start_date,end_date) 7 ) 8 / Table created.
  • 55. Copyright © 2012, Oracle and/or its affiliates. All rights reserved. Confidential – Oracle Restricted55 Temporal Validity ops$tkyte%ORA12CR1> insert into addresses (empno, addr_data, start_date, end_date ) 2 values ( 1234, '123 Main Street', trunc(sysdate-5), trunc(sysdate-2) ); 1 row created. ops$tkyte%ORA12CR1> insert into addresses (empno, addr_data, start_date, end_date ) 2 values ( 1234, '456 Fleet Street', trunc(sysdate-1), trunc(sysdate+1) ); 1 row created. ops$tkyte%ORA12CR1> insert into addresses (empno, addr_data, start_date, end_date ) 2 values ( 1234, '789 1st Ave', trunc(sysdate+2), null ); 1 row created.
  • 56. Copyright © 2012, Oracle and/or its affiliates. All rights reserved. Confidential – Oracle Restricted56 Temporal Validity ops$tkyte%ORA12CR1> select * from addresses; EMPNO ADDR_DATA START_DAT END_DATE ---------- ------------------------------ --------- --------- 1234 123 Main Street 12-MAY-13 15-MAY-13 1234 456 Fleet Street 16-MAY-13 18-MAY-13 1234 789 1st Ave 19-MAY-13
  • 57. Copyright © 2012, Oracle and/or its affiliates. All rights reserved. Confidential – Oracle Restricted57 Temporal Validity ops$tkyte%ORA12CR1> select * from addresses as of period for valid sysdate-3; EMPNO ADDR_DATA START_DAT END_DATE ---------- ------------------------------ --------- --------- 1234 123 Main Street 12-MAY-13 15-MAY-13 ops$tkyte%ORA12CR1> select * from addresses as of period for valid sysdate; EMPNO ADDR_DATA START_DAT END_DATE ---------- ------------------------------ --------- --------- 1234 456 Fleet Street 16-MAY-13 18-MAY-13 ops$tkyte%ORA12CR1> select * from addresses as of period for valid sysdate+3; EMPNO ADDR_DATA START_DAT END_DATE ---------- ------------------------------ --------- --------- 1234 789 1st Ave 19-MAY-13
  • 58. Copyright © 2012, Oracle and/or its affiliates. All rights reserved. Confidential – Oracle Restricted58 SQL Text Expansion
  • 59. Copyright © 2012, Oracle and/or its affiliates. All rights reserved. Confidential – Oracle Restricted59 SQL Text Expansion ops$tkyte%ORA12CR1> variable x clob ops$tkyte%ORA12CR1> begin 2 dbms_utility.expand_sql_text 3 ( input_sql_text => 'select * from all_users', 4 output_sql_text => :x ); 5 end; 6 / PL/SQL procedure successfully completed.
  • 60. Copyright © 2012, Oracle and/or its affiliates. All rights reserved. Confidential – Oracle Restricted60 SQL Text Expansion ops$tkyte%ORA12CR1> print x X -------------------------------------------------------------------------------- SELECT "A1"."USERNAME" "USERNAME","A1"."USER_ID" "USER_ID","A1"."CREATED" "CREAT ED","A1"."COMMON" "COMMON" FROM (SELECT "A4"."NAME" "USERNAME","A4"."USER#" "US ER_ID","A4"."CTIME" "CREATED",DECODE(BITAND("A4"."SPARE1",128),128,'YES','NO') " COMMON" FROM "SYS"."USER$" "A4","SYS"."TS$" "A3","SYS"."TS$" "A2" WHERE "A4"."DA TATS#"="A3"."TS#" AND "A4"."TEMPTS#"="A2"."TS#" AND "A4"."TYPE#"=1) "A1"
  • 61. Copyright © 2012, Oracle and/or its affiliates. All rights reserved. Confidential – Oracle Restricted61 SQL Text Expansion ops$tkyte%ORA12CR1> create or replace 2 function my_security_function( p_schema in varchar2, 3 p_object in varchar2 ) 4 return varchar2 5 as 6 begin 7 return 'owner = USER'; 8 end; 9 / Function created.
  • 62. Copyright © 2012, Oracle and/or its affiliates. All rights reserved. Confidential – Oracle Restricted62 SQL Text Expansion ops$tkyte%ORA12CR1> create table my_table 2 ( data varchar2(30), 3 OWNER varchar2(30) default USER 4 ) 5 / Table created.
  • 63. Copyright © 2012, Oracle and/or its affiliates. All rights reserved. Confidential – Oracle Restricted63 SQL Text Expansion ops$tkyte%ORA12CR1> begin 2 dbms_rls.add_policy 3 ( object_schema => user, 4 object_name => 'MY_TABLE', 5 policy_name => 'MY_POLICY', 6 function_schema => user, 7 policy_function => 'My_Security_Function', 8 statement_types => 'select, insert, update, delete' , 9 update_check => TRUE ); 10 end; 11 / PL/SQL procedure successfully completed.
  • 64. Copyright © 2012, Oracle and/or its affiliates. All rights reserved. Confidential – Oracle Restricted64 SQL Text Expansion ops$tkyte%ORA12CR1> begin 2 dbms_utility.expand_sql_text 3 ( input_sql_text => 'select * from my_table', 4 output_sql_text => :x ); 5 end; 6 / PL/SQL procedure successfully completed. ops$tkyte%ORA12CR1> print x X -------------------------------------------------------------------------------- SELECT "A1"."DATA" "DATA","A1"."OWNER" "OWNER" FROM (SELECT "A2"."DATA" "DATA", "A2"."OWNER" "OWNER" FROM "OPS$TKYTE"."MY_TABLE" "A2" WHERE "A2"."OWNER"=USER@!) "A1"
  • 65. Copyright © 2012, Oracle and/or its affiliates. All rights reserved. Confidential – Oracle Restricted65 Etc…
  • 66. Copyright © 2012, Oracle and/or its affiliates. All rights reserved. Confidential – Oracle Restricted66 Other enhancements brought by 12.1  Improved Defaults  Row Limiting Clause  Row Pattern Matching  Partitioning Improvements  Temporary Undo
  • 67. Copyright © 2012, Oracle and/or its affiliates. All rights reserved. Confidential – Oracle Restricted67 Other enhancements brought by 12.1  You can now result-cache an invoker’s rights function (the current user becomes part of the cache lookup key)  Safe callouts (implemented via extproc) are faster (motivated by Oracle R Enterprise – which saw a 20x speedup)  Edition-based redefinition can now be adopted without needing to change how objects are disposed among schemas – so no reason at all for you not to use EBR for every patch that changes only PL/SQL, views, or synonyms
  • 68. Copyright © 2012, Oracle and/or its affiliates. All rights reserved. Confidential – Oracle Restricted68