-
Book Overview & Buying
-
Table Of Contents
Oracle Advanced PL/SQL Developer Professional Guide
By :
Like a procedure, a function is also a derivative of a PL/SQL block structure which is physically stored within a database. Unlike procedures, they are the "workforce" in PL/SQL and meant for calculative and computational activities in the applications.
The characteristics of functions are as follows:
SELECT and DMLs). Such functions must accept only IN parameters of valid SQL types. Alternatively, a function can also be invoked from SELECT statements if the function body obeys the database purity rules.IN, OUT, and IN OUT) and mandatorily return a value. The type of the return value must be a valid SQL data type (not be of BOOLEAN, RECORD, TABLE, or any other PL/SQL data type).The syntax for a function is as follows:
CREATE [OR REPLACE] FUNCTION [Function Name] [Parameter List] RETURN [Data type] [AUTHID DEFINER | CURRENT_USER] [DETERMINISTIC | PARALLEL_ENABLED | PIPELINES] [RESULT_CACHE [RELIES_ON (table name)]] IS [Declaration Statements] BEGIN [Executable Statements] RETURN [Value] EXCEPTION [Exception handlers] END [Function Name];
The standalone function, F_GET_DOUBLE, accepts a single argument and returns its double:
/*Create the function F_GET_DOUBLE*/CREATE OR REPLACE FUNCTION F_GET_DOUBLE (P_NUM NUMBER) RETURN NUMBER/*Specify the return data type*/IS/*Declare the local variable*/L_NUM NUMBER; BEGIN/*Calculate the double of the given number*/L_NUM := P_NUM * 2;/*Return the calculated value*/RETURN L_NUM; END; / Function created.
As a common feature shared among the stored subprograms, functions can be invoked from a SQL*Plus environment and called from a PL/SQL as a procedural statement.
The following code snippet demonstrates the execution of a function from a SQL*Plus environment and its return value have been captured in a session bind variable:
/*Enable the SERVEROUTPUT parameter to print the results in the environment*/SQL> SET SERVEROUTPUT ON/*Declare a session variable M_NUM to hold the function output*/SQL> VARIABLE M_NUM NUMBER;/*Function is executed and output is assigned to the session variable*/SQL> EXEC :M_NUM := F_GET_DOUBLE(10); PL/SQL procedure successfully completed./*Print the session variable M_NUM*/SQL> PRINT M_NUM M_NUM ---------- 20
Now, we will see the function execution from an anonymous PL/SQL block as a procedural statement:
/*Enable the SERVEROUTPUT parameter to print the results in the environment*/
SQL> SET SERVEROUTPUT ON
SQL>DECLARE
M_NUM NUMBER;
BEGIN
M_NUM := F_GET_DOUBLE(10);
DBMS_OUTPUT.PUT_LINE('Doubled the input value as : '||M_NUM);
END;
/
Doubled the input value as : 20
PL/SQL procedure successfully completed.
Unlike procedures, a stored function can be called from SELECT statements; provided it must not violate the database purity levels. These rules are as follows:
SELECT statement cannot contain DML statementsUPDATE or DELETE statement on a table cannot query (SELECT) or perform transaction (DMLs) on the same tableCOMMIT or ROLLBACK) command or the DDL (CREATE or ALTER) commandBesides these rules, a standalone user-defined function must qualify the following conditions:
IN parameter only. The data type of the parameter must be a valid SQL data type. Also, the parameters must follow positional notation in the list.The F_GET_DOUBLE function can easily be embedded within a SELECT statement as it perfectly respects all the preceding rules:
/*Invoke the function F_GET_DOUBLE from SELECT statement*/
SQL> SELECT F_GET_DOUBLE(10) FROM DUAL;
F_GET_DOUBLE(10)
----------------
20In Oracle, DUAL is a table owned by the SYS user, which has a single column, DUMMY, of VARCHAR2 (1) type. It was first designed by Charles Weiss while working with internal views to duplicate a row. The DUAL table is created by default during the creation of data dictionaries with a single row, whose value is X. The users other than SYS, use its public synonym, to select the value of pseudo columns, such as USER, SYSDATE, NEXTVAL, or CURRVAL. Oracle 10g has considerably improved the performance implications of the DUAL table through a "fast dual" access mechanism.
Change the font size
Change margin width
Change background colour