Vous êtes sur la page 1sur 79

Oracle 12c Key Features for Developers

Presenter

V.Hariharaputhran
www.puthranv.com

Who am I

Senior Oracle Developer DBA with 12 years


of experience

-Data Modeler
-Developer
-SQL Tuning
-Replication/Migration
Member of AIOUG Since 2009
Blogger www.puthranv.com
FB Hariharaputhran Vaithinathan

Objectives
To make you all learn Oracle 12c Completely
Present few key features of Oracle 12c for
developers

Data Redaction

Real-time sensitive data


redaction based on user
name, IP address,
application context and
other factors
Transparent, consistent
enforcement in the
database
Defined through redaction
policies
Consistent enforcement
and changes the data just
before sending it to the
user

Whats the impact on


INDEX

REAL TIME ah! What


happens to active sessions

Stored Data

Redacted Results

05/04/1981

01/01/2001

Partial

012-54-7845

XXX-XX-7845

RegExp

juan.tom@abc.com

[hidden]@abc.com

Random

7845-2356-12344578

4545-6363-23567412

Full

SQL> SHOW USER


USER is "SYS"
SQL>
SQL> DESC C##REDACT.CREDIT_CARD
Name
Null? Type
-------------------------------------- -------- ------------------CUSTOMER_ID
VARCHAR2(10)
CUSTOMER_NAME
VARCHAR2(64)
CARD_ID
VARCHAR2(64)
SQL> SELECT * FROM C##REDACT.CREDIT_CARD;

BEGIN
DBMS_REDACT.ADD_POLICY(
OBJECT_SCHEMA => 'C##REDACT',
OBJECT_NAME => 'CREDIT_CARD',
COLUMN_NAME => 'CARD_ID',
POLICY_NAME => 'PARTIAL_CREDIT_CARD_ID',
FUNCTION_TYPE => DBMS_REDACT.REGEXP,
EXPRESSION => '1=1',
REGEXP_PATTERN => '(\d{4})-(\d{4})-(\d{4})-(\d{4})',
REGEXP_REPLACE_STRING => 'XXXX-XXXX-\2',
REGEXP_POSITION => 1,
REGEXP_OCCURRENCE => 0,
REGEXP_MATCH_PARAMETER => 'ic');
END;
/

CUSTOMER_ID CUSTOMER_NAME CARD_ID


--------------------------------------- ------------A0001
RAJINI 9999-9999-9999-9999
A0002
JUAN
1245-1235-1256-1235
SQL> SHOW USER
USER is "C##REDACT"
SQL>
SQL> SELECT * FROM CREDIT_CARD;
CUSTOMER_ID CUSTOMER_NAME
CARD_ID
-------------------------------------------------------A0001
RAJINI
XXXX-XXXX-9999
A0002
JUAN
XXXX-XXXX-1235

SQL> SHOW USER


USER is "SYS"
SQL>
SQL> DESC C##REDACT.CREDIT_CARD
Name
Null? Type
-------------------------------------- -------- ------------------CUSTOMER_ID
VARCHAR2(10)
CUSTOMER_NAME
VARCHAR2(64)
CARD_ID
VARCHAR2(64)
SQL> SELECT * FROM C##REDACT.CREDIT_CARD;
CUSTOMER_ID CUSTOMER_NAME CARD_ID
--------------------------------------- ------------A0001
RAJINI
9999-9999-9999-9999
A0002
JUAN
1245-1235-1256-1235

