x:procedureCall 操作用来调用存储过程。如果存储过程生成任何结果集,则在应用程序服务器上的内存中对它们的行进行高速缓存。始终将这些结果集的其中一个(最初是第一个结果集)认为是当前结果集。而且,始终将每个结果集中的其中一行(最初是第一行)认为是当前行。
使用此操作将创建 DBProcedureCall Bean,可以使用变量(名称在 id 属性中指定)访问这个 Bean。
提供了 JSP 操作来使用 DBProcedureCall Bean 的基本功能。如果 Call 语句带有参数,则可使用 x:getParameter 和 x:parameter 操作对其进行访问。可以使用 x:nextResultSet 和 x:previousResultSet 来在多个结果集中进行定位,并可使用 x:nextRow 和 x:previousRow 来定位至当前结果集中的行。通过使用 x:getColumn 操作,可以访问结果集中的列值。必须先定位至特定结果集,然后才能访问它的列。与 x:select 操作生成的结果集不同,不能使用 x:update、x:delete 和 x:insert 操作来更改 x:procedureCall 生成的结果集中的行。
DBProcedureCall Bean 的所有方法也都可以使用 scriptlet 执行,并且它的所有属性都可以使用标准的 jsp:getProperty 和 jsp:setProperty 操作访问。
<x:procedureCall id = "name" scope = "page|request|session" connectionSpec = "connectionSpec_id" connectionSpecRef = "connectionSpecRef" maxFieldSize = "numberOfBytes" maxRows = "numberOfRows" distinctTypesEnabled = "true|false" timeOut = "seconds" readOnly = "true|false" nullToken = "string" trace = "true|false" > <x:sql> </x:sql> <x:parameter parmName = "name" position = "number" type = "sqltype" mode = "in|out|inout" value = "parmValue" /> </x:procedureCall>
x:procedureCall 操作具有下列属性:
引用的操作提供了连接至数据库所需的信息。如果操作发生在 x:batch 操作的主体内(在这种情况下,将使用 x:batch 操作中标识的 connectionSpec 操作),则省略此属性。如果同时在这两个位置中指定它,并且值不匹配,则会将其标记为错误。
可以指定 connectionSpec 或 connectionSpecRef,但不能同时指定两者。
x:procedureCall 操作的主体可以带有下列标记:
以下操作创建一个 DBProcedureCall Bean,其名称为 proc1,其作用域为会话。使用 conn1 中的信息来连接至数据库。存储过程接受包含职员编号的输入参数,并返回包含职员姓名、部门和电话号码的输出参数。本示例还使用 x:getParameter 操作将输出参数写至请求输出。有关 x:parameter 操作的详细信息,请参阅 <x:parameter>。有关 x:getParameter 操作的详细信息,请参阅 <x:getParameter>。
<x:procedureCall id="proc1" scope="session" connectionSpec="conn1" > <x:sql>{ CALL empinfo1(:EMPNO, :NAME, :DEPT, :PHONENO) } </x:sql> <x:parameter parmName="EMPNO" mode="in" type="INTEGER" value='<%= request.getParameter("empno") %>' /> <x:parameter parmName="NAME" mode="out" type="VARCHAR" /> <x:parameter parmName="DEPT" mode="out" type="VARCHAR" /> <x:parameter parmName="PHONENO" mode="out" type="VARCHAR" /> </x:procedureCall> ... <br>Employee number: <x:getParameter name="proc1" parmName="EMPNO"/> <br>Name: <x:getParameter name="proc1" parmName="NAME"/> <br>Department: <x:getParameter name="proc1" parmName="DEPT"/> <br>Phone number: <x:getParameter name="proc1" parmName="PHONENO"/>
以下操作创建一个 DBProcedureCall Bean,其名称为 proc2,其作用域为会话。存储过程接受包含职员编号的输入参数,并返回单行结果集,它的列包含职员编号、姓名、部门和电话号码。将输入参数设置为请求参数值并执行 Call 语句。本示例还使用 x:getColumn 操作将结果集列值写至请求输出。有关 x:parameter 操作的详细信息,请参阅 <x:parameter>。有关 x:getParameter 操作的详细信息,请参阅 <x:getParameter>。
<x:metaData id="empinfo" xmlref="empinfo.xml" /> ... <x:procedureCall id="proc2" scope="session" connectionSpec="conn1" metaData="empinfo.xml"> <x:sql>CALL empinfo2(:EMPNO)</x:sql> <x:parameter parmName="EMPNO" mode="in" type="INTEGER" value='<%= request.getParameter("empno") %>' /> </x:procedureCall> ... <br>Employee number: <x:getColumn name="proc2" colName="EMPNO"/> <br>Name: <x:getColumn name="proc2" colName="NAME"/> <br>Department: <x:getColumn name="proc2" colName="DEPT"/> <br>Phone number: <x:getColumn name="proc2" colName="PHONENO"/>