Starting with EclipseLink 2.3, you can create a DBWS web service from a stored function that uses complex PL/SQL types as either an IN
or return argument.
In this example, the following stored function is used:
FUNCTION F1(OLDREC IN ARECORD, FOO IN VARCHAR2) RETURN ARECORD IS arec ARECORD; -- temp var BEGIN arec.T1 := ... some processing based upon OLDREC arec.T2 := ... AND FOO arec.T3 := ... RETURN arec; END F1;
Type ARECORD
is defined in the PL/SQL package SOMEPACKAGE
as follows:
CREATE OR REPLACE PACKAGE SOMEPACKAGE AS TYPE TBL1 IS TABLE OF VARCHAR2(111) INDEX BY BINARY_INTEGER; TYPE TBL2 IS TABLE OF NUMBER INDEX BY BINARY_INTEGER; TYPE ARECORD IS RECORD ( T1 TBL1, T2 TBL2, T3 BOOLEAN ); FUNCTION F1(OLDREC IN ARECORD, FOO IN VARCHAR2) RETURN ARECORD; END SOMEPACKAGE;
Because PL/SQL types and collection types cannot be transported via JDBC, EclipseLink will generate an anonymous block of PL/SQL code that contains the functions to convert to and from JDBC and PL/SQl types. To be successful, each PL/SQL type or collection type that will appear in an IN
, IN OUT
, or OUT OF RETURN
argument (or any PL/SQL record or collection type that is nested within these arguments) must have an equivalent JDBC type. The name of this type must be in the form <package name>_<type name>
.
For this example, the following JDBC types are required:
CREATE OR REPLACE TYPE SOMEPACKAGE_TBL1 AS TABLE OF VARCHAR2(111) CREATE OR REPLACE TYPE SOMEPACKAGE_TBL2 AS TABLE OF NUMBER CREATE OR REPLACE TYPE SOMEPACKAGE_ARECORD AS OBJECT ( T1 SOMEPACKAGE_TBL1, T2 SOMEPACKAGE_TBL2, T3 BOOLEAN )
The DBWSBuilder utility requires a DBWS configuration file as input.
<?xml version="1.0" encoding="UTF-8"?> <dbws-builder xmlns:xsd="http://www.w3.org/2001/XMLSchema"> <properties> <property name="projectName">testPLSQLFunction</property> ... database properties </properties> <plsql-procedure name="plsqlfunction" catalogPattern="SOMEPACKAGE" procedurePattern="F1" returnType="SOMEPACKAGE_ARECORD" /> </dbws-builder>
Notice that returnType
is set to SOMEPACKAGE_ARECORD
. This value indicates a complex type in the generated EclipseLink DBWS schema (as shown below). In this case, it is constructed based on the contents of the SOMEPACKAGE
package.
Execute the DBWSBuilder
, as shown here:
prompt > dbwsbuilder.cmd -builderFile dbws-builder.xml -stageDir output_directory -packageAs wls testPLSQLFunction.war
where
dbws-builder.xml
is the DBWS builder configuration file (as shown previously).
output_directory
is the output directory for the generated files.
-packageAs
is the platform on which the web service will be deployed.
The generated eclipselink-dbws-schema.xsd
file follows:
<?xml version="1.0" encoding="UTF-8"?> <xsd:schema xmlns:xsd="http://www.w3.org/2001/XMLSchema" targetNamespace="urn:plsqlfunction" xmlns="urn:plsqlfunction" elementFormDefault="qualified"> <xsd:complexType name="SOMEPACKAGE_TBL1"> <xsd:sequence> <xsd:element name="item" type="xsd:string" maxOccurs="unbounded" nillable="true"/> </xsd:sequence> </xsd:complexType> <xsd:complexType name="SOMEPACKAGE_TBL2"> <xsd:sequence> <xsd:element name="item" type="xsd:decimal" maxOccurs="unbounded" nillable="true"/> </xsd:sequence> </xsd:complexType> <xsd:complexType name="SOMEPACKAGE_ARECORD"> <xsd:sequence> <xsd:element name="t1"> <xsd:complexType> <xsd:sequence> <xsd:element name="item" type="xsd:string" maxOccurs="unbounded" nillable="true"/> </xsd:sequence> </xsd:complexType> </xsd:element> <xsd:element name="t2"> <xsd:complexType> <xsd:sequence> <xsd:element name="item" type="xsd:decimal" maxOccurs="unbounded" nillable="true"/> </xsd:sequence> </xsd:complexType> </xsd:element> <xsd:element name="t3" type="xsd:boolean" nillable="true"/> </xsd:sequence> </xsd:complexType> <xsd:complexType name="simple-xml-format"> <xsd:sequence> <xsd:any minOccurs="0"/> </xsd:sequence> </xsd:complexType> <xsd:element name="SOMEPACKAGE_TBL1" type="SOMEPACKAGE_TBL1"/> <xsd:element name="SOMEPACKAGE_TBL2" type="SOMEPACKAGE_TBL2"/> <xsd:element name="SOMEPACKAGE_ARECORD" type="SOMEPACKAGE_ARECORD"/> </xsd:schema>