BEGIN
DBMS_REDACT.ADD_POLICY(
OBJECT_SCHEMA => 'C##REDACT',
OBJECT_NAME => 'CREDIT_CARD',
COLUMN_NAME => 'CARD_ID',
policy_name => 'redact_full_card',
function_type=> DBMS_REDACT.FULL,
expression =>
'SYS_CONTEXT(''USERENV'',''SESSION_USER'')!
=''MANAGER''');
END;
/
SQL> SHOW USER
USER is "C##REDACT"
SQL>
SQL> SELECT * FROM CREDIT_CARD;
CUSTOMER_ID
-------------------A0001
A0002

CUSTOMER_NAME
-------------------------RAJINI
JUAN

CARD_ID
-----------

SQL> SHOW USER


USER is "C##REDACT"
SQL>
SQL> SELECT * FROM CREDIT_CARD;
CUSTOMER_I D CUSTOMER_N
---------- ---------- -------------------A0001
RAJINI
A0002
JUAN

CARD_ID
--------

CARD_VAL
--------0
0

CARD_DT
-----------01-JAN-01
01-JAN-01

My application front end is Java and DB is


Oracle. What array should i use in my PLSQL program parameters to enable java program
to invoke them ?

Prior 12c
Create a schema level object type to match the
structure of the non-SQL package type
In 12c
PL/SQL package types supported as binds in JDBC
Execute PL/SQL subprograms with non-SQL types

CREATE OR REPLACE PACKAGE


PKG_DECLARE
IS
TYPE ORDER_DTLS
IS
RECORD
(
ORDER_ID Employees.ORDER_ID%type,
ORDER_ITEM
Employees.ORDER_ITEM%type,
ORDER_STATUS BOOLEAN,
ORDER_DATE
Employees.ORDER_DATE%type);
PROCEDURE SP_ORDER(
p_ORDER IN OUT ORDER_DTLS);
END PKG_DECLARE;

Supported types include


Records,
Index-by tables
Nested tables
Varrays
Table%rowtype
View%rowtype
Cursor%rowtype defined in Package

Prior to 12c
Impossible to bind PL/SQL-only data types to SQL statements
Boolean
Package-level record
Package-level collection
In 12c
The type can be defined in a package spec can be indexed by pls_integer
table

CREATE OR REPLACE
PACKAGE
pkg_plsql_in_sql
AS
TYPE associative_array
IS
TABLE OF VARCHAR2
(100) INDEX BY
PLS_INTEGER;
END pkg_plsql_in_sql;
/

TABLE OPERATOR

DECLARE
lv_associative_array
pkg_plsql_in_sql.associative_array;
BEGIN
lv_associative_array(1):='SANGAM14';
lv_associative_array(2):='AIOUG';
FOR REC IN
(SELECT * FROM
TABLE(lv_associative_array))

LOOP
DBMS_OUTPUT.put_line (
rec.COLUMN_VALUE);
END LOOP;
END;
/

CREATE OR REPLACE FUNCTION f1(


p_array IN
p_array
pkg_plsql_in_sql.associative_array
pkg_plsql_in_sql.associative_array
)
RETURN VARCHAR2
IS
lv VARCHAR2(100);
BEGIN
FOR rec IN 1..p_array.count
LOOP
lv :=lv||p_array(rec);
END LOOP;
RETURN lv;
END f1;
/

DECLARE
lv VARCHAR2(10);
lv_array
pkg_plsql_in_sql.associative
_array;
BEGIN
lv_array(1) := 'SANGAM14';
SELECT
SELECT f1(lv_array)
f1(lv_array) INTO
INTO lv
lv
FROM dual;
dual;
FROM
dbms_output.put_line('lv =
'||lv);
END;
/

CREATE OR REPLACE FUNCTION f1(


p_array IN
p_array
pkg_plsql_in_sql.associative_array
pkg_plsql_in_sql.associative_array
)
RETURN VARCHAR2
IS
lv VARCHAR2(100);
BEGIN
FOR rec IN 1..p_array.count
LOOP
lv :=lv||p_array(rec);
END LOOP;
RETURN lv;
END f1;
/

DECLARE
lv VARCHAR2(10);
lv_array
pkg_plsql_in_sql.associative
_array;
BEGIN
lv_array(1) := 'SANGAM14';
EXECUTEimmediate
immediate'select
'select
EXECUTE
f1(:a)
from
Dual'
INTO
f1(:a)
from
Dual'
INTO
lv lv
USING
lv_array;
USING
lv_array;
dbms_output.put_line('lv =
'||lv);
END;
/

BEGIN
EXECUTE immediate
'begin
SP_BIND_BOOLEAN(:a); end;'
USING true;
END;
/

How to retrieve a column which is set unsed ?


SQL> select * from t1;
SQL> alter table t1 add customer_id number;

CUSTOMER_ID CUSTOMER_NAME
CARD_ID
---------- ------------------------------------ -----------A0001
RAJINI 9999-9999-9999-9999
A0002
JUAN
12451235-1256-9999

Table altered.

SQL> alter table t1 set unused column customer_id;


SQL> select * from t1;
Table altered.

SQL> select * from t1;


CUSTOMER_NAME
--------------------------RAJINI
JUAN

CARD_ID
------------9999-9999-9999-9999
1245-1235-1256-9999

CUSTOMER_NAME
CARD_ID
--------------------------- ------------- ----------RAJINI
9999-9999-9999-9999
JUAN
1245-1235-1256-9999

CUSTOMER_ID

INVISIBLE COLUMNS

Invisible columns are


invisible, unless explicitly
specified
Can create columns as
invisible, later modified
from invisible to visible and
vice versa
When an invisible column
becomes visible, it appears
as the last column of the
table

They will not appear in:


SELECT * FROM
INSERT with no column list
%ROWTYPE

SQL> SELECT * FROM


TBL_INVSIBLE_COL;
ID
---------1
2
3
4
5

ID_VAL
ID_DT
-----------------ORACLE1 26-SEP-14
ORACLE2 25-SEP-14
ORACLE3 24-SEP-14
ORACLE4 23-SEP-14
ORACLE5 22-SEP-14

SQL> ALTER TABLE TBL_INVSIBLE_COL MODIFY ID_VAL


INVISIBLE;
Table altered.

SQL> SELECT * FROM


TBL_INVSIBLE_COL;
ID
---------1
2
3
4
5

ID_DT
--------26-SEP-14
25-SEP-14
24-SEP-14
23-SEP-14
22-SEP-14

SQL> DESC TBL_INVSIBLE_COL


Name
Null? Type
----------------------- -------- ---------------ID
NUMBER(38)
ID_DT
DATE
SQL> SET COLINVISIBLE ON
SQL>
SQL> DESC TBL_INVSIBLE_COL
Name
Null? Type
----------------------- -------- ---------------ID
NUMBER(38)
ID_DT
DATE
ID_VAL (INVISIBLE)
VARCHAR2(10)

Invisible columns can be also:


Virtual
Partitioning key

Restrictions - Cannot contain invisible


columns:
External tables
Temporary tables
Clustered tables

SQL> CREATE TABLE T (


2
RID NUMBER(5) PRIMARY KEY,
3
COL VARCHAR2(3));
Table created.

INSERT INTO t (col) VALUES ('A');


INSERT INTO t (col) VALUES ('B');
INSERT INTO t (col) VALUES ('C');

SQL> SELECT * FROM T;


SQL> CREATE OR REPLACE TRIGGER
ROW_LEVEL
2 BEFORE INSERT
3 ON T
4 FOR EACH ROW
5
6 BEGIN
7 SELECT SEQ_T.NEXTVAL
8 INTO :NEW.RID
9 FROM DUAL;
10 DBMS_OUTPUT.PUT_LINE(:NEW.RID);
11 END ROW_LEVEL;
12 /

RID
------1
2
3

COL
-----A
B
C

A column can be defined as identity


Implicit NOT NULL
Implicit sequence
You need the CREATE SEQUENCE privilege

CREATE TABLE TEST_IDENTIFY(


ID NUMBER GENERATED BY DEFAULT AS IDENTITY,
ID1 NUMBER)
OBJECT_NAME

OBJECT_ID

TEST_IDENTIFY

92911

ISEQ$$_92911

92912

Sequence created with system


generated name in the format
ISEQ$$_<object_id_of_table>

SQL> CREATE TABLE IDENTITY_NODEFAULT


2 (
3 ID

NUMBER GENERATED AS IDENTITY,

4 ID1

NUMBER,

5 ID_VAL

VARCHAR2(10)

6 );

SQL> CREATE TABLE IDENTITY_DEFAULT


2 (
3 ID
NUMBER GENERATED BY DEFAULT ON NULL AS
IDENTITY,
4 ID1
NUMBER,
5 ID_VAL VARCHAR2(10)
6 );

Table created.

SQL> DESC IDENTITY_NODEFAULT


Name
Null?
Type
----------- ------------------------------ -------ID
NOT NULL
NUMBER
ID1
NUMBER
ID_VAL
VARCHAR2(10)

SQL> DESC IDENTITY_DEFAULT


Name
Null?
Type
--------- -------------------------------- -------ID
NOT NULL
NUMBER
ID1
NUMBER
ID_VAL
VARCHAR2(10)

SQL> INSERT INTO


IDENTITY_NODEFAULT(ID1,ID_VAL) VALUES
(1,'ORACLE');

SQL> INSERT INTO IDENTITY_DEFAULT(ID1,ID_VAL)


VALUES (1,'ORACLE');

1 row created.
SQL> SELECT * FROM IDENTITY_NODEFAULT;

1 row created.
SQL> SELECT * FROM IDENTITY_DEFAULT;

ID
---------1

ID1
---------1

ID_VAL
---------ORACLE

ID
---------1

ID1
---------1

ID_VAL
---------ORACLE

GENERATED AS IDENTITY
SQL> INSERT INTO
IDENTITY_NODEFAULT(ID,ID1,ID_VAL) VALUES
(1,1,'ORACLE');
INSERT INTO IDENTITY_NODEFAULT(ID,ID1,ID_VAL)
VALUES (1,1,'ORACLE')
*
ERROR at line 1:
ORA-32795: cannot insert into a generated always identity
column

GENERATED BY DEFAULT ON
NULL AS IDENTITY
SQL> INSERT INTO
IDENTITY_DEFAULT(ID,ID1,ID_VAL) VALUES
(1,1,'ORACLE');
1 row created.

SQL> SELECT * FROM IDENTITY_NODEFAULT;

SQL> SELECT * FROM IDENTITY_DEFAULT;

ID
---------1

ID
---------1
1

ID1
---------1

ID_VAL
---------ORACLE

ID1
---------1
1

ID_VAL
---------ORACLE
ORACLE

Restrictions
Only for numeric data types
A table can only contain one identity column
Non-identity column cannot be modified to
identity column(But you can alter a nonIdentity table to include a Identify Column)
CTAS ignores the identity definition

When the table with identity column is dropped,

the system generated sequence is not dropped.

Non- Oracle RDBMs


Create table
user_comments(
user_id int,
comments
varchar2(6000))

Extended Varchars

Pre Oracle 12c


Create table
user_comments(
user_id number,
Oracle 12c
comments clob)
Create table
user_comments(
user_id number,
comments
varchar2(6000))

MAX_SQL_STRING_SIZE

LEGACY

EXTENDED

Non- Oracle RDBMs


SELECT
ID_DESC,SNO
FROM test FETCH
FIRST 5 rows only

Pre Oracle 12c


SELECT ID_DESC,SNO
FROM
(SELECT
ID_DESC,SNO,
ROW_NUMBER()
OVER (ORDER BY
NULL) rn
FROM TEST
)
WHERE rn<=5

Oracle 12c
SELECT
ID_DESC,SNO
FROM test
FETCH FIRST
5 rows only

SELECT "from$_subquery$_002"."ID_DESC" "ID_DESC",


"from$_subquery$_002"."SNO" "SNO"
FROM
(SELECT "TEST"."ID_DESC" "ID_DESC",
"TEST"."SNO" "SNO",
ROW_NUMBER() OVER ( ORDER BY NULL ) "rowlimit_$$_rownumber"
FROM "C##HARI"."TEST" "TEST"
) "from$_subquery$_002"
WHERE "from$_subquery$_002"."rowlimit_$$_rownumber"<=5

Non- Oracle RDBMs


SELECT * FROM test
FETCH FIRST 5
percent rows only

Pre Oracle 12c


SELECT ID_DESC,SNO
FROM
(SELECT ID_DESC,SNO,
ROW_NUMBER() OVER
( ORDER BY NULL) rn,
COUNT(*) OVER () cnt
FROM TEST
)
WHERE
rn<=CEIL(cnt*5/100)

Oracle 12c
SELECT
ID_DESC,SNO
FROM test
FETCH FIRST
5 percent
rows only

SELECT "from$_subquery$_002"."ID_DESC" "ID_DESC",


"from$_subquery$_002"."SNO" "SNO"
FROM
(SELECT "TEST"."ID_DESC" "ID_DESC",
"TEST"."SNO" "SNO",
ROW_NUMBER() OVER ( ORDER BY NULL) "rowlimit_$$_rownumber",
COUNT(*) OVER () "rowlimit_$$_total"
FROM "C##HARI"."TEST" "TEST"
) "from$_subquery$_002"
WHERE "from$_subquery$_002"."rowlimit_$$_rownumber"<=
CEIL("from$_subquery$_002"."rowlimit_$$_total"*5/100)

Non- Oracle RDBMs


create procedure
Fetch_Test as
Begin
SELECT * FROM test
end;

Oracle 12c

Pre Oracle 12c


CREATE OR REPLACE
PROCEDURE Fetch_test(
p_resultset OUT
sys_refcursor)
AS
BEGIN
OPEN p_resultset FOR
SELECT * FROM test;
END;
/

CREATE OR REPLACE
PROCEDURE
Fetch_test
AS
p_resultset
sys_refcursor;
BEGIN
OPEN p_resultset
FOR SELECT * FROM
test;
DBMS_SQL.RETURN_
RESULT(p_resultset);
END;
/

Range of numbers which is unique within a


session
Non persistent
Current value only visible to session

SQL> SELECT SEQ_SESSION1.NEXTVAL FROM DUAL;


SQL> CREATE SEQUENCE SEQ_SESSION1
SESSION;
Sequence created.

NEXTVAL
---------1
SQL> SELECT SEQ_SESSION1.NEXTVAL FROM DUAL;
NEXTVAL
---------2
SQL> CONN c##hari/hari@orcl
Connected.
SQL>
SQL> SELECT SEQ_SESSION1.NEXTVAL FROM DUAL;
NEXTVAL
---------1

Prior 12c
Cannot truncate the parent table if foreign
key constraint enabled
Cannot truncate the parent table of a
reference-partitioned table
In 12c
Yes, if the foreign key is defined with ON
DELETE CASCADE option.

Oracle 12c Indicates Last Login

Elena
BEQUEATH_T1
ID_NUM

ID_VAL

ID_DT

I AM C##ELENA

14-09-14

I AM C##ELENA

13-09-14

CREATE OR REPLACE VIEW


V_CNT_NORMAL
AS
SELECT id_VAL,
FN_CNT(ID_NUM)
FNCNT
FROM BEQUEATH_t1
/
GRANT SELECT ON V_CNT_NORMAL TO
c##juan

CREATE OR REPLACE FUNCTION FN_CNT (


P_ID_NUM IN NUMBER)
RETURN NUMBER
AUTHID CURRENT_USER
IS
l_count NUMBER:=0;
l_user
VARCHAR2 (100);
l_userid VARCHAR2 (100);
BEGIN
SELECT COUNT(*) INTO l_count FROM
BEQUEATH_t1 WHERE ID_NUM = P_ID_NUM;
/* Show who is invoking the function */
SELECT ora_invoking_user INTO l_user
FROM DUAL;
SELECT ora_invoking_userid INTO l_userid
FROM DUAL;
DBMS_OUTPUT.put_line (l_user);
DBMS_OUTPUT.put_line (l_userid);

RETURN l_count;
END;
/

Juan

ORACLE 11G

BEQUEATH_T1
ID_NUM

ID_VAL

ID_DT

I AM C##JUAN

16-09-14

I AM C##JUAN

17-09-14

CREATE OR REPLACE VIEW


V_CNT_NORMAL
BEQUEATH CURRENT_USER
AS
SELECT id_VAL,
FN_CNT(ID_NUM)
FNCNT
FROM BEQUEATH_t1
/

SQL> select * from c##elena.V_CNT_NORMAL;

ID_NUM ID_VAL
FNCNT
---------- -------------------- --------1 I AM C##ELENA
1
2 I AM C##ELENA
1

ORACLE 12C
SQL> select * from c##elena.V_CNT_NORMAL;
ID_NUM ID_VAL
FNCNT
---------- -------------------- --------1 I AM C##ELENA
1
2 I AM C##ELENA
0

Prior 12c
The WITH clause included only in subquery
factoring
In 12c
Oracle 12c allows definition of PL/SQL
Functions and Procedures using SQLs
Common Table Expression (WITH)
Since defined locally it reduces contextswitch costs
Local PL/SQL is not stored in the database

Not yet supported in static SQL in PL/SQL


Schema Level Function with PRAGMA UDF

Name resolution
Statement-level function names have precedence over schema-level stored
functions

SQL> SELECT * FROM TBL_T1;


ID ID_VAL
---------- ---------1
ORACLE
2
ORACLE
3
ORACLE
4
ORACLE
5
ORACLE

ID_DT
--------28-SEP-14
28-SEP-14
28-SEP-14
28-SEP-14
28-SEP-14

SQL> WITH FUNCTION


2 F1 (ID_IN NUMBER)
3 RETURN VARCHAR IS
4 LV_NUM VARCHAR2(100);
5 BEGIN
6 RETURN ID_IN||'ORACLE12C';
7 END;
8 SELECT F1(ID) FROM TBL_T1
9 /
F1(ID)
----------------1ORACLE12C
2ORACLE12C
3ORACLE12C
4ORACLE12C
5ORACLE12C

SQL> UPDATE TBL_T2 T2 SET T2.ID_VAL =


(T2.ID_VAL||
(WITH FUNCTION PLUS_ONE (P_ID IN NUMBER)
2 RETURN VARCHAR2
3 IS
4 BEGIN
5 RETURN P_ID+1;
6 END PLUS_ONE;
7 SELECT PLUS_ONE(T1.ID) FROM TBL_T1 T1
8 WHERE T1.ID=T2.ID)
9 )
10 /
UPDATE TBL_T2 T2 SET T2.ID_VAL = (T2.ID_VAL||
(WITH FUNCTION PLUS_ONE(P_ID IN NUMBER)
*
ERROR at line 1:
ORA-32034: unsupported use of WITH clause

SQL> UPDATE /*+ WITH_PLSQL */


2 TBL_T2 T2 SET T2.ID_VAL = (T2.ID_VAL||
(WITH FUNCTION PLUS_ONE(P_ID IN
NUMBER)
3 RETURN VARCHAR2
4 IS
5 BEGIN
6 RETURN P_ID+1;
7 END PLUS_ONE;
8 SELECT PLUS_ONE(T1.ID) FROM TBL_T1 T1
9 WHERE T1.ID=T2.ID)
10 )
11 /
9 rows updated.

Prior 12c,
Three functions in the DBMS_Utility package
Format_Call_Stack()
Format_Error_Stack()
Format_Error_Backtrace()
In 12c
The package UTL_Call_Stack solves the same problem properly

CREATE OR REPLACE PACKAGE PKG_TEST


AS
CREATE OR REPLACE PACKAGE BODY
PROCEDURE L1;
PKG_TEST
PROCEDURE L2;
IS
PROCEDURE L3;
PROCEDURE L1
END PKG_TEST;
IS
/
BEGIN

L2;
END L1;
PROCEDURE L2
IS
BEGIN
L3;
END L2;
PROCEDURE L3
IS
BEGIN
RAISE NO_DATA_FOUND;
EXCEPTION

----------FORMAT_ERROR_STACK----------ORA-01403: no data found


----------FORMAT_ERROR_BACKTRACE------ORA-06512: at "C##HARI.PKG_TEST", line 15

----------FORMAT_CALL_STACK------------------- PL/SQL Call Stack ------------object


line object
handle number name
000007FF6BC3BDE0
25 package body C##HARI.PKG_TEST
000007FF6BC3BDE0
10 package body C##HARI.PKG_TEST
000007FF6BC3BDE0
5 package body C##HARI.PKG_TEST
000007FF6B38E630
2 anonymous block

----------IN ORACLE 12C---------5 .__anonymous_block (2)


4 C##HARI.PKG_TEST.L1 (5)
3 C##HARI.PKG_TEST.L2 (10)
2 C##HARI.PKG_TEST.L3 (27)
1 C##HARI.CALL_STACK (7)

In 12c

CREATE OR REPLACE PROCEDURE CALL_STACK


IS
LV_DEPTH PLS_INTEGER :=
UTL_CALL_STACK.DYNAMIC_DEPTH;
BEGIN
FOR I IN REVERSE 1..LV_DEPTH LOOP
DBMS_OUTPUT.PUT_LINE (
LPAD(TO_CHAR(I,'99'),3) ||' '||
UTL_CALL_STACK.OWNER(I) ||'.'||
UTL_CALL_STACK.CONCATENATE_SUBPROGRAM
(UTL_CALL_STACK.SUBPROGRAM (I)) ||' ('||
UTL_CALL_STACK.UNIT_LINE(I) ||') '
);
END LOOP;
END;
/

Its a simple extension of the command line


interface
Control file is no more required
SQL*Loader uses the table column definitions
found in the ALL_TAB_COLUMNS
Generates a log file that includes a
SQL*Loader control file

create table test


2 ( id_desc varchar2(10),
3 sno number)
4 /
Table created.

test.dat
ORACLE,1
ORACLE,2
ORACLE,3
ORACLE,4

sqlldr c##hari@orcl TABLE=TEST


Password:
SQL*Loader: Release 12.1.0.1.0 - Production on Tue
Nov 4 22:59:44 2014
Copyright (c) 1982, 2013, Oracle and/or its affiliates.
All rights reserved.
Express Mode Load, Table: TEST
Path used: External Table,
DEGREE_OF_PARALLELISM=AUTO
Table TEST:
4 Rows successfully loaded.
Check the log files:
TEST.log
TEST_%p.log_xt
for more information about the load.

SQL*Loader: Release 12.1.0.1.0 - Production on Tue Nov 4 22:59:44


2014
Copyright (c) 1982, 2013, Oracle and/or its affiliates. All rights
reserved.

Express Mode Load, Table: TEST


Data File:
Bad File:

TEST.dat
TEST_%p.bad

Log File

Discard File: none specified


(Allow all discards)
Number to load: ALL
Number to skip: 0
Errors allowed: 50
Continuation:
Path used:

none specified
External Table

Table TEST, loaded from every logical record.


Insert option in effect for this table: APPEND
Column Name

Position Len Term Encl Datatype

------------------------------ ---------- ----- ---- ---- --------------------ID_DESC


SNO

FIRST
NEXT

* ,
* ,

CHARACTER
CHARACTER

Generated control file for possible reuse:


OPTIONS(EXTERNAL_TABLE=EXECUTE,
TRIM=LRTRIM)
LOAD DATA
INFILE 'test'
APPEND
INTO TABLE TEST
FIELDS TERMINATED BY ","
(
ID_DESC,
SNO
)
End of generated control file for possible reuse.

The ACCESSIBLE BY clause can be added to


packages, procedures, functions and types to
specify which objects are able to reference
the PL/SQL object directly
ACCESSIBLE BY:
Object name
Object type and object name
The white list objects do not have to exist

SQL> CREATE OR REPLACE FUNCTION library


2 ( pv_message VARCHAR2 ) RETURN
VARCHAR2
3 ACCESSIBLE BY
4 ( FUNCTION
C##HARI.F1_CANCALL
5 , PROCEDURE
C##HARI.P1_CANCALL
6 , PACKAGE
C##HARI.PKG_CANCALL )
IS
7 lv_message VARCHAR2(100) :=
'ORACLE12c_WHITELIST ';
8 BEGIN
9 lv_message := lv_message || pv_message || '!';
10 RETURN lv_message;
11 END;
12 /
Invalidates at compilation time itself

SQL> CREATE OR REPLACE FUNCTION


F1_TRYTOCALL
2 ( pv_message VARCHAR2 ) RETURN VARCHAR2
IS
3 BEGIN
4 RETURN F1_WHITELISTS(pv_message);
5 END;
6/
SQL> show errors
Errors for FUNCTION F1_TRYTOCALL:
LINE/COL ERROR
-------- ---------------------------------------------4/3 PL/SQL: Statement ignored
4/10 PLS-00904: insufficient privilege to access
object F1_TRYTOCALL

Can we have multiple


types of indexes on
the same column ?

You can create more then one index on a column.

But you can set only one Index to Visible

Exception to FBI 1+ FBI is allowed

Restrictions
Cannot create a B-tree AND B-tree cluster index

Means maintaining uninterrupted availability of the


application
Support Hot Rollover
Must be possible to use the pre-upgrade application and the
post-upgrade application at the same time

EBR

Prior Oracle 12c


Editionable Object Types
PL/SQL Objects
Synonyms
Views

Oracle 12c
Materialized Views may use EBR
Virtual Columns may use EBR

Q&A

Thank you for attending my session

Presenter

V.Hariharaputhran
www.puthranv.com

Vous aimerez peut-être aussi