SlideShare a Scribd company logo
Copyright © 2017, Oracle and/or its affiliates. All rights reserved. |
12 Things Developers Will Love About
Oracle Database 12c Release 2
Chris Saxon
Oracle Developer Advocate for SQL
blogs.oracle.com/sql
@chrisrsaxon & @SQLDaily
youtube.com/c/TheMagicOfSQL
blogs.oracle.com/sql www.youtube.com/c/TheMagicOfSQL @ChrisRSaxon
Copyright © 2017, Oracle and/or its affiliates. All rights reserved. |
Safe Harbor Statement
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.
blogs.oracle.com/sql www.youtube.com/c/TheMagicOfSQL @ChrisRSaxon
Copyright © 2017, Oracle and/or its affiliates. All rights reserved. | blogs.oracle.com/sql www.youtube.com/c/TheMagicOfSQL @ChrisRSaxon
Copyright © 2017, Oracle and/or its affiliates. All rights reserved. | blogs.oracle.com/sql www.youtube.com/c/TheMagicOfSQL @ChrisRSaxon
Copyright © 2017, Oracle and/or its affiliates. All rights reserved. |
"There are only two hard things in
Computer Science: cache invalidation
and naming things."
– Phil Karlton
blogs.oracle.com/sql www.youtube.com/c/TheMagicOfSQL @ChrisRSaxon
Copyright © 2017, Oracle and/or its affiliates. All rights reserved. |
"There are only two hard things in
Computer Science: cache invalidation
and naming things."
– Phil Karlton
blogs.oracle.com/sql www.youtube.com/c/TheMagicOfSQL @ChrisRSaxon
Copyright © 2017, Oracle and/or its affiliates. All rights reserved. | blogs.oracle.com/sql www.youtube.com/c/TheMagicOfSQL @ChrisRSaxon
Copyright © 2017, Oracle and/or its affiliates. All rights reserved. | blogs.oracle.com/sql www.youtube.com/c/TheMagicOfSQL @ChrisRSaxon
Copyright © 2017, Oracle and/or its affiliates. All rights reserved. | blogs.oracle.com/sql www.youtube.com/c/TheMagicOfSQL @ChrisRSaxon
Copyright © 2017, Oracle and/or its affiliates. All rights reserved. |
<table_name>_<column_name>_fk
blogs.oracle.com/sql www.youtube.com/c/TheMagicOfSQL @ChrisRSaxon
Copyright © 2017, Oracle and/or its affiliates. All rights reserved. |
alter table customer_addresses add constraint
customer_addresses_customer_id_fk
foreign key ( customer_id )
references customers ( customer_id );
<table_name>_<column_name>_fk
blogs.oracle.com/sql www.youtube.com/c/TheMagicOfSQL @ChrisRSaxon
Copyright © 2017, Oracle and/or its affiliates. All rights reserved. |
alter table customer_addresses add constraint
customer_addresses_customer_id_fk
foreign key ( customer_id )
references customers ( customer_id );
SQL Error: ORA-00972: identifier is too long
<table_name>_<column_name>_fk
blogs.oracle.com/sql www.youtube.com/c/TheMagicOfSQL @ChrisRSaxon
Copyright © 2017, Oracle and/or its affiliates. All rights reserved. | blogs.oracle.com/sql www.youtube.com/c/TheMagicOfSQL @ChrisRSaxon
Copyright © 2017, Oracle and/or its affiliates. All rights reserved. | blogs.oracle.com/sql www.youtube.com/c/TheMagicOfSQL @ChrisRSaxon
Copyright © 2017, Oracle and/or its affiliates. All rights reserved. | blogs.oracle.com/sql www.youtube.com/c/TheMagicOfSQL @ChrisRSaxon
Copyright © 2017, Oracle and/or its affiliates. All rights reserved. | blogs.oracle.com/sql www.youtube.com/c/TheMagicOfSQL @ChrisRSaxon
Copyright © 2017, Oracle and/or its affiliates. All rights reserved. | blogs.oracle.com/sql www.youtube.com/c/TheMagicOfSQL @ChrisRSaxon
Looooooooong
names
blogs.oracle.com/sql www.youtube.com/c/TheMagicOfSQL @ChrisRSaxon
Copyright © 2017, Oracle and/or its affiliates. All rights reserved. |
128 bytes
blogs.oracle.com/sql www.youtube.com/c/TheMagicOfSQL @ChrisRSaxon
Copyright © 2017, Oracle and/or its affiliates. All rights reserved. |
create table
with_a_really_really_really_really_really_long_name
(
and_lots_and_lots_and_lots_and_lots int,
of_really_really_really_really_really_long_cols int
);
blogs.oracle.com/sql www.youtube.com/c/TheMagicOfSQL @ChrisRSaxon
Copyright © 2017, Oracle and/or its affiliates. All rights reserved. |
create or replace procedure process_tab
is
begin
select table_name
into tab
from user_tables
where ...
blogs.oracle.com/sql www.youtube.com/c/TheMagicOfSQL @ChrisRSaxon
Copyright © 2017, Oracle and/or its affiliates. All rights reserved. |
create or replace procedure process_tab
is
tab varchar2(30);
begin
select table_name
into tab
from user_tables
where ...
blogs.oracle.com/sql www.youtube.com/c/TheMagicOfSQL @ChrisRSaxon
Copyright © 2017, Oracle and/or its affiliates. All rights reserved. |
exec proccess_tab;
blogs.oracle.com/sql www.youtube.com/c/TheMagicOfSQL @ChrisRSaxon
Copyright © 2017, Oracle and/or its affiliates. All rights reserved. |
exec proccess_tab;
ORA-06502: PL/SQL: numeric or value
error: character string buffer too
small
blogs.oracle.com/sql www.youtube.com/c/TheMagicOfSQL @ChrisRSaxon
Copyright © 2017, Oracle and/or its affiliates. All rights reserved. |
Ryan McGuire / Gratisographyblogs.oracle.com/sql www.youtube.com/c/TheMagicOfSQL @ChrisRSaxon
<expressions> in
place of 'literals'
blogs.oracle.com/sql www.youtube.com/c/TheMagicOfSQL @ChrisRSaxon
Copyright © 2017, Oracle and/or its affiliates. All rights reserved. |
declare
v1 varchar2 ( 30 );
begin
blogs.oracle.com/sql www.youtube.com/c/TheMagicOfSQL @ChrisRSaxon
Copyright © 2017, Oracle and/or its affiliates. All rights reserved. |
declare
v1 varchar2 ( 30 );
var_length constant pls_integer := 30;
begin
blogs.oracle.com/sql www.youtube.com/c/TheMagicOfSQL @ChrisRSaxon
Copyright © 2017, Oracle and/or its affiliates. All rights reserved. |
declare
v1 varchar2 ( 30 );
var_length constant pls_integer := 30;
v2 varchar2( var_length );
begin
blogs.oracle.com/sql www.youtube.com/c/TheMagicOfSQL @ChrisRSaxon
Copyright © 2017, Oracle and/or its affiliates. All rights reserved. |
declare
v1 varchar2 ( 30 );
var_length constant pls_integer := 30;
v2 varchar2( var_length );
begin
Must know at
compile time
blogs.oracle.com/sql www.youtube.com/c/TheMagicOfSQL @ChrisRSaxon
Copyright © 2017, Oracle and/or its affiliates. All rights reserved. |
declare
v1 varchar2 ( 30 );
var_length constant pls_integer := 30;
v2 varchar2( var_length );
begin
Must know at
compile time
 SQL  User functions Constants
