Date post: | 05-Dec-2014 |
Category: |
Technology |
Upload: | amis-friends-of-oracle-and-java |
View: | 842 times |
Download: | 0 times |
About me…
• Patrick Barel
• Working with Oracle since 1997
• Working with PL/SQL since 1999
• Playing with APEX since 2003 (mod_plsql)
• ACE since 2011
• OCA since December 20th 2012
Read me…
http://blog.bar-solutions.com
http://technology.amis.nl
http://allthingsoracle.com
Download me…
Plugins for PL/SQL Developer
http://bar-solutions.com
Plugins for Apex
http://apex-plugin.com
Watch me…
Patrick Barel, AMIS Mai 28th 2013
Table Functions
PL/SQL in SQL
�Overview of Table Functions
�Table Function Concepts
�Using Table Functions
Table functions
Table functions are functions that produce a collection of rows (either a nested table or a varray) that can be queried like a physical database table. You use a table function like the name of a database table, in the FROM clause of a query.
Overview of table functions
�Define Record Type
�Define NestedTable type
�Define function returning Nested Table type
�Query function using the TABLE() operator
Table function concepts
• Defined as an object table of a collection
– First an object type
SQL> CREATE TYPE now_t AS OBJECT
2 (now VARCHAR2(8));
3 /
Type created.
Table function concepts, result set
• Defined as an object table of a collection
– Second; the collection type
SQL> CREATE TYPE now_tt AS
2 TABLE OF now_t;
3 /
Type created.
Table function concepts, result set
• Return type is the object table
CREATE OR REPLACE FUNCTION now
RETURN now_tt AS
l_returnvalue now_tt := now_tt();
…
BEGIN
…
RETURN l_returnvalue;
END;
Table function concepts, function
• Queried with the TABLE function
SELECT *
FROM TABLE(now);
Table function concepts, function
CREATE OR REPLACE FUNCTION now RETURN now_tt AS
l_returnvalue now_tt := now_tt();
l_now VARCHAR2(8);
BEGIN
FOR counter IN 1 .. 4 LOOP
l_now := to_char(SYSDATE, 'HH24:MI:SS');
dbms_lock.sleep(1);
l_returnvalue.extend;
l_returnvalue(l_returnvalue.last) := now_t(l_now);
END LOOP;
RETURN l_returnvalue;
END;
Table function concepts, simple function
SQL> SELECT *
2 FROM TABLE(now)
3 /
NOW
--------
16:54:21
16:54:22
16:54:23
16:54:24
4 rows selected.
Table function concepts, simple function
• Query results passed as a parameter
– Parameter type is REF CURSOR
– SYS_REFCURSOR can be used
for weakly typed option
CREATE OR REPLACE FUNCTION now_and_then
(cursor_in SYS_REFCURSOR )
RETURN now_and_then_tt AS
Table function concepts, nesting functions
• CURSOR keyword denotes value passed within query
SELECT *
FROM TABLE(now_and_then( CURSOR ( SELECT *
FROM TABLE(now))))
/
Table function concepts, nesting functions
CREATE OR REPLACE FUNCTION now_and_then
(cursor_in SYS_REFCURSOR)
RETURN now_and_then_tt AS
l_returnvalue now_and_then_tt := now_and_then_tt();
l_now VARCHAR2(8);
l_then VARCHAR2(8);
BEGIN
LOOP
FETCH cursor_in
INTO l_now;
EXIT WHEN cursor_in%NOTFOUND;
l_then := to_char(SYSDATE, 'HH24:MI:SS');
l_returnvalue.extend;
l_returnvalue(l_returnvalue.last) := now_and_then_t(l_now, l_then);
END LOOP;
RETURN l_returnvalue;
END;
Table function concepts, nested function
SQL> SELECT *
2 FROM TABLE ( now_and_then( CURSOR( SELECT *
3 FROM TABLE ( now ))))
4 /
NOW AND_THEN
-------- --------
16:58:51 16:58:55
16:58:52 16:58:55
16:58:53 16:58:55
16:58:54 16:58:55
4 rows selected.
Table function concepts, nested function
• Function can be pipelined
• Produce results as they are created
– Returning results one record at a time
Pipelined table functions
• Adding PIPELINED keyword to function specification
• Actual return datatype is collection• PIPE ROW function returns single record to calling process and then continues processing
• Return is still requiredCREATE OR REPLACE FUNCTION now
RETURN now_tPIPELINED AS
l_returnvalue single_time_t;BEGIN
loop ...PIPE ROW(l_returnvalue);...
end loop;RETURN;
END;
Pipelining : syntax
CREATE OR REPLACE FUNCTION now
RETURN now_tt
PIPELINED AS
l_returnvalue now_t;
l_now VARCHAR2(8);
BEGIN
FOR counter IN 1 .. 4 LOOP
dbms_lock.sleep(2);
l_now := to_char(SYSDATE, 'HH24:MI:SS');
l_returnvalue := now_t(l_now);
PIPE ROW (l_returnvalue);
END LOOP;
RETURN;
END;
Pipelined function
SQL> SELECT *
2 FROM TABLE(now_and_then(CURSOR(SELECT *
3 FROM TABLE(now))))
4 /
NOW AND_THEN
-------- --------
19:54:15 19:54:15
19:54:17 19:54:17
19:54:19 19:54:19
3 rows selected.
Pipelined function
Without pipelining
it would be:
NOW AND_THEN
-------- --------
19:54:15 19:54:19
19:54:17 19:54:19
19:54:19 19:54:19
now_and_then.sql
• Functions can be parallelized
• If the source data can be processed in parallel, the functions can be processed in parallel
Parallel table functions
Typical data processing
Stage 1OLTP
F1 F2 Data
Warehouse
Stage 2 F3
Data goes through several transformations, in table functions, and then gets loaded into a database
Parallel & pipelined data processing
OLTPF1 Data
Warehouse
F1
F1
F2
F2
F2
F3
F3
F3
Data goes through several transformations, in table functions, in parallel (multiple processes)and then gets loaded into a database
• Prior to Oracle9i, calling a function inside a SQL statement caused serialization.
– The parallel query mechanism could not be used.
• Now you can enable parallel execution of a table function.
– This greatly increases the usability of PL/SQL-enriched SQL in data warehouse
applications.
Parallel execution and table functions
parallel.sql
• The table function's parameter list must consist only of a single strongly-typed REF CURSOR.
• Include the PARALLEL_ENABLE hint in the program header.
– Choose a partition option that specifies how the function's execution should be partitioned.
– "ANY" means that the results are independent of the order in which the function receives the input rows (through the REF CURSOR).
Enabling parallel execution
{[ORDER | CLUSTERORDER | CLUSTERORDER | CLUSTERORDER | CLUSTER] BY column_list} PARALLEL_ENABLEPARALLEL_ENABLEPARALLEL_ENABLEPARALLEL_ENABLE ({PARTITIONPARTITIONPARTITIONPARTITION p BYBYBYBY
[ANY | (HASH | RANGE) column_list]} )
PARALLEL_ENABLE (
Partition p_input_rows BY ANY )
CREATE OR REPLACE FUNCTION Aggregate_Xform (
p_input_rows in My_Types.cur_t) RETURN
My_Types.dept_sals_tab
PIPELINED
CLUSTER P_INPUT_ROWS BY (dept)
PARALLEL_ENABLE
( PARTITION p_input_rows
BY HASH (dept) )
ORDER p_input_rows BY (c1, c2)
PARALLEL_ENABLE
( PARTITION p_input_rows
BY RANGE (c1) )
with
with
with
Simplest form, results don't
vary from order in which
function gets input rows.
All rows for a given department
must go to the same slave,
and rows are delivered
consecutively.
Rows are delivered to a
particular slave as directed by
partition... and will be locally
sorted by that slave.
Examples of parallelized functions
Serial execution
Scramble
alter table emp noparallel;
select *
from table
( scramble
( cursor ( select empno, ename from emp))
);
EMP
Parallel execution
Scramble
Scramble
Scramble
EMP
Scramble
alter table emp parallel 4;
select *
from table
( scramble
( cursor ( select empno, ename from emp))
);
- Using PL/SQL in SQL
- Create script based on the table data
Using the table function
• Using SQL
Create script based on the table data
DEPT
(table)
SQL
statement
insert into DEPT( LOC, DNAME, DEPTNO)
values ( 'NEW YORK', 'ACCOUNTING', 10);
insert into DEPT( LOC, DNAME, DEPTNO)
values ( 'DALLAS', 'RESEARCH', 20);
insert into DEPT( LOC, DNAME, DEPTNO)
values ( 'CHICAGO', 'SALES', 30);
insert into DEPT( LOC, DNAME, DEPTNO)
values ( 'BOSTON', 'OPERATIONS', 40);
SQL
statement
SELECT 'insert into DEPT( LOC, DNAME, DEPTNO) values
( '''||
LOC||''', '''||
DNAME||''', '||
DEPTNO||');' line
FROM DEPT;
• Using SQL
Create script based on the table data
SELECT *
FROM table(createinsertscriptfor('DEPT'));
SQL
statement
• Using table functions
Create script based on the table data
• Using table functions
• Hide complexity behind PL/SQL interface
• Don’t worry about datatypes
Create script based on the table data
�Overview of Table Functions
�Table Function Concepts
�Return collection, query like table
�Pipelined
�Parallel
�Using Table Functions
�Use PL/SQL in SQL
�Hide complexity
Table functions
�tahiti.oracle.com
�For all documentation online
�Oracle PL/SQL Programming (the book)
�Especially chapter 17 (by Steven Feuerstein) and chapter 21 (by Steven Feuerstein with help from Adrian Billington)
References