How to Use User-Defined Scalar Functions in Oracle and SQL Server
Description
User-defined scalar functions in Oracle and SQL Server can be called from Alpha Anywhere.
Discussion
You can either use the function in a SELECT statement, or execute the call in a PL/SQL script. The complete Xbasic scripts are shown below for both Oracle and SQL Server. In summary:
The correct syntax to select the result of a scalar function in Oracle is:
? c.Execute("select COUNT_EMP(:lower, :upper) as l_Count from dual") ?c.resultset.data("l_count")
To retrieve output parameters from a stored procedure or function you can add an argument to the SQL::Arguments object for each output parameter as follows:
dim args as sql::arguments args.add("l_count", 0, SQL::ArgumentUsage::OutputArgument) ? c.execute("begin :l_count := COUNT_EMP(:lower, :upper); end;", args) ? args[3].Data
The value SQL::ArgumentUsage::OutputArgument indicates that the parameter is output only. There is an enumerated value for each of (input, output and input/output).
The SQL is wrapped in a BEGIN/END pair. This seems to be required by OCI for the script to execute properly.
Calling a user defined scalar function using Oracle
Getting the result of the function using a SELECT statement
dim c as sql::connection ? c.open( ("::Name::Oracle") )?c.open( ("::Name::Oracle") ) dim args as sql::arguments args.add("lower", 1) args.add("upper", 100) ? c.execute("select COUNT_EMP(:lower, :upper) as l_Count from dual", args) ? c.resultset.data("l_count")
Getting the result of the function using SQL::Arguments
dim c as sql::connection ? c.open( ("::Name::Oracle") ) dim args as sql::arguments args.add("lower", 1) args.add("upper", 100) args.add("l_count", 0, SQL::ArgumentUsage::OutputArgument) ? c.execute("begin :l_count := COUNT_EMP(:lower, :upper); end;", args) ? args[3].Data
Calling a user defined scalar function using SQL Server
Getting the result of the function using a SELECT statement
dim c as sql::connection ? c.open( ("::Name::SQLServer") ) dim args as sql::arguments args.add("lower", 1) args.add("upper", 100) ? c.execute("select dbo.COUNT_EMP(:lower, :upper) as l_Count", args) ? c.resultset.data("l_count")
Getting the result of the function using SQL::Arguments.
dim c as sql::connection ? c.open( ("::Name::SQLServer") ) dim args as sql::arguments args.add("lower", 1) args.add("upper", 100) args.add("l_count", 0, SQL::ArgumentUsage::OutputArgument) ? c.execute("select :l_count = dbo.COUNT_EMP(:lower, :upper)", args) ? args[3].Data