blogs.oracle.com/sql www.youtube.com/c/TheMagicOfSQL @ChrisRSaxon
Copyright © 2017, Oracle and/or its affiliates. All rights reserved. |
create or replace procedure process_tab is
$if DBMS_DB_VERSION.VER_LE_12_1 $then
tab varchar2( 30 );
$else
tab varchar2( ora_max_name_len );
$end
begin
blogs.oracle.com/sql www.youtube.com/c/TheMagicOfSQL @ChrisRSaxon
Copyright © 2017, Oracle and/or its affiliates. All rights reserved. |
create or replace procedure process_tab is
$if DBMS_DB_VERSION.VER_LE_12_1 $then
tab varchar2( 30 );
$else
tab varchar2( ora_max_name_len );
$end
begin
Only one is
compiled
blogs.oracle.com/sql www.youtube.com/c/TheMagicOfSQL @ChrisRSaxon
Copyright © 2017, Oracle and/or its affiliates. All rights reserved. |
create or replace procedure process_tab is
$if DBMS_DB_VERSION.VER_LE_12_1 $then
tab varchar2( 30 );
$else
tab varchar2( ora_max_name_len );
$end
begin
Only one is
compiled
12.1
blogs.oracle.com/sql www.youtube.com/c/TheMagicOfSQL @ChrisRSaxon
Copyright © 2017, Oracle and/or its affiliates. All rights reserved. |
create or replace procedure process_tab is
$if DBMS_DB_VERSION.VER_LE_12_1 $then
tab varchar2( 30 );
$else
tab varchar2( ora_max_name_len );
$end
begin
Only one is
compiled
12.1
12.2+
blogs.oracle.com/sql www.youtube.com/c/TheMagicOfSQL @ChrisRSaxon
Copyright © 2017, Oracle and/or its affiliates. All rights reserved. |
user_tables.table_name%type
blogs.oracle.com/sql www.youtube.com/c/TheMagicOfSQL @ChrisRSaxon
Copyright © 2017, Oracle and/or its affiliates. All rights reserved. |
select table_name,
listagg(index_name, ',') within group
(order by index_name) inds
from user_indexes
group by table_name;
blogs.oracle.com/sql www.youtube.com/c/TheMagicOfSQL @ChrisRSaxon
Copyright © 2017, Oracle and/or its affiliates. All rights reserved. |
select table_name,
listagg(index_name, ',') within group
(order by index_name) inds
from user_indexes
group by table_name;4,000* byte limit
blogs.oracle.com/sql www.youtube.com/c/TheMagicOfSQL @ChrisRSaxon
Copyright © 2017, Oracle and/or its affiliates. All rights reserved. |
select table_name,
listagg(index_name, ',') within group
(order by index_name) inds
from user_indexes
group by table_name;4,000* byte limit
130 indexes/tab
blogs.oracle.com/sql www.youtube.com/c/TheMagicOfSQL @ChrisRSaxon
Copyright © 2017, Oracle and/or its affiliates. All rights reserved. |
select table_name,
listagg(index_name, ',') within group
(order by index_name) inds
from user_indexes
group by table_name;4,000* byte limit
130 indexes/tab
31
blogs.oracle.com/sql www.youtube.com/c/TheMagicOfSQL @ChrisRSaxon
Copyright © 2017, Oracle and/or its affiliates. All rights reserved. |
"Self documenting" indexes...
blogs.oracle.com/sql www.youtube.com/c/TheMagicOfSQL @ChrisRSaxon
Copyright © 2017, Oracle and/or its affiliates. All rights reserved. |
"Self documenting" indexes...
create index
reducing_the_monthly_invoice_run_
blogs.oracle.com/sql www.youtube.com/c/TheMagicOfSQL @ChrisRSaxon
Copyright © 2017, Oracle and/or its affiliates. All rights reserved. |
"Self documenting" indexes...
create index
reducing_the_monthly_invoice_run_
from_four_hours_to_three_minutes_
blogs.oracle.com/sql www.youtube.com/c/TheMagicOfSQL @ChrisRSaxon
Copyright © 2017, Oracle and/or its affiliates. All rights reserved. |
"Self documenting" indexes...
create index
reducing_the_monthly_invoice_run_
from_four_hours_to_three_minutes_
PROJ12345_make_everything_faster_
blogs.oracle.com/sql www.youtube.com/c/TheMagicOfSQL @ChrisRSaxon
Copyright © 2017, Oracle and/or its affiliates. All rights reserved. |
"Self documenting" indexes...
create index
reducing_the_monthly_invoice_run_
from_four_hours_to_three_minutes_
PROJ12345_make_everything_faster_
csaxon_is_the_sql_tuning_master on
...
blogs.oracle.com/sql www.youtube.com/c/TheMagicOfSQL @ChrisRSaxon
Copyright © 2017, Oracle and/or its affiliates. All rights reserved. |
select table_name,
listagg(index_name, ',') within group
(order by index_name) inds
from user_indexes
group by table_name;
blogs.oracle.com/sql www.youtube.com/c/TheMagicOfSQL @ChrisRSaxon
Copyright © 2017, Oracle and/or its affiliates. All rights reserved. |
select table_name,
listagg(index_name, ',') within group
(order by index_name) inds
from user_indexes
group by table_name;
ORA-01489: result of string concatenation is
too long
blogs.oracle.com/sql www.youtube.com/c/TheMagicOfSQL @ChrisRSaxon
listagg (
improved on overflooooo
)
blogs.oracle.com/sql www.youtube.com/c/TheMagicOfSQL @ChrisRSaxon
Copyright © 2017, Oracle and/or its affiliates. All rights reserved. |
select table_name,
listagg(index_name, ','
on overflow truncate
) within group
(order by index_name) inds
from user_indexes
group by table_name;
blogs.oracle.com/sql www.youtube.com/c/TheMagicOfSQL @ChrisRSaxon
Copyright © 2017, Oracle and/or its affiliates. All rights reserved. |
select table_name,
listagg(index_name, ','
on overflow truncate
) within group
(order by index_name) inds
from user_indexes
group by table_name;
...lots_and_lots,of_indexes,...(42)
blogs.oracle.com/sql www.youtube.com/c/TheMagicOfSQL @ChrisRSaxon
Copyright © 2017, Oracle and/or its affiliates. All rights reserved. |
listagg (
things, ','
[ on overflow (truncate|error) ]
[ text ] [ (with|without) count ]
) within group (order by cols)
blogs.oracle.com/sql www.youtube.com/c/TheMagicOfSQL @ChrisRSaxon
Copyright © 2017, Oracle and/or its affiliates. All rights reserved. |
First name
Last name
blogs.oracle.com/sql www.youtube.com/c/TheMagicOfSQL @ChrisRSaxon
Copyright © 2017, Oracle and/or its affiliates. All rights reserved. |
select *
from people
where first_name = 'Chris'
and last_name = 'Saxon';
FIRST_NAME LAST_NAME
Chris Saxon
blogs.oracle.com/sql www.youtube.com/c/TheMagicOfSQL @ChrisRSaxon
Copyright © 2017, Oracle and/or its affiliates. All rights reserved. |
select *
from people
where first_name = 'Chris'
and last_name = 'Saxon';
FIRST_NAME LAST_NAME
Chris Saxon
blogs.oracle.com/sql www.youtube.com/c/TheMagicOfSQL @ChrisRSaxon
Copyright © 2017, Oracle and/or its affiliates. All rights reserved. |
select *
from people
where first_name = 'Chris'
and last_name = 'Saxon';
FIRST_NAME LAST_NAME
Chris Saxon
blogs.oracle.com/sql www.youtube.com/c/TheMagicOfSQL @ChrisRSaxon
Copyright © 2017, Oracle and/or its affiliates. All rights reserved. |
select *
from people
where first_name = 'Chris'
and last_name = 'Saxon';
FIRST_NAME LAST_NAME
Chris Saxon
blogs.oracle.com/sql www.youtube.com/c/TheMagicOfSQL @ChrisRSaxon
Copyright © 2017, Oracle and/or its affiliates. All rights reserved. |
select *
from people
where first_name = 'Chris'
and last_name = 'Saxon';
FIRST_NAME LAST_NAME
Chris Saxon
blogs.oracle.com/sql www.youtube.com/c/TheMagicOfSQL @ChrisRSaxon
Copyright © 2017, Oracle and/or its affiliates. All rights reserved. |
select *
from people
where first_name = 'Chris'
and last_name = 'Saxon';
FIRST_NAME LAST_NAME
Chris Saxon
blogs.oracle.com/sql www.youtube.com/c/TheMagicOfSQL @ChrisRSaxon
Column level
collation
blogs.oracle.com/sql www.youtube.com/c/TheMagicOfSQL @ChrisRSaxon
Copyright © 2017, Oracle and/or its affiliates. All rights reserved. |
create table t (
case_and_accent_sensitive varchar2(10),
case_insensitive_accent_sensitive
varchar2(10) collate binary_ci,
case_and_accent_insensitive
varchar2(10) collate binary_ai
);
blogs.oracle.com/sql www.youtube.com/c/TheMagicOfSQL @ChrisRSaxon
Copyright © 2017, Oracle and/or its affiliates. All rights reserved. | blogs.oracle.com/sql www.youtube.com/c/TheMagicOfSQL @ChrisRSaxon
Copyright © 2017, Oracle and/or its affiliates. All rights reserved. | blogs.oracle.com/sql www.youtube.com/c/TheMagicOfSQL @ChrisRSaxon
Copyright © 2017, Oracle and/or its affiliates. All rights reserved. |
Must drop
& recreate
indexes
blogs.oracle.com/sql www.youtube.com/c/TheMagicOfSQL @ChrisRSaxon
Copyright © 2017, Oracle and/or its affiliates. All rights reserved. | blogs.oracle.com/sql www.youtube.com/c/TheMagicOfSQL @ChrisRSaxon
Copyright © 2017, Oracle and/or its affiliates. All rights reserved. | blogs.oracle.com/sql www.youtube.com/c/TheMagicOfSQL @ChrisRSaxon
Copyright © 2017, Oracle and/or its affiliates. All rights reserved. |
> >
blogs.oracle.com/sql www.youtube.com/c/TheMagicOfSQL @ChrisRSaxon
Copyright © 2017, Oracle and/or its affiliates. All rights reserved. |
alter table people default collation binary_ai;
blogs.oracle.com/sql www.youtube.com/c/TheMagicOfSQL @ChrisRSaxon
Copyright © 2017, Oracle and/or its affiliates. All rights reserved. |
alter table people default collation binary_ai;
Existing columns
unaffected!
blogs.oracle.com/sql www.youtube.com/c/TheMagicOfSQL @ChrisRSaxon
Copyright © 2017, Oracle and/or its affiliates. All rights reserved. |
alter table people default collation binary_ai;
ORA-43929: Collation cannot be specified if
parameter MAX_STRING_SIZE=STANDARD
Existing columns
unaffected!
blogs.oracle.com/sql www.youtube.com/c/TheMagicOfSQL @ChrisRSaxon
Copyright © 2017, Oracle and/or its affiliates. All rights reserved. |
alter table people default collation binary_ai;
ORA-43929: Collation cannot be specified if
parameter MAX_STRING_SIZE=STANDARD
Must be EXTENDED!
Existing columns
unaffected!
blogs.oracle.com/sql www.youtube.com/c/TheMagicOfSQL @ChrisRSaxon
Copyright © 2017, Oracle and/or its affiliates. All rights reserved. |
create or replace package customer_pkg as
cursor get_customers_upper (p_name varchar2) is
select * from customers
where upper(customer_name) = upper(p_name);
blogs.oracle.com/sql www.youtube.com/c/TheMagicOfSQL @ChrisRSaxon
Copyright © 2017, Oracle and/or its affiliates. All rights reserved. |
create or replace package customer_pkg as
cursor get_customers_upper (p_name varchar2) is
select * from customers
where upper(customer_name) = upper(p_name);
cursor get_customers (p_name varchar2) is
select * from customers
where customer_name = p_name;
blogs.oracle.com/sql www.youtube.com/c/TheMagicOfSQL @ChrisRSaxon
Copyright © 2017, Oracle and/or its affiliates. All rights reserved. |
create or replace package customer_pkg as
/* get_customers_upper is deprecated. Do not use or
I'll come for you with a rusty spoon! */
cursor get_customers_upper (p_name varchar2) is
select * from customers
where upper(customer_name) = upper(p_name);
cursor get_customers (p_name varchar2) is
select * from customers
where customer_name = p_name;
blogs.oracle.com/sql www.youtube.com/c/TheMagicOfSQL @ChrisRSaxon
pragma deprecate
( your_old_code )
blogs.oracle.com/sql www.youtube.com/c/TheMagicOfSQL @ChrisRSaxon
Copyright © 2017, Oracle and/or its affiliates. All rights reserved. |
create or replace package customer_pkg as
/* get_customers_upper is deprecated. Do not use or
I'll come for you with a rusty spoon */
cursor get_customers_upper (p_name varchar2) is
select * from customers
where upper(customer_name) = upper(p_name);
cursor get_customers (p_name varchar2) is
select * from customers
where customer_name = p_name;
blogs.oracle.com/sql www.youtube.com/c/TheMagicOfSQL @ChrisRSaxon
Copyright © 2017, Oracle and/or its affiliates. All rights reserved. |
create or replace package customer_pkg as
/* get_customers_upper is deprecated. Do not use or
I'll come for you with a rusty spoon */
cursor get_customers_upper (p_name varchar2) is
select * from customers
where upper(customer_name) = upper(p_name);
pragma deprecate(get_customers_upper,
'Use get_customers instead');
cursor get_customers (p_name varchar2) is
select * from customers
where customer_name = p_name;
blogs.oracle.com/sql www.youtube.com/c/TheMagicOfSQL @ChrisRSaxon
Copyright © 2017, Oracle and/or its affiliates. All rights reserved. |
alter system set plsql_warnings =
'enable:(6019,6020,6021,6022)';
blogs.oracle.com/sql www.youtube.com/c/TheMagicOfSQL @ChrisRSaxon
Copyright © 2017, Oracle and/or its affiliates. All rights reserved. |
SP2-0804: Procedure created with compilation warnings
LINE/COL ERROR
-------- -----------------------------------------------------------
1/1 PLW-05018: unit PROCESS_CUSTOMERS omitted optional AUTHID
clause; default value DEFINER used
4/29 PLW-06020: reference to a deprecated entity:
GET_CUSTOMERS_UPPER declared in unit CUSTOMER_PKG[2,10].
Use get_customers instead
7/9 PLW-06020: reference to a deprecated entity:
GET_CUSTOMERS_UPPER declared in unit CUSTOMER_PKG[2,10].
Use get_customers instead
8/9 PLW-06020: reference to a deprecated entity:
blogs.oracle.com/sql www.youtube.com/c/TheMagicOfSQL @ChrisRSaxon
Copyright © 2017, Oracle and/or its affiliates. All rights reserved. |
Whatever
blogs.oracle.com/sql www.youtube.com/c/TheMagicOfSQL @ChrisRSaxon
Copyright © 2017, Oracle and/or its affiliates. All rights reserved. |
alter system set plsql_warnings =
'error:6020';
blogs.oracle.com/sql www.youtube.com/c/TheMagicOfSQL @ChrisRSaxon
Copyright © 2017, Oracle and/or its affiliates. All rights reserved. |
Warning: Procedure altered with compilation errors.
LINE/COL ERROR
-------- --------------------------------------------------------
4/29 PLS-06020: reference to a deprecated entity:
GET_CUSTOMERS_UPPER declared in unit CUSTOMER_PKG[2,10].
Use get_customers instead
7/9 PLS-06020: reference to a deprecated entity:
GET_CUSTOMERS_UPPER declared in unit CUSTOMER_PKG[2,10].
Use get_customers instead
8/9 PLS-06020: reference to a deprecated entity:
GET_CUSTOMERS_UPPER declared in unit CUSTOMER_PKG[2,10].
Use get_customers instead
blogs.oracle.com/sql www.youtube.com/c/TheMagicOfSQL @ChrisRSaxon
Copyright © 2017, Oracle and/or its affiliates. All rights reserved. |
ext_tab
blogs.oracle.com/sql www.youtube.com/c/TheMagicOfSQL @ChrisRSaxon
Copyright © 2017, Oracle and/or its affiliates. All rights reserved. |
ext_tab
blogs.oracle.com/sql www.youtube.com/c/TheMagicOfSQL @ChrisRSaxon
Copyright © 2017, Oracle and/or its affiliates. All rights reserved. |
select * from ext_tab;
blogs.oracle.com/sql www.youtube.com/c/TheMagicOfSQL @ChrisRSaxon
Copyright © 2017, Oracle and/or its affiliates. All rights reserved. |
select * from ext_tab;
ORA-29913: error in executing
ODCIEXTTABLEFETCH callout
ORA-30653: reject limit reached
blogs.oracle.com/sql www.youtube.com/c/TheMagicOfSQL @ChrisRSaxon
Copyright © 2017, Oracle and/or its affiliates. All rights reserved. |
ext_tab
blogs.oracle.com/sql www.youtube.com/c/TheMagicOfSQL @ChrisRSaxon
Copyright © 2017, Oracle and/or its affiliates. All rights reserved. |
ext_tab
blogs.oracle.com/sql www.youtube.com/c/TheMagicOfSQL @ChrisRSaxon
Copyright © 2017, Oracle and/or its affiliates. All rights reserved. |
alter table ext_tab
location ('test.csv')
reject limit unlimited;
ext_tab
blogs.oracle.com/sql www.youtube.com/c/TheMagicOfSQL @ChrisRSaxon
External Table
Parameter Override
blogs.oracle.com/sql www.youtube.com/c/TheMagicOfSQL @ChrisRSaxon
Copyright © 2017, Oracle and/or its affiliates. All rights reserved. |
select * from ext_tab external modify (
[ default directory ]
[ location ]
[ access parameters ]
[ reject limit ]
);
blogs.oracle.com/sql www.youtube.com/c/TheMagicOfSQL @ChrisRSaxon
Copyright © 2017, Oracle and/or its affiliates. All rights reserved. |
select * from ext_tab external modify (
location ('test.csv')
reject limit unlimited
);
blogs.oracle.com/sql www.youtube.com/c/TheMagicOfSQL @ChrisRSaxon
Copyright © 2017, Oracle and/or its affiliates. All rights reserved. |
select * from ext_tab external modify (
location ('test.csv')
reject limit unlimited
);
no rows selected
blogs.oracle.com/sql www.youtube.com/c/TheMagicOfSQL @ChrisRSaxon
Copyright © 2017, Oracle and/or its affiliates. All rights reserved. |
01-SEP-2016
02-SEP-2016
03-SEP-2016
04-SEP-2016
05-SEP-2016
06-SEP-2016
07-SEP-2016
08-SEP-2016
09-SEP-2016
10-SEP-2016
11-SEP-2016
blogs.oracle.com/sql www.youtube.com/c/TheMagicOfSQL @ChrisRSaxon
Copyright © 2017, Oracle and/or its affiliates. All rights reserved. |
2016/09/01
2016/09/02
2016/09/03
2016/09/04
2016/09/05
2016/09/06
2016/09/07
2016/09/08
2016/09/09
2016/09/10
2016/09/11
blogs.oracle.com/sql www.youtube.com/c/TheMagicOfSQL @ChrisRSaxon
Copyright © 2017, Oracle and/or its affiliates. All rights reserved. |
create table ext_tab (
...
created_date date varchar2(20)
...
) organization external (
...
created_date char(20)
date_format date mask 'dd-MON-yyyy'
...
blogs.oracle.com/sql www.youtube.com/c/TheMagicOfSQL @ChrisRSaxon
Copyright © 2017, Oracle and/or its affiliates. All rights reserved. |
create table ext_tab (
...
created_date date varchar2(20)
...
) organization external (
...
created_date char(20)
date_format date mask 'dd-MON-yyyy'
...
blogs.oracle.com/sql www.youtube.com/c/TheMagicOfSQL @ChrisRSaxon
Copyright © 2017, Oracle and/or its affiliates. All rights reserved. |
select to_date(created_date, 'dd-mon-yyyy')
from ext_tab;
blogs.oracle.com/sql www.youtube.com/c/TheMagicOfSQL @ChrisRSaxon
Copyright © 2017, Oracle and/or its affiliates. All rights reserved. |
select to_date(created_date, 'dd-mon-yyyy')
from ext_tab;
ORA-01843: not a valid month
blogs.oracle.com/sql www.youtube.com/c/TheMagicOfSQL @ChrisRSaxon
Validate
conversions
blogs.oracle.com/sql www.youtube.com/c/TheMagicOfSQL @ChrisRSaxon
Copyright © 2017, Oracle and/or its affiliates. All rights reserved. |
validate_conversion (
<expression> as <data type>,
[ <format mask> ],
[ <nls_parameters> ]
)
blogs.oracle.com/sql www.youtube.com/c/TheMagicOfSQL @ChrisRSaxon
Copyright © 2017, Oracle and/or its affiliates. All rights reserved. |
validate_conversion (
<expression> as <data type>,
[ <format mask> ],
[ <nls_parameters> ]
)
Defaults to NLS settings!
blogs.oracle.com/sql www.youtube.com/c/TheMagicOfSQL @ChrisRSaxon
Copyright © 2017, Oracle and/or its affiliates. All rights reserved. |
validate_conversion (
<expression> as <data type>,
[ <format mask> ],
[ <nls_parameters> ]
)
1 = Success!
0 = Failure 
Defaults to NLS settings!
blogs.oracle.com/sql www.youtube.com/c/TheMagicOfSQL @ChrisRSaxon
Copyright © 2017, Oracle and/or its affiliates. All rights reserved. |
select to_date(created_date, 'dd-mon-yyyy')
from ext_tab
where validate_conversion (
created_date as date, 'dd-MON-yyyy'
) = 1;
blogs.oracle.com/sql www.youtube.com/c/TheMagicOfSQL @ChrisRSaxon
Copyright © 2017, Oracle and/or its affiliates. All rights reserved. |
insert into error_table
select created_date
from ext_tab
where validate_conversion (
created_date as date, 'dd-MON-yyyy'
) = 0;
blogs.oracle.com/sql www.youtube.com/c/TheMagicOfSQL @ChrisRSaxon
cast (
default on error
)
blogs.oracle.com/sql www.youtube.com/c/TheMagicOfSQL @ChrisRSaxon
Copyright © 2017, Oracle and/or its affiliates. All rights reserved. |
cast (
<expression> as <data type>
[ default <value> on conversion error ],
[ <format mask> ],
[ <nls_parameters> ]
)
blogs.oracle.com/sql www.youtube.com/c/TheMagicOfSQL @ChrisRSaxon
Copyright © 2017, Oracle and/or its affiliates. All rights reserved. |
cast (
<expression> as <data type>
[ default <value> on conversion error ],
[ <format mask> ],
[ <nls_parameters> ]
)
this... ...must match this
blogs.oracle.com/sql www.youtube.com/c/TheMagicOfSQL @ChrisRSaxon
Copyright © 2017, Oracle and/or its affiliates. All rights reserved. |
cast (
<expression> as <data type>
[ default <value> on conversion error ],
[ <format mask> ],
[ <nls_parameters> ]
)
to_date()
to_number()
to_timestamp()
etc.
Also...
this... ...must match this
blogs.oracle.com/sql www.youtube.com/c/TheMagicOfSQL @ChrisRSaxon
Copyright © 2017, Oracle and/or its affiliates. All rights reserved. |
select to_date(
created_date
default '01-JAN-0001'
on conversion error,
'dd-mon-yyyy'
)
from ext_tab;
01-JAN-0001
blogs.oracle.com/sql www.youtube.com/c/TheMagicOfSQL @ChrisRSaxon
Copyright © 2017, Oracle and/or its affiliates. All rights reserved. |
create table file_imports (
file_type varchar2(30),
file_data clob )
blogs.oracle.com/sql www.youtube.com/c/TheMagicOfSQL @ChrisRSaxon
Copyright © 2017, Oracle and/or its affiliates. All rights reserved. |
create table file_imports (
file_type varchar2(30),
file_data clob )
partition by list (file_type) (
partition p_fixed values ('FIXED'),
partition p_csv values ('CSV')
);
blogs.oracle.com/sql www.youtube.com/c/TheMagicOfSQL @ChrisRSaxon
Copyright © 2017, Oracle and/or its affiliates. All rights reserved. |
create table file_imports (
file_type varchar2(30),
file_data clob )
partition by list (file_type) (
partition p_fixed values ('FIXED'),
partition p_csv values ('CSV')
);
insert into file_imports values ('XML',
'<?xml version="1.0" encoding="UTF-8"?> ...');
blogs.oracle.com/sql www.youtube.com/c/TheMagicOfSQL @ChrisRSaxon
Copyright © 2017, Oracle and/or its affiliates. All rights reserved. |
create table file_imports (
file_type varchar2(30),
file_data clob )
partition by list (file_type) (
partition p_fixed values ('FIXED'),
partition p_csv values ('CSV')
);
insert into file_imports values ('XML',
'<?xml version="1.0" encoding="UTF-8"?> ...');
SQL Error: ORA-14400: inserted partition key does not
map to any partition
blogs.oracle.com/sql www.youtube.com/c/TheMagicOfSQL @ChrisRSaxon
Copyright © 2017, Oracle and/or its affiliates. All rights reserved. |
alter table file_imports add partition
p_xml values ('XML');
blogs.oracle.com/sql www.youtube.com/c/TheMagicOfSQL @ChrisRSaxon
Copyright © 2017, Oracle and/or its affiliates. All rights reserved. |
alter table file_imports add partition
p_xml values ('XML');
alter table file_imports add partition
p_default values (default);
blogs.oracle.com/sql www.youtube.com/c/TheMagicOfSQL @ChrisRSaxon
Copyright © 2017, Oracle and/or its affiliates. All rights reserved. |
p_fixed p_csv
p_XML p_default
FIXED FIXED FIXED CSV CSVCSV
XML XML XML
blogs.oracle.com/sql www.youtube.com/c/TheMagicOfSQL @ChrisRSaxon
Copyright © 2017, Oracle and/or its affiliates. All rights reserved. |
p_fixed p_csv
p_XML p_default
FIXED FIXED FIXED CSV CSVCSV
XML YAMLXML XML JSONHTML
blogs.oracle.com/sql www.youtube.com/c/TheMagicOfSQL @ChrisRSaxon
Automatic List
Part ition ing
blogs.oracle.com/sql www.youtube.com/c/TheMagicOfSQL @ChrisRSaxon
Copyright © 2017, Oracle and/or its affiliates. All rights reserved. |
create table file_imports (
file_type varchar2(30),
file_data clob )
partition by list (file_type) automatic (
partition p_fixed values ('FIXED'),
partition p_csv values ('CSV'),
partition p_XML values ('XML'),
partition p_JSON values ('JSON'),
partition p_default values (default)
);
blogs.oracle.com/sql www.youtube.com/c/TheMagicOfSQL @ChrisRSaxon
Copyright © 2017, Oracle and/or its affiliates. All rights reserved. |
create table file_imports (
file_type varchar2(30),
file_data clob )
partition by list (file_type) automatic (
partition p_fixed values ('FIXED'),
partition p_csv values ('CSV'),
partition p_XML values ('XML'),
partition p_JSON values ('JSON'),
partition p_default values (default)
);
Mutually
exclusive!
blogs.oracle.com/sql www.youtube.com/c/TheMagicOfSQL @ChrisRSaxon
Copyright © 2017, Oracle and/or its affiliates. All rights reserved. |
create table file_imports (
file_type varchar2(30),
file_data clob )
partition by list (file_type) automatic (
partition p_fixed values ('FIXED'),
partition p_csv values ('CSV'),
partition p_XML values ('XML'),
partition p_JSON values ('JSON'),
partition p_default values (default)
);
Mutually
exclusive!
blogs.oracle.com/sql www.youtube.com/c/TheMagicOfSQL @ChrisRSaxon
Copyright © 2017, Oracle and/or its affiliates. All rights reserved. |
alter table file_imports split partition
p_default into (
partition p_json values ('JSON'),
partition p_yaml values ('YAML'),
partition p_default
);
blogs.oracle.com/sql www.youtube.com/c/TheMagicOfSQL @ChrisRSaxon
Copyright © 2017, Oracle and/or its affiliates. All rights reserved. |
alter table file_imports split partition
p_default into (
partition p_json values ('JSON'),
partition p_yaml values ('YAML'),
partition p_default
);
alter table file_imports drop partition
p_default;
blogs.oracle.com/sql www.youtube.com/c/TheMagicOfSQL @ChrisRSaxon
Copyright © 2017, Oracle and/or its affiliates. All rights reserved. |
alter table file_imports split partition
p_default into (
partition p_json values ('JSON'),
partition p_yaml values ('YAML'),
partition p_default
);
alter table file_imports drop partition
p_default;
alter table file_imports
set partitioning automatic;
blogs.oracle.com/sql www.youtube.com/c/TheMagicOfSQL @ChrisRSaxon
Copyright © 2017, Oracle and/or its affiliates. All rights reserved. |
{
"department": "Accounting",
"employees": [
{
"name": "Shelley,Higgins",
"job": "Accounting Manager"
},
{
"name": "William,Gietz",
"job": "Public Accountant"
}
]
}
JSON in 12.1.0.2
check ( employees_json is json )
blogs.oracle.com/sql www.youtube.com/c/TheMagicOfSQL @ChrisRSaxon
Copyright © 2017, Oracle and/or its affiliates. All rights reserved. |
{
"department": "Accounting",
"employees": [
{
"name": "Shelley,Higgins",
"job": "Accounting Manager"
},
{
"name": "William,Gietz",
"job": "Public Accountant"
}
]
}
blogs.oracle.com/sql www.youtube.com/c/TheMagicOfSQL @ChrisRSaxon
{"newJSONFunctions": [
"json_array",
"json_object",
"json_arrayagg",
"json_objectagg"
] }
blogs.oracle.com/sql www.youtube.com/c/TheMagicOfSQL @ChrisRSaxon
Copyright © 2017, Oracle and/or its affiliates. All rights reserved. |
json_array* => [ ] json_object* => { }
blogs.oracle.com/sql www.youtube.com/c/TheMagicOfSQL @ChrisRSaxon
Copyright © 2017, Oracle and/or its affiliates. All rights reserved. |
json_array* => [ ] json_object* => { }
[ ... ] {...}
[ ... ] {...}
[ ... ] {...}
[ ... ] {...}
[ ... ] {...}
[ ... ] {...}
[ ... ] {...}
{
...
}
json_*agg =>json_*(non-agg) =>
[
...
]
blogs.oracle.com/sql www.youtube.com/c/TheMagicOfSQL @ChrisRSaxon
Copyright © 2017, Oracle and/or its affiliates. All rights reserved. |
select json_object (
'department' value d.department_name,
'employees' value json_arrayagg (
json_object (
'name' value first_name || ',' || last_name,
'job' value job_title
)))
from hr.departments d, hr.employees e, hr.jobs j
where d.department_id = e.department_id
and e.job_id = j.job_id
and d.department_id = 110
group by d.department_name
blogs.oracle.com/sql www.youtube.com/c/TheMagicOfSQL @ChrisRSaxon
Copyright © 2017, Oracle and/or its affiliates. All rights reserved. |
... and more JSON goodies
blogs.oracle.com/sql www.youtube.com/c/TheMagicOfSQL @ChrisRSaxon
Copyright © 2017, Oracle and/or its affiliates. All rights reserved. |
json_exists
... and more JSON goodies
GeoJSON
JSON Partitioning
In-Memory support
JSON Data Guide
Materialized Views
Search index
blogs.oracle.com/sql www.youtube.com/c/TheMagicOfSQL @ChrisRSaxon
Copyright © 2017, Oracle and/or its affiliates. All rights reserved. |
Also in 12.1.0.2...
select count(distinct ...)
from my_super_massive_table;
blogs.oracle.com/sql www.youtube.com/c/TheMagicOfSQL @ChrisRSaxon
Copyright © 2017, Oracle and/or its affiliates. All rights reserved. |
Also in 12.1.0.2...
select count(distinct ...)
from my_super_massive_table;
blogs.oracle.com/sql www.youtube.com/c/TheMagicOfSQL @ChrisRSaxon
Copyright © 2017, Oracle and/or its affiliates. All rights reserved. |
Give me
your best
estimate!
blogs.oracle.com/sql www.youtube.com/c/TheMagicOfSQL @ChrisRSaxon
Copyright © 2017, Oracle and/or its affiliates. All rights reserved. |
select approx_count_distinct (...)
from my_super_massive_table;
faster &
clse enogh
blogs.oracle.com/sql www.youtube.com/c/TheMagicOfSQL @ChrisRSaxon
select count(*)
from user_source
where upper(text)
like '%COUNT%DISTINCT%';
1,723
blogs.oracle.com/sql www.youtube.com/c/TheMagicOfSQL @ChrisRSaxon
select count(*)
from user_source
where upper(text)
like '%COUNT%DISTINCT%';
1,723
blogs.oracle.com/sql www.youtube.com/c/TheMagicOfSQL @ChrisRSaxon
Aprox. Quries
Enhncmnts
blogs.oracle.com/sql www.youtube.com/c/TheMagicOfSQL @ChrisRSaxon
Copyright © 2017, Oracle and/or its affiliates. All rights reserved. |
alter session set approx_for_count_distinct = true;
blogs.oracle.com/sql www.youtube.com/c/TheMagicOfSQL @ChrisRSaxon
Copyright © 2017, Oracle and/or its affiliates. All rights reserved. |
count ( distinct ... ) approx_count_distinct ( ... )
alter session set approx_for_count_distinct = true;
blogs.oracle.com/sql www.youtube.com/c/TheMagicOfSQL @ChrisRSaxon
Copyright © 2017, Oracle and/or its affiliates. All rights reserved. |
Huh?approx_for_aggregation
approx_for_percentile
count ( distinct ... ) approx_count_distinct ( ... )
alter session set approx_for_count_distinct = true;
blogs.oracle.com/sql www.youtube.com/c/TheMagicOfSQL @ChrisRSaxon
Copyright © 2017, Oracle and/or its affiliates. All rights reserved. |
approx_percentile (
<expression> [ deterministic ],
[ ('ERROR_RATE' | 'CONFIDENCE') ]
) within group ( order by <expr> )
blogs.oracle.com/sql www.youtube.com/c/TheMagicOfSQL @ChrisRSaxon
Copyright © 2017, Oracle and/or its affiliates. All rights reserved. |
approx_percentile (
<expression> [ deterministic ],
[ ('ERROR_RATE' | 'CONFIDENCE') ]
) within group ( order by <expr> )
Consistent;
slower;
numbers only
blogs.oracle.com/sql www.youtube.com/c/TheMagicOfSQL @ChrisRSaxon
Copyright © 2017, Oracle and/or its affiliates. All rights reserved. |
approx_percentile (
<expression> [ deterministic ],
[ ('ERROR_RATE' | 'CONFIDENCE') ]
) within group ( order by <expr> )
How certain are we?
Consistent;
slower;
numbers only
blogs.oracle.com/sql www.youtube.com/c/TheMagicOfSQL @ChrisRSaxon
Copyright © 2017, Oracle and/or its affiliates. All rights reserved. |
approx_percentile (
<expression> [ deterministic ],
[ ('ERROR_RATE' | 'CONFIDENCE') ]
) within group ( order by <expr> )
Also approx_median
How certain are we?
Consistent;
slower;
numbers only
blogs.oracle.com/sql www.youtube.com/c/TheMagicOfSQL @ChrisRSaxon
Copyright © 2017, Oracle and/or its affiliates. All rights reserved. |
It's time to
start testing!
...but have we
tested everything?blogs.oracle.com/sql www.youtube.com/c/TheMagicOfSQL @ChrisRSaxon
PL/SQL Code
Coverage
blogs.oracle.com/sql www.youtube.com/c/TheMagicOfSQL @ChrisRSaxon
Copyright © 2017, Oracle and/or its affiliates. All rights reserved. |
begin
if this or that then
do_this();
else
do_that();
end if;
end;
blogs.oracle.com/sql www.youtube.com/c/TheMagicOfSQL @ChrisRSaxon
Copyright © 2017, Oracle and/or its affiliates. All rights reserved. |
begin
dbms_plsql_code_coverage.create_coverage_tables;
end;
blogs.oracle.com/sql www.youtube.com/c/TheMagicOfSQL @ChrisRSaxon
Copyright © 2017, Oracle and/or its affiliates. All rights reserved. |
declare
run_id pls_integer;
begin
run_id :=
dbms_plsql_code_coverage.start_coverage('TEST1');
your_test_procedures;
dbms_plsql_code_coverage.stop_coverage;
end;
/
blogs.oracle.com/sql www.youtube.com/c/TheMagicOfSQL @ChrisRSaxon
Copyright © 2017, Oracle and/or its affiliates. All rights reserved. |
select u.owner, u.name, u.type,
round((sum(b.covered)*100)/count(*))
as pct_covered
from dbmspcc_runs r
join dbmspcc_units u
on r.run_id = u.run_id
join dbmspcc_blocks b
on b.object_id = u.object_id
and b.run_id = u.run_id
where r.run_comment = 'TEST1'
group by u.owner, u.name, u.type
blogs.oracle.com/sql www.youtube.com/c/TheMagicOfSQL @ChrisRSaxon
Copyright © 2017, Oracle and/or its affiliates. All rights reserved. | blogs.oracle.com/sql www.youtube.com/c/TheMagicOfSQL @ChrisRSaxon
Copyright © 2017, Oracle and/or its affiliates. All rights reserved. | blogs.oracle.com/sql www.youtube.com/c/TheMagicOfSQL @ChrisRSaxon
Copyright © 2017, Oracle and/or its affiliates. All rights reserved. |
select u.owner, u.name, u.type,
round((sum(b.covered)*100)/count(*))
as pct_covered
from dbmspcc_runs r
join dbmspcc_units u
on r.run_id = u.run_id
join dbmspcc_blocks b
on b.object_id = u.object_id
and b.run_id = u.run_id
where r.run_comment = 'TEST1' and not_feasible = 0
group by u.owner, u.name, u.type
blogs.oracle.com/sql www.youtube.com/c/TheMagicOfSQL @ChrisRSaxon
Copyright © 2017, Oracle and/or its affiliates. All rights reserved. |
devgym.oracle.com/devgym/
database-for-developers.html
#MakeDataGreatAgain
Ryan McGuire / Gratisography
Copyright © 2017, Oracle and/or its affiliates. All rights reserved. |
Safe Harbor Statement
The preceding 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.
blogs.oracle.com/sql www.youtube.com/c/TheMagicOfSQL @ChrisRSaxon
Copyright © 2017, Oracle and/or its affiliates. All rights reserved. | blogs.oracle.com/sql www.youtube.com/c/TheMagicOfSQL @ChrisRSaxon
12 Things Developers Will Love About Oracle Database 12c Release 2

More Related Content

What's hot

Perth APAC Groundbreakers tour - 18c features
Perth APAC Groundbreakers tour - 18c featuresPerth APAC Groundbreakers tour - 18c features
Perth APAC Groundbreakers tour - 18c features
Connor McDonald
 
UKOUG Tech15 - Going Full Circle - Building a native JSON Database API
UKOUG Tech15 - Going Full Circle - Building a native JSON Database APIUKOUG Tech15 - Going Full Circle - Building a native JSON Database API
UKOUG Tech15 - Going Full Circle - Building a native JSON Database API
Marco Gralike
 
JSON-B for CZJUG
JSON-B for CZJUGJSON-B for CZJUG
JSON-B for CZJUG
Dmitry Kornilov
 
Configuration for Java EE: Config JSR and Tamaya
Configuration for Java EE: Config JSR and TamayaConfiguration for Java EE: Config JSR and Tamaya
Configuration for Java EE: Config JSR and Tamaya
Dmitry Kornilov
 
Configuration for Java EE and the Cloud
Configuration for Java EE and the CloudConfiguration for Java EE and the Cloud
Configuration for Java EE and the Cloud
Dmitry Kornilov
 
NZOUG - GroundBreakers-2018 -Using Oracle Autonomous Health Framework to Pres...
NZOUG - GroundBreakers-2018 -Using Oracle Autonomous Health Framework to Pres...NZOUG - GroundBreakers-2018 -Using Oracle Autonomous Health Framework to Pres...
NZOUG - GroundBreakers-2018 -Using Oracle Autonomous Health Framework to Pres...
Sandesh Rao
 
NZOUG-GroundBreakers-2018 - Troubleshooting and Diagnosing 18c RAC
NZOUG-GroundBreakers-2018 - Troubleshooting and Diagnosing 18c RACNZOUG-GroundBreakers-2018 - Troubleshooting and Diagnosing 18c RAC
NZOUG-GroundBreakers-2018 - Troubleshooting and Diagnosing 18c RAC
Sandesh Rao
 
What's new in the Java API for JSON Binding
What's new in the Java API for JSON BindingWhat's new in the Java API for JSON Binding
What's new in the Java API for JSON Binding
Dmitry Kornilov
 
AIOUG : OTNYathra - Troubleshooting and Diagnosing Oracle Database 12.2 and O...
AIOUG : OTNYathra - Troubleshooting and Diagnosing Oracle Database 12.2 and O...AIOUG : OTNYathra - Troubleshooting and Diagnosing Oracle Database 12.2 and O...
AIOUG : OTNYathra - Troubleshooting and Diagnosing Oracle Database 12.2 and O...
Sandesh Rao
 
Java EE 8 - What’s new on the Web front
Java EE 8 - What’s new on the Web frontJava EE 8 - What’s new on the Web front
Java EE 8 - What’s new on the Web front
David Delabassee
 
MySQL Day Virtual: Best Practices Tips - Upgrading to MySQL 8.0
MySQL Day Virtual: Best Practices Tips - Upgrading to MySQL 8.0MySQL Day Virtual: Best Practices Tips - Upgrading to MySQL 8.0
MySQL Day Virtual: Best Practices Tips - Upgrading to MySQL 8.0
Frederic Descamps
 
AIOUG-GroundBreakers-2018 -Using Oracle Autonomous Health Framework to Preser...
AIOUG-GroundBreakers-2018 -Using Oracle Autonomous Health Framework to Preser...AIOUG-GroundBreakers-2018 -Using Oracle Autonomous Health Framework to Preser...
AIOUG-GroundBreakers-2018 -Using Oracle Autonomous Health Framework to Preser...
Sandesh Rao
 
Data meets AI - ATP Roadshow India
Data meets AI - ATP Roadshow IndiaData meets AI - ATP Roadshow India
Data meets AI - ATP Roadshow India
Sandesh Rao
 
Java EE for the Cloud
Java EE for the CloudJava EE for the Cloud
Java EE for the Cloud
Dmitry Kornilov
 
Introducing New AI Ops Innovations in Oracle 19c Autonomous Health Framework ...
Introducing New AI Ops Innovations in Oracle 19c Autonomous Health Framework ...Introducing New AI Ops Innovations in Oracle 19c Autonomous Health Framework ...
Introducing New AI Ops Innovations in Oracle 19c Autonomous Health Framework ...
Sandesh Rao
 
AUSOUG - Applied Machine Learning for Database Autonomous Health
AUSOUG - Applied Machine Learning for Database Autonomous HealthAUSOUG - Applied Machine Learning for Database Autonomous Health
AUSOUG - Applied Machine Learning for Database Autonomous Health
Sandesh Rao
 
MySQL Group Replication: Handling Network Glitches - Best Practices
MySQL Group Replication: Handling Network Glitches - Best PracticesMySQL Group Replication: Handling Network Glitches - Best Practices
MySQL Group Replication: Handling Network Glitches - Best Practices
Frederic Descamps
 
Developers vs DBAs - How to win the war
Developers vs DBAs - How to win the warDevelopers vs DBAs - How to win the war
Developers vs DBAs - How to win the war
gvenzl
 
OpenExpo Virtual Experience 2020: MySQL 8.0 Document Store - Discovery of a n...
OpenExpo Virtual Experience 2020: MySQL 8.0 Document Store - Discovery of a n...OpenExpo Virtual Experience 2020: MySQL 8.0 Document Store - Discovery of a n...
OpenExpo Virtual Experience 2020: MySQL 8.0 Document Store - Discovery of a n...
Frederic Descamps
 

What's hot (19)

Perth APAC Groundbreakers tour - 18c features
Perth APAC Groundbreakers tour - 18c featuresPerth APAC Groundbreakers tour - 18c features
Perth APAC Groundbreakers tour - 18c features
 
UKOUG Tech15 - Going Full Circle - Building a native JSON Database API
UKOUG Tech15 - Going Full Circle - Building a native JSON Database APIUKOUG Tech15 - Going Full Circle - Building a native JSON Database API
UKOUG Tech15 - Going Full Circle - Building a native JSON Database API
 
JSON-B for CZJUG
JSON-B for CZJUGJSON-B for CZJUG
JSON-B for CZJUG
 
Configuration for Java EE: Config JSR and Tamaya
Configuration for Java EE: Config JSR and TamayaConfiguration for Java EE: Config JSR and Tamaya
Configuration for Java EE: Config JSR and Tamaya
 
Configuration for Java EE and the Cloud
Configuration for Java EE and the CloudConfiguration for Java EE and the Cloud
Configuration for Java EE and the Cloud
 
NZOUG - GroundBreakers-2018 -Using Oracle Autonomous Health Framework to Pres...
NZOUG - GroundBreakers-2018 -Using Oracle Autonomous Health Framework to Pres...NZOUG - GroundBreakers-2018 -Using Oracle Autonomous Health Framework to Pres...
NZOUG - GroundBreakers-2018 -Using Oracle Autonomous Health Framework to Pres...
 
NZOUG-GroundBreakers-2018 - Troubleshooting and Diagnosing 18c RAC
NZOUG-GroundBreakers-2018 - Troubleshooting and Diagnosing 18c RACNZOUG-GroundBreakers-2018 - Troubleshooting and Diagnosing 18c RAC
NZOUG-GroundBreakers-2018 - Troubleshooting and Diagnosing 18c RAC
 
What's new in the Java API for JSON Binding
What's new in the Java API for JSON BindingWhat's new in the Java API for JSON Binding
What's new in the Java API for JSON Binding
 
AIOUG : OTNYathra - Troubleshooting and Diagnosing Oracle Database 12.2 and O...
AIOUG : OTNYathra - Troubleshooting and Diagnosing Oracle Database 12.2 and O...AIOUG : OTNYathra - Troubleshooting and Diagnosing Oracle Database 12.2 and O...
AIOUG : OTNYathra - Troubleshooting and Diagnosing Oracle Database 12.2 and O...
 
Java EE 8 - What’s new on the Web front
Java EE 8 - What’s new on the Web frontJava EE 8 - What’s new on the Web front
Java EE 8 - What’s new on the Web front
 
MySQL Day Virtual: Best Practices Tips - Upgrading to MySQL 8.0
MySQL Day Virtual: Best Practices Tips - Upgrading to MySQL 8.0MySQL Day Virtual: Best Practices Tips - Upgrading to MySQL 8.0
MySQL Day Virtual: Best Practices Tips - Upgrading to MySQL 8.0
 
AIOUG-GroundBreakers-2018 -Using Oracle Autonomous Health Framework to Preser...
AIOUG-GroundBreakers-2018 -Using Oracle Autonomous Health Framework to Preser...AIOUG-GroundBreakers-2018 -Using Oracle Autonomous Health Framework to Preser...
AIOUG-GroundBreakers-2018 -Using Oracle Autonomous Health Framework to Preser...
 
Data meets AI - ATP Roadshow India
Data meets AI - ATP Roadshow IndiaData meets AI - ATP Roadshow India
Data meets AI - ATP Roadshow India
 
Java EE for the Cloud
Java EE for the CloudJava EE for the Cloud
Java EE for the Cloud
 
Introducing New AI Ops Innovations in Oracle 19c Autonomous Health Framework ...
Introducing New AI Ops Innovations in Oracle 19c Autonomous Health Framework ...Introducing New AI Ops Innovations in Oracle 19c Autonomous Health Framework ...
Introducing New AI Ops Innovations in Oracle 19c Autonomous Health Framework ...
 
AUSOUG - Applied Machine Learning for Database Autonomous Health
AUSOUG - Applied Machine Learning for Database Autonomous HealthAUSOUG - Applied Machine Learning for Database Autonomous Health
AUSOUG - Applied Machine Learning for Database Autonomous Health
 
MySQL Group Replication: Handling Network Glitches - Best Practices
MySQL Group Replication: Handling Network Glitches - Best PracticesMySQL Group Replication: Handling Network Glitches - Best Practices
MySQL Group Replication: Handling Network Glitches - Best Practices
 
Developers vs DBAs - How to win the war
Developers vs DBAs - How to win the warDevelopers vs DBAs - How to win the war
Developers vs DBAs - How to win the war
 
OpenExpo Virtual Experience 2020: MySQL 8.0 Document Store - Discovery of a n...
OpenExpo Virtual Experience 2020: MySQL 8.0 Document Store - Discovery of a n...OpenExpo Virtual Experience 2020: MySQL 8.0 Document Store - Discovery of a n...
OpenExpo Virtual Experience 2020: MySQL 8.0 Document Store - Discovery of a n...
 

Similar to 12 Things Developers Will Love About Oracle Database 12c Release 2

18(ish) Things You'll Love About Oracle Database 18c
18(ish) Things You'll Love About Oracle Database 18c18(ish) Things You'll Love About Oracle Database 18c
18(ish) Things You'll Love About Oracle Database 18c
Chris Saxon
 
MySQL InnoDB Cluster in a Nutshell - Hands-on Lab
MySQL InnoDB Cluster in a Nutshell - Hands-on LabMySQL InnoDB Cluster in a Nutshell - Hands-on Lab
MySQL InnoDB Cluster in a Nutshell - Hands-on Lab
Frederic Descamps
 
Leveraging Open Source for Database Development: Database Version Control wit...
Leveraging Open Source for Database Development: Database Version Control wit...Leveraging Open Source for Database Development: Database Version Control wit...
Leveraging Open Source for Database Development: Database Version Control wit...
All Things Open
 
Introduction to MySQL InnoDB Cluster
Introduction to MySQL InnoDB ClusterIntroduction to MySQL InnoDB Cluster
Introduction to MySQL InnoDB Cluster
Frederic Descamps
 
UAE MySQL Users Group Meet-up : MySQL Shell Document Store & more...
UAE MySQL Users Group Meet-up : MySQL Shell Document Store & more...UAE MySQL Users Group Meet-up : MySQL Shell Document Store & more...
UAE MySQL Users Group Meet-up : MySQL Shell Document Store & more...
Frederic Descamps
 
UKOUG2018 - I Know what you did Last Summer [in my Database].pptx
UKOUG2018 - I Know what you did Last Summer [in my Database].pptxUKOUG2018 - I Know what you did Last Summer [in my Database].pptx
UKOUG2018 - I Know what you did Last Summer [in my Database].pptx
Marco Gralike
 
JAX-RS and CDI Bike the (Reactive) Bridge
JAX-RS and CDI Bike the (Reactive) BridgeJAX-RS and CDI Bike the (Reactive) Bridge
JAX-RS and CDI Bike the (Reactive) Bridge
José Paumard
 
JAX RS and CDI bike the reactive bridge
JAX RS and CDI bike the reactive bridgeJAX RS and CDI bike the reactive bridge
JAX RS and CDI bike the reactive bridge
José Paumard
 
SkiPHP -- Database Basics for PHP
SkiPHP -- Database Basics for PHP SkiPHP -- Database Basics for PHP
SkiPHP -- Database Basics for PHP
Dave Stokes
 
Regular Expressions with full Unicode support
Regular Expressions with full Unicode supportRegular Expressions with full Unicode support
Regular Expressions with full Unicode support
MartinHanssonOracle
 
MySQL Document Store
MySQL Document StoreMySQL Document Store
MySQL Document Store
Mario Beck
 
RMOUG MySQL 5.7 New Features
RMOUG MySQL 5.7 New FeaturesRMOUG MySQL 5.7 New Features
RMOUG MySQL 5.7 New Features
Dave Stokes
 
Pre-Con Ed: Using Java to Access Your CA IDMS Databases and Applications
Pre-Con Ed: Using Java to Access Your CA IDMS Databases and ApplicationsPre-Con Ed: Using Java to Access Your CA IDMS Databases and Applications
Pre-Con Ed: Using Java to Access Your CA IDMS Databases and Applications
CA Technologies
 
Flashback features in Oracle - UKOUG 2017
Flashback features in Oracle - UKOUG 2017Flashback features in Oracle - UKOUG 2017
Flashback features in Oracle - UKOUG 2017
Connor McDonald
 
Flashback features in Oracle - UKOUG 2017
Flashback features in Oracle - UKOUG 2017Flashback features in Oracle - UKOUG 2017
Flashback features in Oracle - UKOUG 2017
Connor McDonald
 
What’s New in Oracle Database 12c for PHP
What’s New in Oracle Database 12c for PHPWhat’s New in Oracle Database 12c for PHP
What’s New in Oracle Database 12c for PHP
Christopher Jones
 
MySQL Document Store - when SQL & NoSQL live together... in peace!
MySQL Document Store - when SQL & NoSQL live together... in peace!MySQL Document Store - when SQL & NoSQL live together... in peace!
MySQL Document Store - when SQL & NoSQL live together... in peace!
Frederic Descamps
 
Step by Step instructions to install Cluster Domain deployment model
Step by Step instructions to install Cluster Domain deployment modelStep by Step instructions to install Cluster Domain deployment model
Step by Step instructions to install Cluster Domain deployment model
Anil Nair
 
Data Mobility for the Oracle Database by JWilliams and RGonzalez
Data Mobility for the Oracle Database by JWilliams and RGonzalezData Mobility for the Oracle Database by JWilliams and RGonzalez
Data Mobility for the Oracle Database by JWilliams and RGonzalez
Markus Michalewicz
 
Melbourne Groundbreakers Tour - Upgrading without risk
Melbourne Groundbreakers Tour - Upgrading without riskMelbourne Groundbreakers Tour - Upgrading without risk
Melbourne Groundbreakers Tour - Upgrading without risk
Connor McDonald
 

Similar to 12 Things Developers Will Love About Oracle Database 12c Release 2 (20)

18(ish) Things You'll Love About Oracle Database 18c
18(ish) Things You'll Love About Oracle Database 18c18(ish) Things You'll Love About Oracle Database 18c
18(ish) Things You'll Love About Oracle Database 18c
 
MySQL InnoDB Cluster in a Nutshell - Hands-on Lab
MySQL InnoDB Cluster in a Nutshell - Hands-on LabMySQL InnoDB Cluster in a Nutshell - Hands-on Lab
MySQL InnoDB Cluster in a Nutshell - Hands-on Lab
 
Leveraging Open Source for Database Development: Database Version Control wit...
Leveraging Open Source for Database Development: Database Version Control wit...Leveraging Open Source for Database Development: Database Version Control wit...
Leveraging Open Source for Database Development: Database Version Control wit...
 
Introduction to MySQL InnoDB Cluster
Introduction to MySQL InnoDB ClusterIntroduction to MySQL InnoDB Cluster
Introduction to MySQL InnoDB Cluster
 
UAE MySQL Users Group Meet-up : MySQL Shell Document Store & more...
UAE MySQL Users Group Meet-up : MySQL Shell Document Store & more...UAE MySQL Users Group Meet-up : MySQL Shell Document Store & more...
UAE MySQL Users Group Meet-up : MySQL Shell Document Store & more...
 
UKOUG2018 - I Know what you did Last Summer [in my Database].pptx
UKOUG2018 - I Know what you did Last Summer [in my Database].pptxUKOUG2018 - I Know what you did Last Summer [in my Database].pptx
UKOUG2018 - I Know what you did Last Summer [in my Database].pptx
 
JAX-RS and CDI Bike the (Reactive) Bridge
JAX-RS and CDI Bike the (Reactive) BridgeJAX-RS and CDI Bike the (Reactive) Bridge
JAX-RS and CDI Bike the (Reactive) Bridge
 
JAX RS and CDI bike the reactive bridge
JAX RS and CDI bike the reactive bridgeJAX RS and CDI bike the reactive bridge
JAX RS and CDI bike the reactive bridge
 
SkiPHP -- Database Basics for PHP
SkiPHP -- Database Basics for PHP SkiPHP -- Database Basics for PHP
SkiPHP -- Database Basics for PHP
 
Regular Expressions with full Unicode support
Regular Expressions with full Unicode supportRegular Expressions with full Unicode support
Regular Expressions with full Unicode support
 
MySQL Document Store
MySQL Document StoreMySQL Document Store
MySQL Document Store
 
RMOUG MySQL 5.7 New Features
RMOUG MySQL 5.7 New FeaturesRMOUG MySQL 5.7 New Features
RMOUG MySQL 5.7 New Features
 
Pre-Con Ed: Using Java to Access Your CA IDMS Databases and Applications
Pre-Con Ed: Using Java to Access Your CA IDMS Databases and ApplicationsPre-Con Ed: Using Java to Access Your CA IDMS Databases and Applications
Pre-Con Ed: Using Java to Access Your CA IDMS Databases and Applications
 
Flashback features in Oracle - UKOUG 2017
Flashback features in Oracle - UKOUG 2017Flashback features in Oracle - UKOUG 2017
Flashback features in Oracle - UKOUG 2017
 
Flashback features in Oracle - UKOUG 2017
Flashback features in Oracle - UKOUG 2017Flashback features in Oracle - UKOUG 2017
Flashback features in Oracle - UKOUG 2017
 
What’s New in Oracle Database 12c for PHP
What’s New in Oracle Database 12c for PHPWhat’s New in Oracle Database 12c for PHP
What’s New in Oracle Database 12c for PHP
 
MySQL Document Store - when SQL & NoSQL live together... in peace!
MySQL Document Store - when SQL & NoSQL live together... in peace!MySQL Document Store - when SQL & NoSQL live together... in peace!
MySQL Document Store - when SQL & NoSQL live together... in peace!
 
Step by Step instructions to install Cluster Domain deployment model
Step by Step instructions to install Cluster Domain deployment modelStep by Step instructions to install Cluster Domain deployment model
Step by Step instructions to install Cluster Domain deployment model
 
Data Mobility for the Oracle Database by JWilliams and RGonzalez
Data Mobility for the Oracle Database by JWilliams and RGonzalezData Mobility for the Oracle Database by JWilliams and RGonzalez
Data Mobility for the Oracle Database by JWilliams and RGonzalez
 
Melbourne Groundbreakers Tour - Upgrading without risk
Melbourne Groundbreakers Tour - Upgrading without riskMelbourne Groundbreakers Tour - Upgrading without risk
Melbourne Groundbreakers Tour - Upgrading without risk
 

Recently uploaded

Large Language Model (LLM) and it’s Geospatial Applications
Large Language Model (LLM) and it’s Geospatial ApplicationsLarge Language Model (LLM) and it’s Geospatial Applications
Large Language Model (LLM) and it’s Geospatial Applications
Rohit Gautam
 
GDG Cloud Southlake #33: Boule & Rebala: Effective AppSec in SDLC using Deplo...
GDG Cloud Southlake #33: Boule & Rebala: Effective AppSec in SDLC using Deplo...GDG Cloud Southlake #33: Boule & Rebala: Effective AppSec in SDLC using Deplo...
GDG Cloud Southlake #33: Boule & Rebala: Effective AppSec in SDLC using Deplo...
James Anderson
 
Data structures and Algorithms in Python.pdf
Data structures and Algorithms in Python.pdfData structures and Algorithms in Python.pdf
Data structures and Algorithms in Python.pdf
TIPNGVN2
 
Pushing the limits of ePRTC: 100ns holdover for 100 days
Pushing the limits of ePRTC: 100ns holdover for 100 daysPushing the limits of ePRTC: 100ns holdover for 100 days
Pushing the limits of ePRTC: 100ns holdover for 100 days
Adtran
 
Goodbye Windows 11: Make Way for Nitrux Linux 3.5.0!
Goodbye Windows 11: Make Way for Nitrux Linux 3.5.0!Goodbye Windows 11: Make Way for Nitrux Linux 3.5.0!
Goodbye Windows 11: Make Way for Nitrux Linux 3.5.0!
SOFTTECHHUB
 
Alt. GDG Cloud Southlake #33: Boule & Rebala: Effective AppSec in SDLC using ...
Alt. GDG Cloud Southlake #33: Boule & Rebala: Effective AppSec in SDLC using ...Alt. GDG Cloud Southlake #33: Boule & Rebala: Effective AppSec in SDLC using ...
Alt. GDG Cloud Southlake #33: Boule & Rebala: Effective AppSec in SDLC using ...
James Anderson
 
Full-RAG: A modern architecture for hyper-personalization
Full-RAG: A modern architecture for hyper-personalizationFull-RAG: A modern architecture for hyper-personalization
Full-RAG: A modern architecture for hyper-personalization
Zilliz
 
UiPath Test Automation using UiPath Test Suite series, part 5
UiPath Test Automation using UiPath Test Suite series, part 5UiPath Test Automation using UiPath Test Suite series, part 5
UiPath Test Automation using UiPath Test Suite series, part 5
DianaGray10
 
A tale of scale & speed: How the US Navy is enabling software delivery from l...
A tale of scale & speed: How the US Navy is enabling software delivery from l...A tale of scale & speed: How the US Navy is enabling software delivery from l...
A tale of scale & speed: How the US Navy is enabling software delivery from l...
sonjaschweigert1
 
Encryption in Microsoft 365 - ExpertsLive Netherlands 2024
Encryption in Microsoft 365 - ExpertsLive Netherlands 2024Encryption in Microsoft 365 - ExpertsLive Netherlands 2024
Encryption in Microsoft 365 - ExpertsLive Netherlands 2024
Albert Hoitingh
 
GraphSummit Singapore | Enhancing Changi Airport Group's Passenger Experience...
GraphSummit Singapore | Enhancing Changi Airport Group's Passenger Experience...GraphSummit Singapore | Enhancing Changi Airport Group's Passenger Experience...
GraphSummit Singapore | Enhancing Changi Airport Group's Passenger Experience...
Neo4j
 
20240605 QFM017 Machine Intelligence Reading List May 2024
20240605 QFM017 Machine Intelligence Reading List May 202420240605 QFM017 Machine Intelligence Reading List May 2024
20240605 QFM017 Machine Intelligence Reading List May 2024
Matthew Sinclair
 
zkStudyClub - Reef: Fast Succinct Non-Interactive Zero-Knowledge Regex Proofs
zkStudyClub - Reef: Fast Succinct Non-Interactive Zero-Knowledge Regex ProofszkStudyClub - Reef: Fast Succinct Non-Interactive Zero-Knowledge Regex Proofs
zkStudyClub - Reef: Fast Succinct Non-Interactive Zero-Knowledge Regex Proofs
Alex Pruden
 
UiPath Test Automation using UiPath Test Suite series, part 6
UiPath Test Automation using UiPath Test Suite series, part 6UiPath Test Automation using UiPath Test Suite series, part 6
UiPath Test Automation using UiPath Test Suite series, part 6
DianaGray10
 
Microsoft - Power Platform_G.Aspiotis.pdf
Microsoft - Power Platform_G.Aspiotis.pdfMicrosoft - Power Platform_G.Aspiotis.pdf
Microsoft - Power Platform_G.Aspiotis.pdf
Uni Systems S.M.S.A.
 
Mind map of terminologies used in context of Generative AI
Mind map of terminologies used in context of Generative AIMind map of terminologies used in context of Generative AI
Mind map of terminologies used in context of Generative AI
Kumud Singh
 
Observability Concepts EVERY Developer Should Know -- DeveloperWeek Europe.pdf
Observability Concepts EVERY Developer Should Know -- DeveloperWeek Europe.pdfObservability Concepts EVERY Developer Should Know -- DeveloperWeek Europe.pdf
Observability Concepts EVERY Developer Should Know -- DeveloperWeek Europe.pdf
Paige Cruz
 
FIDO Alliance Osaka Seminar: The WebAuthn API and Discoverable Credentials.pdf
FIDO Alliance Osaka Seminar: The WebAuthn API and Discoverable Credentials.pdfFIDO Alliance Osaka Seminar: The WebAuthn API and Discoverable Credentials.pdf
FIDO Alliance Osaka Seminar: The WebAuthn API and Discoverable Credentials.pdf
FIDO Alliance
 
National Security Agency - NSA mobile device best practices
National Security Agency - NSA mobile device best practicesNational Security Agency - NSA mobile device best practices
National Security Agency - NSA mobile device best practices
Quotidiano Piemontese
 
GraphSummit Singapore | Graphing Success: Revolutionising Organisational Stru...
GraphSummit Singapore | Graphing Success: Revolutionising Organisational Stru...GraphSummit Singapore | Graphing Success: Revolutionising Organisational Stru...
GraphSummit Singapore | Graphing Success: Revolutionising Organisational Stru...
Neo4j
 

Recently uploaded (20)

Large Language Model (LLM) and it’s Geospatial Applications
Large Language Model (LLM) and it’s Geospatial ApplicationsLarge Language Model (LLM) and it’s Geospatial Applications
Large Language Model (LLM) and it’s Geospatial Applications
 
GDG Cloud Southlake #33: Boule & Rebala: Effective AppSec in SDLC using Deplo...
GDG Cloud Southlake #33: Boule & Rebala: Effective AppSec in SDLC using Deplo...GDG Cloud Southlake #33: Boule & Rebala: Effective AppSec in SDLC using Deplo...
GDG Cloud Southlake #33: Boule & Rebala: Effective AppSec in SDLC using Deplo...
 
Data structures and Algorithms in Python.pdf
Data structures and Algorithms in Python.pdfData structures and Algorithms in Python.pdf
Data structures and Algorithms in Python.pdf
 
Pushing the limits of ePRTC: 100ns holdover for 100 days
Pushing the limits of ePRTC: 100ns holdover for 100 daysPushing the limits of ePRTC: 100ns holdover for 100 days
Pushing the limits of ePRTC: 100ns holdover for 100 days
 
Goodbye Windows 11: Make Way for Nitrux Linux 3.5.0!
Goodbye Windows 11: Make Way for Nitrux Linux 3.5.0!Goodbye Windows 11: Make Way for Nitrux Linux 3.5.0!
Goodbye Windows 11: Make Way for Nitrux Linux 3.5.0!
 
Alt. GDG Cloud Southlake #33: Boule & Rebala: Effective AppSec in SDLC using ...
Alt. GDG Cloud Southlake #33: Boule & Rebala: Effective AppSec in SDLC using ...Alt. GDG Cloud Southlake #33: Boule & Rebala: Effective AppSec in SDLC using ...
Alt. GDG Cloud Southlake #33: Boule & Rebala: Effective AppSec in SDLC using ...
 
Full-RAG: A modern architecture for hyper-personalization
Full-RAG: A modern architecture for hyper-personalizationFull-RAG: A modern architecture for hyper-personalization
Full-RAG: A modern architecture for hyper-personalization
 
UiPath Test Automation using UiPath Test Suite series, part 5
UiPath Test Automation using UiPath Test Suite series, part 5UiPath Test Automation using UiPath Test Suite series, part 5
UiPath Test Automation using UiPath Test Suite series, part 5
 
A tale of scale & speed: How the US Navy is enabling software delivery from l...
A tale of scale & speed: How the US Navy is enabling software delivery from l...A tale of scale & speed: How the US Navy is enabling software delivery from l...
A tale of scale & speed: How the US Navy is enabling software delivery from l...
 
Encryption in Microsoft 365 - ExpertsLive Netherlands 2024
Encryption in Microsoft 365 - ExpertsLive Netherlands 2024Encryption in Microsoft 365 - ExpertsLive Netherlands 2024
Encryption in Microsoft 365 - ExpertsLive Netherlands 2024
 
GraphSummit Singapore | Enhancing Changi Airport Group's Passenger Experience...
GraphSummit Singapore | Enhancing Changi Airport Group's Passenger Experience...GraphSummit Singapore | Enhancing Changi Airport Group's Passenger Experience...
GraphSummit Singapore | Enhancing Changi Airport Group's Passenger Experience...
 
20240605 QFM017 Machine Intelligence Reading List May 2024
20240605 QFM017 Machine Intelligence Reading List May 202420240605 QFM017 Machine Intelligence Reading List May 2024
20240605 QFM017 Machine Intelligence Reading List May 2024
 
zkStudyClub - Reef: Fast Succinct Non-Interactive Zero-Knowledge Regex Proofs
zkStudyClub - Reef: Fast Succinct Non-Interactive Zero-Knowledge Regex ProofszkStudyClub - Reef: Fast Succinct Non-Interactive Zero-Knowledge Regex Proofs
zkStudyClub - Reef: Fast Succinct Non-Interactive Zero-Knowledge Regex Proofs
 
UiPath Test Automation using UiPath Test Suite series, part 6
UiPath Test Automation using UiPath Test Suite series, part 6UiPath Test Automation using UiPath Test Suite series, part 6
UiPath Test Automation using UiPath Test Suite series, part 6
 
Microsoft - Power Platform_G.Aspiotis.pdf
Microsoft - Power Platform_G.Aspiotis.pdfMicrosoft - Power Platform_G.Aspiotis.pdf
Microsoft - Power Platform_G.Aspiotis.pdf
 
Mind map of terminologies used in context of Generative AI
Mind map of terminologies used in context of Generative AIMind map of terminologies used in context of Generative AI
Mind map of terminologies used in context of Generative AI
 
Observability Concepts EVERY Developer Should Know -- DeveloperWeek Europe.pdf
Observability Concepts EVERY Developer Should Know -- DeveloperWeek Europe.pdfObservability Concepts EVERY Developer Should Know -- DeveloperWeek Europe.pdf
Observability Concepts EVERY Developer Should Know -- DeveloperWeek Europe.pdf
 
FIDO Alliance Osaka Seminar: The WebAuthn API and Discoverable Credentials.pdf
FIDO Alliance Osaka Seminar: The WebAuthn API and Discoverable Credentials.pdfFIDO Alliance Osaka Seminar: The WebAuthn API and Discoverable Credentials.pdf
FIDO Alliance Osaka Seminar: The WebAuthn API and Discoverable Credentials.pdf
 
National Security Agency - NSA mobile device best practices
National Security Agency - NSA mobile device best practicesNational Security Agency - NSA mobile device best practices
National Security Agency - NSA mobile device best practices
 
GraphSummit Singapore | Graphing Success: Revolutionising Organisational Stru...
GraphSummit Singapore | Graphing Success: Revolutionising Organisational Stru...GraphSummit Singapore | Graphing Success: Revolutionising Organisational Stru...
GraphSummit Singapore | Graphing Success: Revolutionising Organisational Stru...
 

12 Things Developers Will Love About Oracle Database 12c Release 2

  • 1. Copyright © 2017, Oracle and/or its affiliates. All rights reserved. | 12 Things Developers Will Love About Oracle Database 12c Release 2 Chris Saxon Oracle Developer Advocate for SQL blogs.oracle.com/sql @chrisrsaxon & @SQLDaily youtube.com/c/TheMagicOfSQL blogs.oracle.com/sql www.youtube.com/c/TheMagicOfSQL @ChrisRSaxon
  • 2. Copyright © 2017, Oracle and/or its affiliates. All rights reserved. | Safe Harbor Statement 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. blogs.oracle.com/sql www.youtube.com/c/TheMagicOfSQL @ChrisRSaxon
  • 3. Copyright © 2017, Oracle and/or its affiliates. All rights reserved. | blogs.oracle.com/sql www.youtube.com/c/TheMagicOfSQL @ChrisRSaxon
  • 4. Copyright © 2017, Oracle and/or its affiliates. All rights reserved. | blogs.oracle.com/sql www.youtube.com/c/TheMagicOfSQL @ChrisRSaxon
  • 5. Copyright © 2017, Oracle and/or its affiliates. All rights reserved. | "There are only two hard things in Computer Science: cache invalidation and naming things." – Phil Karlton blogs.oracle.com/sql www.youtube.com/c/TheMagicOfSQL @ChrisRSaxon
  • 6. Copyright © 2017, Oracle and/or its affiliates. All rights reserved. | "There are only two hard things in Computer Science: cache invalidation and naming things." – Phil Karlton blogs.oracle.com/sql www.youtube.com/c/TheMagicOfSQL @ChrisRSaxon
  • 7. Copyright © 2017, Oracle and/or its affiliates. All rights reserved. | blogs.oracle.com/sql www.youtube.com/c/TheMagicOfSQL @ChrisRSaxon
  • 8. Copyright © 2017, Oracle and/or its affiliates. All rights reserved. | blogs.oracle.com/sql www.youtube.com/c/TheMagicOfSQL @ChrisRSaxon
  • 9. Copyright © 2017, Oracle and/or its affiliates. All rights reserved. | blogs.oracle.com/sql www.youtube.com/c/TheMagicOfSQL @ChrisRSaxon
  • 10. Copyright © 2017, Oracle and/or its affiliates. All rights reserved. | <table_name>_<column_name>_fk blogs.oracle.com/sql www.youtube.com/c/TheMagicOfSQL @ChrisRSaxon
  • 11. Copyright © 2017, Oracle and/or its affiliates. All rights reserved. | alter table customer_addresses add constraint customer_addresses_customer_id_fk foreign key ( customer_id ) references customers ( customer_id ); <table_name>_<column_name>_fk blogs.oracle.com/sql www.youtube.com/c/TheMagicOfSQL @ChrisRSaxon
  • 12. Copyright © 2017, Oracle and/or its affiliates. All rights reserved. | alter table customer_addresses add constraint customer_addresses_customer_id_fk foreign key ( customer_id ) references customers ( customer_id ); SQL Error: ORA-00972: identifier is too long <table_name>_<column_name>_fk blogs.oracle.com/sql www.youtube.com/c/TheMagicOfSQL @ChrisRSaxon
  • 13. Copyright © 2017, Oracle and/or its affiliates. All rights reserved. | blogs.oracle.com/sql www.youtube.com/c/TheMagicOfSQL @ChrisRSaxon
  • 14. Copyright © 2017, Oracle and/or its affiliates. All rights reserved. | blogs.oracle.com/sql www.youtube.com/c/TheMagicOfSQL @ChrisRSaxon
  • 15. Copyright © 2017, Oracle and/or its affiliates. All rights reserved. | blogs.oracle.com/sql www.youtube.com/c/TheMagicOfSQL @ChrisRSaxon
  • 16. Copyright © 2017, Oracle and/or its affiliates. All rights reserved. | blogs.oracle.com/sql www.youtube.com/c/TheMagicOfSQL @ChrisRSaxon
  • 17. Copyright © 2017, Oracle and/or its affiliates. All rights reserved. | blogs.oracle.com/sql www.youtube.com/c/TheMagicOfSQL @ChrisRSaxon
  • 19. Copyright © 2017, Oracle and/or its affiliates. All rights reserved. | 128 bytes blogs.oracle.com/sql www.youtube.com/c/TheMagicOfSQL @ChrisRSaxon
  • 20. Copyright © 2017, Oracle and/or its affiliates. All rights reserved. | create table with_a_really_really_really_really_really_long_name ( and_lots_and_lots_and_lots_and_lots int, of_really_really_really_really_really_long_cols int ); blogs.oracle.com/sql www.youtube.com/c/TheMagicOfSQL @ChrisRSaxon
  • 21. Copyright © 2017, Oracle and/or its affiliates. All rights reserved. | create or replace procedure process_tab is begin select table_name into tab from user_tables where ... blogs.oracle.com/sql www.youtube.com/c/TheMagicOfSQL @ChrisRSaxon
  • 22. Copyright © 2017, Oracle and/or its affiliates. All rights reserved. | create or replace procedure process_tab is tab varchar2(30); begin select table_name into tab from user_tables where ... blogs.oracle.com/sql www.youtube.com/c/TheMagicOfSQL @ChrisRSaxon
  • 23. Copyright © 2017, Oracle and/or its affiliates. All rights reserved. | exec proccess_tab; blogs.oracle.com/sql www.youtube.com/c/TheMagicOfSQL @ChrisRSaxon
  • 24. Copyright © 2017, Oracle and/or its affiliates. All rights reserved. | exec proccess_tab; ORA-06502: PL/SQL: numeric or value error: character string buffer too small blogs.oracle.com/sql www.youtube.com/c/TheMagicOfSQL @ChrisRSaxon
  • 25. Copyright © 2017, Oracle and/or its affiliates. All rights reserved. | Ryan McGuire / Gratisographyblogs.oracle.com/sql www.youtube.com/c/TheMagicOfSQL @ChrisRSaxon
  • 26. <expressions> in place of 'literals' blogs.oracle.com/sql www.youtube.com/c/TheMagicOfSQL @ChrisRSaxon
  • 27. Copyright © 2017, Oracle and/or its affiliates. All rights reserved. | declare v1 varchar2 ( 30 ); begin blogs.oracle.com/sql www.youtube.com/c/TheMagicOfSQL @ChrisRSaxon
  • 28. Copyright © 2017, Oracle and/or its affiliates. All rights reserved. | declare v1 varchar2 ( 30 ); var_length constant pls_integer := 30; begin blogs.oracle.com/sql www.youtube.com/c/TheMagicOfSQL @ChrisRSaxon
  • 29. Copyright © 2017, Oracle and/or its affiliates. All rights reserved. | declare v1 varchar2 ( 30 ); var_length constant pls_integer := 30; v2 varchar2( var_length ); begin blogs.oracle.com/sql www.youtube.com/c/TheMagicOfSQL @ChrisRSaxon
  • 30. Copyright © 2017, Oracle and/or its affiliates. All rights reserved. | declare v1 varchar2 ( 30 ); var_length constant pls_integer := 30; v2 varchar2( var_length ); begin Must know at compile time blogs.oracle.com/sql www.youtube.com/c/TheMagicOfSQL @ChrisRSaxon
  • 31. Copyright © 2017, Oracle and/or its affiliates. All rights reserved. | declare v1 varchar2 ( 30 ); var_length constant pls_integer := 30; v2 varchar2( var_length ); begin Must know at compile time  SQL  User functions Constants blogs.oracle.com/sql www.youtube.com/c/TheMagicOfSQL @ChrisRSaxon
  • 32. Copyright © 2017, Oracle and/or its affiliates. All rights reserved. | create or replace procedure process_tab is $if DBMS_DB_VERSION.VER_LE_12_1 $then tab varchar2( 30 ); $else tab varchar2( ora_max_name_len ); $end begin blogs.oracle.com/sql www.youtube.com/c/TheMagicOfSQL @ChrisRSaxon
  • 33. Copyright © 2017, Oracle and/or its affiliates. All rights reserved. | create or replace procedure process_tab is $if DBMS_DB_VERSION.VER_LE_12_1 $then tab varchar2( 30 ); $else tab varchar2( ora_max_name_len ); $end begin Only one is compiled blogs.oracle.com/sql www.youtube.com/c/TheMagicOfSQL @ChrisRSaxon
  • 34. Copyright © 2017, Oracle and/or its affiliates. All rights reserved. | create or replace procedure process_tab is $if DBMS_DB_VERSION.VER_LE_12_1 $then tab varchar2( 30 ); $else tab varchar2( ora_max_name_len ); $end begin Only one is compiled 12.1 blogs.oracle.com/sql www.youtube.com/c/TheMagicOfSQL @ChrisRSaxon
  • 35. Copyright © 2017, Oracle and/or its affiliates. All rights reserved. | create or replace procedure process_tab is $if DBMS_DB_VERSION.VER_LE_12_1 $then tab varchar2( 30 ); $else tab varchar2( ora_max_name_len ); $end begin Only one is compiled 12.1 12.2+ blogs.oracle.com/sql www.youtube.com/c/TheMagicOfSQL @ChrisRSaxon
  • 36. Copyright © 2017, Oracle and/or its affiliates. All rights reserved. | user_tables.table_name%type blogs.oracle.com/sql www.youtube.com/c/TheMagicOfSQL @ChrisRSaxon
  • 37. Copyright © 2017, Oracle and/or its affiliates. All rights reserved. | select table_name, listagg(index_name, ',') within group (order by index_name) inds from user_indexes group by table_name; blogs.oracle.com/sql www.youtube.com/c/TheMagicOfSQL @ChrisRSaxon
  • 38. Copyright © 2017, Oracle and/or its affiliates. All rights reserved. | select table_name, listagg(index_name, ',') within group (order by index_name) inds from user_indexes group by table_name;4,000* byte limit blogs.oracle.com/sql www.youtube.com/c/TheMagicOfSQL @ChrisRSaxon
  • 39. Copyright © 2017, Oracle and/or its affiliates. All rights reserved. | select table_name, listagg(index_name, ',') within group (order by index_name) inds from user_indexes group by table_name;4,000* byte limit 130 indexes/tab blogs.oracle.com/sql www.youtube.com/c/TheMagicOfSQL @ChrisRSaxon
  • 40. Copyright © 2017, Oracle and/or its affiliates. All rights reserved. | select table_name, listagg(index_name, ',') within group (order by index_name) inds from user_indexes group by table_name;4,000* byte limit 130 indexes/tab 31 blogs.oracle.com/sql www.youtube.com/c/TheMagicOfSQL @ChrisRSaxon
  • 41. Copyright © 2017, Oracle and/or its affiliates. All rights reserved. | "Self documenting" indexes... blogs.oracle.com/sql www.youtube.com/c/TheMagicOfSQL @ChrisRSaxon
  • 42. Copyright © 2017, Oracle and/or its affiliates. All rights reserved. | "Self documenting" indexes... create index reducing_the_monthly_invoice_run_ blogs.oracle.com/sql www.youtube.com/c/TheMagicOfSQL @ChrisRSaxon
  • 43. Copyright © 2017, Oracle and/or its affiliates. All rights reserved. | "Self documenting" indexes... create index reducing_the_monthly_invoice_run_ from_four_hours_to_three_minutes_ blogs.oracle.com/sql www.youtube.com/c/TheMagicOfSQL @ChrisRSaxon
  • 44. Copyright © 2017, Oracle and/or its affiliates. All rights reserved. | "Self documenting" indexes... create index reducing_the_monthly_invoice_run_ from_four_hours_to_three_minutes_ PROJ12345_make_everything_faster_ blogs.oracle.com/sql www.youtube.com/c/TheMagicOfSQL @ChrisRSaxon
  • 45. Copyright © 2017, Oracle and/or its affiliates. All rights reserved. | "Self documenting" indexes... create index reducing_the_monthly_invoice_run_ from_four_hours_to_three_minutes_ PROJ12345_make_everything_faster_ csaxon_is_the_sql_tuning_master on ... blogs.oracle.com/sql www.youtube.com/c/TheMagicOfSQL @ChrisRSaxon
  • 46. Copyright © 2017, Oracle and/or its affiliates. All rights reserved. | select table_name, listagg(index_name, ',') within group (order by index_name) inds from user_indexes group by table_name; blogs.oracle.com/sql www.youtube.com/c/TheMagicOfSQL @ChrisRSaxon
  • 47. Copyright © 2017, Oracle and/or its affiliates. All rights reserved. | select table_name, listagg(index_name, ',') within group (order by index_name) inds from user_indexes group by table_name; ORA-01489: result of string concatenation is too long blogs.oracle.com/sql www.youtube.com/c/TheMagicOfSQL @ChrisRSaxon
  • 48. listagg ( improved on overflooooo ) blogs.oracle.com/sql www.youtube.com/c/TheMagicOfSQL @ChrisRSaxon
  • 49. Copyright © 2017, Oracle and/or its affiliates. All rights reserved. | select table_name, listagg(index_name, ',' on overflow truncate ) within group (order by index_name) inds from user_indexes group by table_name; blogs.oracle.com/sql www.youtube.com/c/TheMagicOfSQL @ChrisRSaxon
  • 50. Copyright © 2017, Oracle and/or its affiliates. All rights reserved. | select table_name, listagg(index_name, ',' on overflow truncate ) within group (order by index_name) inds from user_indexes group by table_name; ...lots_and_lots,of_indexes,...(42) blogs.oracle.com/sql www.youtube.com/c/TheMagicOfSQL @ChrisRSaxon
  • 51. Copyright © 2017, Oracle and/or its affiliates. All rights reserved. | listagg ( things, ',' [ on overflow (truncate|error) ] [ text ] [ (with|without) count ] ) within group (order by cols) blogs.oracle.com/sql www.youtube.com/c/TheMagicOfSQL @ChrisRSaxon
  • 52. Copyright © 2017, Oracle and/or its affiliates. All rights reserved. | First name Last name blogs.oracle.com/sql www.youtube.com/c/TheMagicOfSQL @ChrisRSaxon
  • 53. Copyright © 2017, Oracle and/or its affiliates. All rights reserved. | select * from people where first_name = 'Chris' and last_name = 'Saxon'; FIRST_NAME LAST_NAME Chris Saxon blogs.oracle.com/sql www.youtube.com/c/TheMagicOfSQL @ChrisRSaxon
  • 54. Copyright © 2017, Oracle and/or its affiliates. All rights reserved. | select * from people where first_name = 'Chris' and last_name = 'Saxon'; FIRST_NAME LAST_NAME Chris Saxon blogs.oracle.com/sql www.youtube.com/c/TheMagicOfSQL @ChrisRSaxon
  • 55. Copyright © 2017, Oracle and/or its affiliates. All rights reserved. | select * from people where first_name = 'Chris' and last_name = 'Saxon'; FIRST_NAME LAST_NAME Chris Saxon blogs.oracle.com/sql www.youtube.com/c/TheMagicOfSQL @ChrisRSaxon
  • 56. Copyright © 2017, Oracle and/or its affiliates. All rights reserved. | select * from people where first_name = 'Chris' and last_name = 'Saxon'; FIRST_NAME LAST_NAME Chris Saxon blogs.oracle.com/sql www.youtube.com/c/TheMagicOfSQL @ChrisRSaxon
  • 57. Copyright © 2017, Oracle and/or its affiliates. All rights reserved. | select * from people where first_name = 'Chris' and last_name = 'Saxon'; FIRST_NAME LAST_NAME Chris Saxon blogs.oracle.com/sql www.youtube.com/c/TheMagicOfSQL @ChrisRSaxon
  • 58. Copyright © 2017, Oracle and/or its affiliates. All rights reserved. | select * from people where first_name = 'Chris' and last_name = 'Saxon'; FIRST_NAME LAST_NAME Chris Saxon blogs.oracle.com/sql www.youtube.com/c/TheMagicOfSQL @ChrisRSaxon
  • 60. Copyright © 2017, Oracle and/or its affiliates. All rights reserved. | create table t ( case_and_accent_sensitive varchar2(10), case_insensitive_accent_sensitive varchar2(10) collate binary_ci, case_and_accent_insensitive varchar2(10) collate binary_ai ); blogs.oracle.com/sql www.youtube.com/c/TheMagicOfSQL @ChrisRSaxon
  • 61. Copyright © 2017, Oracle and/or its affiliates. All rights reserved. | blogs.oracle.com/sql www.youtube.com/c/TheMagicOfSQL @ChrisRSaxon
  • 62. Copyright © 2017, Oracle and/or its affiliates. All rights reserved. | blogs.oracle.com/sql www.youtube.com/c/TheMagicOfSQL @ChrisRSaxon
  • 63. Copyright © 2017, Oracle and/or its affiliates. All rights reserved. | Must drop & recreate indexes blogs.oracle.com/sql www.youtube.com/c/TheMagicOfSQL @ChrisRSaxon
  • 64. Copyright © 2017, Oracle and/or its affiliates. All rights reserved. | blogs.oracle.com/sql www.youtube.com/c/TheMagicOfSQL @ChrisRSaxon
  • 65. Copyright © 2017, Oracle and/or its affiliates. All rights reserved. | blogs.oracle.com/sql www.youtube.com/c/TheMagicOfSQL @ChrisRSaxon
  • 66. Copyright © 2017, Oracle and/or its affiliates. All rights reserved. | > > blogs.oracle.com/sql www.youtube.com/c/TheMagicOfSQL @ChrisRSaxon
  • 67. Copyright © 2017, Oracle and/or its affiliates. All rights reserved. | alter table people default collation binary_ai; blogs.oracle.com/sql www.youtube.com/c/TheMagicOfSQL @ChrisRSaxon
  • 68. Copyright © 2017, Oracle and/or its affiliates. All rights reserved. | alter table people default collation binary_ai; Existing columns unaffected! blogs.oracle.com/sql www.youtube.com/c/TheMagicOfSQL @ChrisRSaxon
  • 69. Copyright © 2017, Oracle and/or its affiliates. All rights reserved. | alter table people default collation binary_ai; ORA-43929: Collation cannot be specified if parameter MAX_STRING_SIZE=STANDARD Existing columns unaffected! blogs.oracle.com/sql www.youtube.com/c/TheMagicOfSQL @ChrisRSaxon
  • 70. Copyright © 2017, Oracle and/or its affiliates. All rights reserved. | alter table people default collation binary_ai; ORA-43929: Collation cannot be specified if parameter MAX_STRING_SIZE=STANDARD Must be EXTENDED! Existing columns unaffected! blogs.oracle.com/sql www.youtube.com/c/TheMagicOfSQL @ChrisRSaxon
  • 71. Copyright © 2017, Oracle and/or its affiliates. All rights reserved. | create or replace package customer_pkg as cursor get_customers_upper (p_name varchar2) is select * from customers where upper(customer_name) = upper(p_name); blogs.oracle.com/sql www.youtube.com/c/TheMagicOfSQL @ChrisRSaxon
  • 72. Copyright © 2017, Oracle and/or its affiliates. All rights reserved. | create or replace package customer_pkg as cursor get_customers_upper (p_name varchar2) is select * from customers where upper(customer_name) = upper(p_name); cursor get_customers (p_name varchar2) is select * from customers where customer_name = p_name; blogs.oracle.com/sql www.youtube.com/c/TheMagicOfSQL @ChrisRSaxon
  • 73. Copyright © 2017, Oracle and/or its affiliates. All rights reserved. | create or replace package customer_pkg as /* get_customers_upper is deprecated. Do not use or I'll come for you with a rusty spoon! */ cursor get_customers_upper (p_name varchar2) is select * from customers where upper(customer_name) = upper(p_name); cursor get_customers (p_name varchar2) is select * from customers where customer_name = p_name; blogs.oracle.com/sql www.youtube.com/c/TheMagicOfSQL @ChrisRSaxon
  • 74. pragma deprecate ( your_old_code ) blogs.oracle.com/sql www.youtube.com/c/TheMagicOfSQL @ChrisRSaxon
  • 75. Copyright © 2017, Oracle and/or its affiliates. All rights reserved. | create or replace package customer_pkg as /* get_customers_upper is deprecated. Do not use or I'll come for you with a rusty spoon */ cursor get_customers_upper (p_name varchar2) is select * from customers where upper(customer_name) = upper(p_name); cursor get_customers (p_name varchar2) is select * from customers where customer_name = p_name; blogs.oracle.com/sql www.youtube.com/c/TheMagicOfSQL @ChrisRSaxon
  • 76. Copyright © 2017, Oracle and/or its affiliates. All rights reserved. | create or replace package customer_pkg as /* get_customers_upper is deprecated. Do not use or I'll come for you with a rusty spoon */ cursor get_customers_upper (p_name varchar2) is select * from customers where upper(customer_name) = upper(p_name); pragma deprecate(get_customers_upper, 'Use get_customers instead'); cursor get_customers (p_name varchar2) is select * from customers where customer_name = p_name; blogs.oracle.com/sql www.youtube.com/c/TheMagicOfSQL @ChrisRSaxon
  • 77. Copyright © 2017, Oracle and/or its affiliates. All rights reserved. | alter system set plsql_warnings = 'enable:(6019,6020,6021,6022)'; blogs.oracle.com/sql www.youtube.com/c/TheMagicOfSQL @ChrisRSaxon
  • 78. Copyright © 2017, Oracle and/or its affiliates. All rights reserved. | SP2-0804: Procedure created with compilation warnings LINE/COL ERROR -------- ----------------------------------------------------------- 1/1 PLW-05018: unit PROCESS_CUSTOMERS omitted optional AUTHID clause; default value DEFINER used 4/29 PLW-06020: reference to a deprecated entity: GET_CUSTOMERS_UPPER declared in unit CUSTOMER_PKG[2,10]. Use get_customers instead 7/9 PLW-06020: reference to a deprecated entity: GET_CUSTOMERS_UPPER declared in unit CUSTOMER_PKG[2,10]. Use get_customers instead 8/9 PLW-06020: reference to a deprecated entity: blogs.oracle.com/sql www.youtube.com/c/TheMagicOfSQL @ChrisRSaxon
  • 79. Copyright © 2017, Oracle and/or its affiliates. All rights reserved. | Whatever blogs.oracle.com/sql www.youtube.com/c/TheMagicOfSQL @ChrisRSaxon
  • 80. Copyright © 2017, Oracle and/or its affiliates. All rights reserved. | alter system set plsql_warnings = 'error:6020'; blogs.oracle.com/sql www.youtube.com/c/TheMagicOfSQL @ChrisRSaxon
  • 81. Copyright © 2017, Oracle and/or its affiliates. All rights reserved. | Warning: Procedure altered with compilation errors. LINE/COL ERROR -------- -------------------------------------------------------- 4/29 PLS-06020: reference to a deprecated entity: GET_CUSTOMERS_UPPER declared in unit CUSTOMER_PKG[2,10]. Use get_customers instead 7/9 PLS-06020: reference to a deprecated entity: GET_CUSTOMERS_UPPER declared in unit CUSTOMER_PKG[2,10]. Use get_customers instead 8/9 PLS-06020: reference to a deprecated entity: GET_CUSTOMERS_UPPER declared in unit CUSTOMER_PKG[2,10]. Use get_customers instead blogs.oracle.com/sql www.youtube.com/c/TheMagicOfSQL @ChrisRSaxon
  • 82. Copyright © 2017, Oracle and/or its affiliates. All rights reserved. | ext_tab blogs.oracle.com/sql www.youtube.com/c/TheMagicOfSQL @ChrisRSaxon
  • 83. Copyright © 2017, Oracle and/or its affiliates. All rights reserved. | ext_tab blogs.oracle.com/sql www.youtube.com/c/TheMagicOfSQL @ChrisRSaxon
  • 84. Copyright © 2017, Oracle and/or its affiliates. All rights reserved. | select * from ext_tab; blogs.oracle.com/sql www.youtube.com/c/TheMagicOfSQL @ChrisRSaxon
  • 85. Copyright © 2017, Oracle and/or its affiliates. All rights reserved. | select * from ext_tab; ORA-29913: error in executing ODCIEXTTABLEFETCH callout ORA-30653: reject limit reached blogs.oracle.com/sql www.youtube.com/c/TheMagicOfSQL @ChrisRSaxon
  • 86. Copyright © 2017, Oracle and/or its affiliates. All rights reserved. | ext_tab blogs.oracle.com/sql www.youtube.com/c/TheMagicOfSQL @ChrisRSaxon
  • 87. Copyright © 2017, Oracle and/or its affiliates. All rights reserved. | ext_tab blogs.oracle.com/sql www.youtube.com/c/TheMagicOfSQL @ChrisRSaxon
  • 88. Copyright © 2017, Oracle and/or its affiliates. All rights reserved. | alter table ext_tab location ('test.csv') reject limit unlimited; ext_tab blogs.oracle.com/sql www.youtube.com/c/TheMagicOfSQL @ChrisRSaxon
  • 89. External Table Parameter Override blogs.oracle.com/sql www.youtube.com/c/TheMagicOfSQL @ChrisRSaxon
  • 90. Copyright © 2017, Oracle and/or its affiliates. All rights reserved. | select * from ext_tab external modify ( [ default directory ] [ location ] [ access parameters ] [ reject limit ] ); blogs.oracle.com/sql www.youtube.com/c/TheMagicOfSQL @ChrisRSaxon
  • 91. Copyright © 2017, Oracle and/or its affiliates. All rights reserved. | select * from ext_tab external modify ( location ('test.csv') reject limit unlimited ); blogs.oracle.com/sql www.youtube.com/c/TheMagicOfSQL @ChrisRSaxon
  • 92. Copyright © 2017, Oracle and/or its affiliates. All rights reserved. | select * from ext_tab external modify ( location ('test.csv') reject limit unlimited ); no rows selected blogs.oracle.com/sql www.youtube.com/c/TheMagicOfSQL @ChrisRSaxon
  • 93. Copyright © 2017, Oracle and/or its affiliates. All rights reserved. | 01-SEP-2016 02-SEP-2016 03-SEP-2016 04-SEP-2016 05-SEP-2016 06-SEP-2016 07-SEP-2016 08-SEP-2016 09-SEP-2016 10-SEP-2016 11-SEP-2016 blogs.oracle.com/sql www.youtube.com/c/TheMagicOfSQL @ChrisRSaxon
  • 94. Copyright © 2017, Oracle and/or its affiliates. All rights reserved. | 2016/09/01 2016/09/02 2016/09/03 2016/09/04 2016/09/05 2016/09/06 2016/09/07 2016/09/08 2016/09/09 2016/09/10 2016/09/11 blogs.oracle.com/sql www.youtube.com/c/TheMagicOfSQL @ChrisRSaxon
  • 95. Copyright © 2017, Oracle and/or its affiliates. All rights reserved. | create table ext_tab ( ... created_date date varchar2(20) ... ) organization external ( ... created_date char(20) date_format date mask 'dd-MON-yyyy' ... blogs.oracle.com/sql www.youtube.com/c/TheMagicOfSQL @ChrisRSaxon
  • 96. Copyright © 2017, Oracle and/or its affiliates. All rights reserved. | create table ext_tab ( ... created_date date varchar2(20) ... ) organization external ( ... created_date char(20) date_format date mask 'dd-MON-yyyy' ... blogs.oracle.com/sql www.youtube.com/c/TheMagicOfSQL @ChrisRSaxon
  • 97. Copyright © 2017, Oracle and/or its affiliates. All rights reserved. | select to_date(created_date, 'dd-mon-yyyy') from ext_tab; blogs.oracle.com/sql www.youtube.com/c/TheMagicOfSQL @ChrisRSaxon
  • 98. Copyright © 2017, Oracle and/or its affiliates. All rights reserved. | select to_date(created_date, 'dd-mon-yyyy') from ext_tab; ORA-01843: not a valid month blogs.oracle.com/sql www.youtube.com/c/TheMagicOfSQL @ChrisRSaxon
  • 100. Copyright © 2017, Oracle and/or its affiliates. All rights reserved. | validate_conversion ( <expression> as <data type>, [ <format mask> ], [ <nls_parameters> ] ) blogs.oracle.com/sql www.youtube.com/c/TheMagicOfSQL @ChrisRSaxon
  • 101. Copyright © 2017, Oracle and/or its affiliates. All rights reserved. | validate_conversion ( <expression> as <data type>, [ <format mask> ], [ <nls_parameters> ] ) Defaults to NLS settings! blogs.oracle.com/sql www.youtube.com/c/TheMagicOfSQL @ChrisRSaxon
  • 102. Copyright © 2017, Oracle and/or its affiliates. All rights reserved. | validate_conversion ( <expression> as <data type>, [ <format mask> ], [ <nls_parameters> ] ) 1 = Success! 0 = Failure  Defaults to NLS settings! blogs.oracle.com/sql www.youtube.com/c/TheMagicOfSQL @ChrisRSaxon
  • 103. Copyright © 2017, Oracle and/or its affiliates. All rights reserved. | select to_date(created_date, 'dd-mon-yyyy') from ext_tab where validate_conversion ( created_date as date, 'dd-MON-yyyy' ) = 1; blogs.oracle.com/sql www.youtube.com/c/TheMagicOfSQL @ChrisRSaxon
  • 104. Copyright © 2017, Oracle and/or its affiliates. All rights reserved. | insert into error_table select created_date from ext_tab where validate_conversion ( created_date as date, 'dd-MON-yyyy' ) = 0; blogs.oracle.com/sql www.youtube.com/c/TheMagicOfSQL @ChrisRSaxon
  • 105. cast ( default on error ) blogs.oracle.com/sql www.youtube.com/c/TheMagicOfSQL @ChrisRSaxon
  • 106. Copyright © 2017, Oracle and/or its affiliates. All rights reserved. | cast ( <expression> as <data type> [ default <value> on conversion error ], [ <format mask> ], [ <nls_parameters> ] ) blogs.oracle.com/sql www.youtube.com/c/TheMagicOfSQL @ChrisRSaxon
  • 107. Copyright © 2017, Oracle and/or its affiliates. All rights reserved. | cast ( <expression> as <data type> [ default <value> on conversion error ], [ <format mask> ], [ <nls_parameters> ] ) this... ...must match this blogs.oracle.com/sql www.youtube.com/c/TheMagicOfSQL @ChrisRSaxon
  • 108. Copyright © 2017, Oracle and/or its affiliates. All rights reserved. | cast ( <expression> as <data type> [ default <value> on conversion error ], [ <format mask> ], [ <nls_parameters> ] ) to_date() to_number() to_timestamp() etc. Also... this... ...must match this blogs.oracle.com/sql www.youtube.com/c/TheMagicOfSQL @ChrisRSaxon
  • 109. Copyright © 2017, Oracle and/or its affiliates. All rights reserved. | select to_date( created_date default '01-JAN-0001' on conversion error, 'dd-mon-yyyy' ) from ext_tab; 01-JAN-0001 blogs.oracle.com/sql www.youtube.com/c/TheMagicOfSQL @ChrisRSaxon
  • 110. Copyright © 2017, Oracle and/or its affiliates. All rights reserved. | create table file_imports ( file_type varchar2(30), file_data clob ) blogs.oracle.com/sql www.youtube.com/c/TheMagicOfSQL @ChrisRSaxon
  • 111. Copyright © 2017, Oracle and/or its affiliates. All rights reserved. | create table file_imports ( file_type varchar2(30), file_data clob ) partition by list (file_type) ( partition p_fixed values ('FIXED'), partition p_csv values ('CSV') ); blogs.oracle.com/sql www.youtube.com/c/TheMagicOfSQL @ChrisRSaxon
  • 112. Copyright © 2017, Oracle and/or its affiliates. All rights reserved. | create table file_imports ( file_type varchar2(30), file_data clob ) partition by list (file_type) ( partition p_fixed values ('FIXED'), partition p_csv values ('CSV') ); insert into file_imports values ('XML', '<?xml version="1.0" encoding="UTF-8"?> ...'); blogs.oracle.com/sql www.youtube.com/c/TheMagicOfSQL @ChrisRSaxon
  • 113. Copyright © 2017, Oracle and/or its affiliates. All rights reserved. | create table file_imports ( file_type varchar2(30), file_data clob ) partition by list (file_type) ( partition p_fixed values ('FIXED'), partition p_csv values ('CSV') ); insert into file_imports values ('XML', '<?xml version="1.0" encoding="UTF-8"?> ...'); SQL Error: ORA-14400: inserted partition key does not map to any partition blogs.oracle.com/sql www.youtube.com/c/TheMagicOfSQL @ChrisRSaxon
  • 114. Copyright © 2017, Oracle and/or its affiliates. All rights reserved. | alter table file_imports add partition p_xml values ('XML'); blogs.oracle.com/sql www.youtube.com/c/TheMagicOfSQL @ChrisRSaxon
  • 115. Copyright © 2017, Oracle and/or its affiliates. All rights reserved. | alter table file_imports add partition p_xml values ('XML'); alter table file_imports add partition p_default values (default); blogs.oracle.com/sql www.youtube.com/c/TheMagicOfSQL @ChrisRSaxon
  • 116. Copyright © 2017, Oracle and/or its affiliates. All rights reserved. | p_fixed p_csv p_XML p_default FIXED FIXED FIXED CSV CSVCSV XML XML XML blogs.oracle.com/sql www.youtube.com/c/TheMagicOfSQL @ChrisRSaxon
  • 117. Copyright © 2017, Oracle and/or its affiliates. All rights reserved. | p_fixed p_csv p_XML p_default FIXED FIXED FIXED CSV CSVCSV XML YAMLXML XML JSONHTML blogs.oracle.com/sql www.youtube.com/c/TheMagicOfSQL @ChrisRSaxon
  • 118. Automatic List Part ition ing blogs.oracle.com/sql www.youtube.com/c/TheMagicOfSQL @ChrisRSaxon
  • 119. Copyright © 2017, Oracle and/or its affiliates. All rights reserved. | create table file_imports ( file_type varchar2(30), file_data clob ) partition by list (file_type) automatic ( partition p_fixed values ('FIXED'), partition p_csv values ('CSV'), partition p_XML values ('XML'), partition p_JSON values ('JSON'), partition p_default values (default) ); blogs.oracle.com/sql www.youtube.com/c/TheMagicOfSQL @ChrisRSaxon
  • 120. Copyright © 2017, Oracle and/or its affiliates. All rights reserved. | create table file_imports ( file_type varchar2(30), file_data clob ) partition by list (file_type) automatic ( partition p_fixed values ('FIXED'), partition p_csv values ('CSV'), partition p_XML values ('XML'), partition p_JSON values ('JSON'), partition p_default values (default) ); Mutually exclusive! blogs.oracle.com/sql www.youtube.com/c/TheMagicOfSQL @ChrisRSaxon
  • 121. Copyright © 2017, Oracle and/or its affiliates. All rights reserved. | create table file_imports ( file_type varchar2(30), file_data clob ) partition by list (file_type) automatic ( partition p_fixed values ('FIXED'), partition p_csv values ('CSV'), partition p_XML values ('XML'), partition p_JSON values ('JSON'), partition p_default values (default) ); Mutually exclusive! blogs.oracle.com/sql www.youtube.com/c/TheMagicOfSQL @ChrisRSaxon
  • 122. Copyright © 2017, Oracle and/or its affiliates. All rights reserved. | alter table file_imports split partition p_default into ( partition p_json values ('JSON'), partition p_yaml values ('YAML'), partition p_default ); blogs.oracle.com/sql www.youtube.com/c/TheMagicOfSQL @ChrisRSaxon
  • 123. Copyright © 2017, Oracle and/or its affiliates. All rights reserved. | alter table file_imports split partition p_default into ( partition p_json values ('JSON'), partition p_yaml values ('YAML'), partition p_default ); alter table file_imports drop partition p_default; blogs.oracle.com/sql www.youtube.com/c/TheMagicOfSQL @ChrisRSaxon
  • 124. Copyright © 2017, Oracle and/or its affiliates. All rights reserved. | alter table file_imports split partition p_default into ( partition p_json values ('JSON'), partition p_yaml values ('YAML'), partition p_default ); alter table file_imports drop partition p_default; alter table file_imports set partitioning automatic; blogs.oracle.com/sql www.youtube.com/c/TheMagicOfSQL @ChrisRSaxon
  • 125. Copyright © 2017, Oracle and/or its affiliates. All rights reserved. | { "department": "Accounting", "employees": [ { "name": "Shelley,Higgins", "job": "Accounting Manager" }, { "name": "William,Gietz", "job": "Public Accountant" } ] } JSON in 12.1.0.2 check ( employees_json is json ) blogs.oracle.com/sql www.youtube.com/c/TheMagicOfSQL @ChrisRSaxon
  • 126. Copyright © 2017, Oracle and/or its affiliates. All rights reserved. | { "department": "Accounting", "employees": [ { "name": "Shelley,Higgins", "job": "Accounting Manager" }, { "name": "William,Gietz", "job": "Public Accountant" } ] } blogs.oracle.com/sql www.youtube.com/c/TheMagicOfSQL @ChrisRSaxon
  • 128. Copyright © 2017, Oracle and/or its affiliates. All rights reserved. | json_array* => [ ] json_object* => { } blogs.oracle.com/sql www.youtube.com/c/TheMagicOfSQL @ChrisRSaxon
  • 129. Copyright © 2017, Oracle and/or its affiliates. All rights reserved. | json_array* => [ ] json_object* => { } [ ... ] {...} [ ... ] {...} [ ... ] {...} [ ... ] {...} [ ... ] {...} [ ... ] {...} [ ... ] {...} { ... } json_*agg =>json_*(non-agg) => [ ... ] blogs.oracle.com/sql www.youtube.com/c/TheMagicOfSQL @ChrisRSaxon
  • 130. Copyright © 2017, Oracle and/or its affiliates. All rights reserved. | select json_object ( 'department' value d.department_name, 'employees' value json_arrayagg ( json_object ( 'name' value first_name || ',' || last_name, 'job' value job_title ))) from hr.departments d, hr.employees e, hr.jobs j where d.department_id = e.department_id and e.job_id = j.job_id and d.department_id = 110 group by d.department_name blogs.oracle.com/sql www.youtube.com/c/TheMagicOfSQL @ChrisRSaxon
  • 131. Copyright © 2017, Oracle and/or its affiliates. All rights reserved. | ... and more JSON goodies blogs.oracle.com/sql www.youtube.com/c/TheMagicOfSQL @ChrisRSaxon
  • 132. Copyright © 2017, Oracle and/or its affiliates. All rights reserved. | json_exists ... and more JSON goodies GeoJSON JSON Partitioning In-Memory support JSON Data Guide Materialized Views Search index blogs.oracle.com/sql www.youtube.com/c/TheMagicOfSQL @ChrisRSaxon
  • 133. Copyright © 2017, Oracle and/or its affiliates. All rights reserved. | Also in 12.1.0.2... select count(distinct ...) from my_super_massive_table; blogs.oracle.com/sql www.youtube.com/c/TheMagicOfSQL @ChrisRSaxon
  • 134. Copyright © 2017, Oracle and/or its affiliates. All rights reserved. | Also in 12.1.0.2... select count(distinct ...) from my_super_massive_table; blogs.oracle.com/sql www.youtube.com/c/TheMagicOfSQL @ChrisRSaxon
  • 135. Copyright © 2017, Oracle and/or its affiliates. All rights reserved. | Give me your best estimate! blogs.oracle.com/sql www.youtube.com/c/TheMagicOfSQL @ChrisRSaxon
  • 136. Copyright © 2017, Oracle and/or its affiliates. All rights reserved. | select approx_count_distinct (...) from my_super_massive_table; faster & clse enogh blogs.oracle.com/sql www.youtube.com/c/TheMagicOfSQL @ChrisRSaxon
  • 137. select count(*) from user_source where upper(text) like '%COUNT%DISTINCT%'; 1,723 blogs.oracle.com/sql www.youtube.com/c/TheMagicOfSQL @ChrisRSaxon
  • 138. select count(*) from user_source where upper(text) like '%COUNT%DISTINCT%'; 1,723 blogs.oracle.com/sql www.youtube.com/c/TheMagicOfSQL @ChrisRSaxon
  • 140. Copyright © 2017, Oracle and/or its affiliates. All rights reserved. | alter session set approx_for_count_distinct = true; blogs.oracle.com/sql www.youtube.com/c/TheMagicOfSQL @ChrisRSaxon
  • 141. Copyright © 2017, Oracle and/or its affiliates. All rights reserved. | count ( distinct ... ) approx_count_distinct ( ... ) alter session set approx_for_count_distinct = true; blogs.oracle.com/sql www.youtube.com/c/TheMagicOfSQL @ChrisRSaxon
  • 142. Copyright © 2017, Oracle and/or its affiliates. All rights reserved. | Huh?approx_for_aggregation approx_for_percentile count ( distinct ... ) approx_count_distinct ( ... ) alter session set approx_for_count_distinct = true; blogs.oracle.com/sql www.youtube.com/c/TheMagicOfSQL @ChrisRSaxon
  • 143. Copyright © 2017, Oracle and/or its affiliates. All rights reserved. | approx_percentile ( <expression> [ deterministic ], [ ('ERROR_RATE' | 'CONFIDENCE') ] ) within group ( order by <expr> ) blogs.oracle.com/sql www.youtube.com/c/TheMagicOfSQL @ChrisRSaxon
  • 144. Copyright © 2017, Oracle and/or its affiliates. All rights reserved. | approx_percentile ( <expression> [ deterministic ], [ ('ERROR_RATE' | 'CONFIDENCE') ] ) within group ( order by <expr> ) Consistent; slower; numbers only blogs.oracle.com/sql www.youtube.com/c/TheMagicOfSQL @ChrisRSaxon
  • 145. Copyright © 2017, Oracle and/or its affiliates. All rights reserved. | approx_percentile ( <expression> [ deterministic ], [ ('ERROR_RATE' | 'CONFIDENCE') ] ) within group ( order by <expr> ) How certain are we? Consistent; slower; numbers only blogs.oracle.com/sql www.youtube.com/c/TheMagicOfSQL @ChrisRSaxon
  • 146. Copyright © 2017, Oracle and/or its affiliates. All rights reserved. | approx_percentile ( <expression> [ deterministic ], [ ('ERROR_RATE' | 'CONFIDENCE') ] ) within group ( order by <expr> ) Also approx_median How certain are we? Consistent; slower; numbers only blogs.oracle.com/sql www.youtube.com/c/TheMagicOfSQL @ChrisRSaxon
  • 147. Copyright © 2017, Oracle and/or its affiliates. All rights reserved. | It's time to start testing! ...but have we tested everything?blogs.oracle.com/sql www.youtube.com/c/TheMagicOfSQL @ChrisRSaxon
  • 149. Copyright © 2017, Oracle and/or its affiliates. All rights reserved. | begin if this or that then do_this(); else do_that(); end if; end; blogs.oracle.com/sql www.youtube.com/c/TheMagicOfSQL @ChrisRSaxon
  • 150. Copyright © 2017, Oracle and/or its affiliates. All rights reserved. | begin dbms_plsql_code_coverage.create_coverage_tables; end; blogs.oracle.com/sql www.youtube.com/c/TheMagicOfSQL @ChrisRSaxon
  • 151. Copyright © 2017, Oracle and/or its affiliates. All rights reserved. | declare run_id pls_integer; begin run_id := dbms_plsql_code_coverage.start_coverage('TEST1'); your_test_procedures; dbms_plsql_code_coverage.stop_coverage; end; / blogs.oracle.com/sql www.youtube.com/c/TheMagicOfSQL @ChrisRSaxon
  • 152. Copyright © 2017, Oracle and/or its affiliates. All rights reserved. | select u.owner, u.name, u.type, round((sum(b.covered)*100)/count(*)) as pct_covered from dbmspcc_runs r join dbmspcc_units u on r.run_id = u.run_id join dbmspcc_blocks b on b.object_id = u.object_id and b.run_id = u.run_id where r.run_comment = 'TEST1' group by u.owner, u.name, u.type blogs.oracle.com/sql www.youtube.com/c/TheMagicOfSQL @ChrisRSaxon
  • 153. Copyright © 2017, Oracle and/or its affiliates. All rights reserved. | blogs.oracle.com/sql www.youtube.com/c/TheMagicOfSQL @ChrisRSaxon
  • 154. Copyright © 2017, Oracle and/or its affiliates. All rights reserved. | blogs.oracle.com/sql www.youtube.com/c/TheMagicOfSQL @ChrisRSaxon
  • 155. Copyright © 2017, Oracle and/or its affiliates. All rights reserved. | select u.owner, u.name, u.type, round((sum(b.covered)*100)/count(*)) as pct_covered from dbmspcc_runs r join dbmspcc_units u on r.run_id = u.run_id join dbmspcc_blocks b on b.object_id = u.object_id and b.run_id = u.run_id where r.run_comment = 'TEST1' and not_feasible = 0 group by u.owner, u.name, u.type blogs.oracle.com/sql www.youtube.com/c/TheMagicOfSQL @ChrisRSaxon
  • 156. Copyright © 2017, Oracle and/or its affiliates. All rights reserved. | devgym.oracle.com/devgym/ database-for-developers.html #MakeDataGreatAgain Ryan McGuire / Gratisography
  • 157. Copyright © 2017, Oracle and/or its affiliates. All rights reserved. | Safe Harbor Statement The preceding 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. blogs.oracle.com/sql www.youtube.com/c/TheMagicOfSQL @ChrisRSaxon
  • 158. Copyright © 2017, Oracle and/or its affiliates. All rights reserved. | blogs.oracle.com/sql www.youtube.com/c/TheMagicOfSQL @ChrisRSaxon