SQLForms FUNCTION Capability (followup)
From: <fgreene_at_hayes.com>
Date: 8 Apr 93 08:56:08 EDT
Message-ID: <7097.2bc3e8a8_at_hayes.com>
Date: 8 Apr 93 08:56:08 EDT
Message-ID: <7097.2bc3e8a8_at_hayes.com>
Recently I posted a query regarding the use of FUNCTIONS (as compared to procedures) in SQL*Forms. I received the following from Oracle which I am posting for the groups information. I have tested the function capability and it operates fine.
------------------reply follows ----------------------------
FRANK -- See the readme file shipped with Forms 3.0.16.8 or greater.
For your convenience, I've appended that excerpt below. Until
we had completely tested the mechanism, we did not want to
externalize the defintion of functions in our documentation.
Since we were not sure if the doc sets for Forms 3.0 would be
reprinted, we included it in the readme file to make sure
everyone got it with the software where it first became
supported.
5. DECLARING AND USING PL/SQL FUNCTIONS
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
In addition to (Form-Level) procedures, SQL*Forms also
supports the use of PL/SQL functions. Any designer who has
used both the built-in packaged procedures and packaged
functions will understand the simple differences between
the two. Below we compare the two:
Procedure Function
------------------------- --------------------------
(+) Defined in the SQL*Forms (+) Defined in the SQL*Forms
'Procedure Definition' 'Procedure Definition'
Screen Screen
(+) May be referenced or (+) May be referenced or
copied from "library" copied from "library"
form form, as if it were a
procedure
(+) Is a Named PL/SQL Block (+) Is a named PL/SQL Block
which performs a task which represents an expression
when invoked of an explicit datatype
when evaluated
(+) May accept parameters (+) May accept parameters
(+) Has no return value, but (+) MUST return one value, and
May pass back results May *not* pass back results
in OUT parameters in OUT parameters.
(+) May have default values (+) May have default values
for formal parameters for formal parameters
(+) Allows trailing params (+) Allows trailing params
possessing deault values possessing default values
to be omitted when to be omitted when
invoking evaluating
(+) For exception handling, (+) For exception handling,
Behaves like embedded Behaves like embedded
PL/SQL block when invoked PL/SQL block when evaluated
The syntax for declaring a PL/SQL function parallels that of
a Procedure, with the addition of the 'RETURN datatype'
clause which identifies the type of value which the function
returns:
--------------------------------------------------------------
FUNCTION function_name ( parameter_name mode [:= value], ... )
~~~~ ~~~~~
RETURN datatype
~~~~~~~~
IS
BEGIN
:
RETURN( expression );
: ~~~~~~~~~~
EXCEPTION
:
RETURN( expression );
: ~~~~~~~~~~
END;
--------------------------------------------------------------
MODE: Must be IN for function parameters.
~~~~
VALUE: Optional constant or expression of the same
~~~~~ datatype as the associated parameter to specify
a default value for the formal parameter. An
explicit value passed-in at evaluation time
overrides the default value.
DATATYPE: Any of the datatypes that are supported for PL/SQL
~~~~~~~~ formal parameters are supported for the RETURN
value of a PL/SQL function. These include DATE,
NUMBER, CHAR, and BOOLEAN. Recall that LONG is not
a supported datatype of either parameters or return
values.
EXPRESSION: A constant or expression of the same datatype as
~~~~~~~~~~ declared in the Function Specification's
'RETURN datatype' clause. It is an *ERROR* if a
PL/SQL function does *NOT* return a value on exit.
The PL/SQL instruction 'RETURN( expr )' returns the given
expression as the value of the function and exits with success.
Since a function represents an expression of a given
datatype, it may be used in precisely the same way that a
constant or local variable of the same datatype would be
used.
One notable exception to this rule is the use of PL/SQL
functions in DML statements. Only constants or local
variables may be used in the role of 'bind variables' in DML
statements. A function value can always be assigned to a
local variable of appropriate datatype, and this local
variable used in the DML statement, to accomplish the same
result.
An example of a function, FF_DEPT_SIZE, which returns the
total number of employees in a given department follows:
+--------------------------------------------------------
| Procedure Name: FF_DEPT_SIZE
+--------------------------------------------------------
| ---- Procedure Text ----
|
| /* FF_DEPT_SIZE
| ** ~~~~~~~~~~~~~
| ** Returns the number of employees in
| ** the department whose number is passed in as
| ** a parameter.
| */
| FUNCTION ff_dept_size ( pp_deptno IN NUMBER )
|
| RETURN NUMBER /* Funct. Return Type */
|
| IS
| lv_temp_count NUMBER; /* Declaration Section */
|
| BEGIN
| SELECT COUNT(*)
| INTO lv_temp_count
| FROM EMP
| WHERE DEPTNO = pp_deptno;
| RETURN ( lv_temp_count ); /* Return Function Val */
|
| EXCEPTION
| WHEN OTHERS THEN
| RETURN ( -1 ); /* Return minus one */
| END; /* if problems arise */
+--------------------------------------------------------
Then, a trigger could use this function in the following way:
+--------------------------------------------------------
| Trigger Name: ON-VALIDATE-FIELD
+--------------------------------------------------------
| /*
| ** If the Total Number of Employees in
| ** the current department exceeds 100,
| ** then disallow this entry
| */
| IF ( ff_dept_size(:DEPT.DEPTNO) > 100 ) THEN
| ------------
| MESSAGE('WOW! Current Department is too big now...');
| RAISE FORM_TRIGGER_FAILURE;
| ELSE
| :CONTROL.TOTAL_EMPS := ff_dept_size( :DEPT.DEPTNO );
| END IF;
+--------------------------------------------------------
While the above trigger is not the most efficient way of
accomplishing the goal -- i.e. we call the function twice
when we could have coded it such that we only used the
function once -- it does demonstrate that functions can be
used in IF...THEN and assignment statements.
NOTE: Anything that can be done with a Function, can also be
done with a Procedure which includes an OUT parameter
to return the desired value. Anything that can be done
with a Procedure, can also be performed with a Function
whose RETURN value reports the status of the task
performed. So, while the syntax of a Procedure and a
Function differs slightly, a particular task can be
done via a PL/SQL Procedure or Function based on the
syntax which the designer deems most convenient.
Received on Thu Apr 08 1993 - 14:56:08 CEST
