<x:procedureCall>

x:procedureCall 操作用来调用存储过程。如果存储过程生成任何结果集,则在应用程序服务器上的内存中对它们的行进行高速缓存。始终将这些结果集的其中一个(最初是第一个结果集)认为是当前结果集。而且,始终将每个结果集中的其中一行(最初是第一行)认为是当前行。

使用此操作将创建 DBProcedureCall Bean,可以使用变量(名称在 id 属性中指定)访问这个 Bean。

提供了 JSP 操作来使用 DBProcedureCall Bean 的基本功能。如果 Call 语句带有参数,则可使用 x:getParameter 和 x:parameter 操作对其进行访问。可以使用 x:nextResultSet 和 x:previousResultSet 来在多个结果集中进行定位,并可使用 x:nextRowx:previousRow 来定位至当前结果集中的行。通过使用 x:getColumn 操作,可以访问结果集中的列值。必须先定位至特定结果集,然后才能访问它的列。与 x:select 操作生成的结果集不同,不能使用 x:update、x:delete 和 x:insert 操作来更改 x:procedureCall 生成的结果集中的行。

DBProcedureCall Bean 的所有方法也都可以使用 scriptlet 执行,并且它的所有属性都可以使用标准的 jsp:getPropertyjsp: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 操作具有下列属性:

id
用来在指定名称空间中标识 DBProcedureCall Bean 的名称,这也是它的脚本编制变量名。指定的名称区分大小写,且必须符合当前脚本语言的变量命名约定。
scope
用来定义对象的名称空间。缺省值为 page。
connectionSpec
x:dataSourceSpecx:driverManagerSpec 操作的标识。值区分大小写,且必须与作用域内的 connectionSpec 操作相匹配。

引用的操作提供了连接至数据库所需的信息。如果操作发生在 x:batch 操作的主体内(在这种情况下,将使用 x:batch 操作中标识的 connectionSpec 操作),则省略此属性。如果同时在这两个位置中指定它,并且值不匹配,则会将其标记为错误。

connectionSpecRef
对将要用来获取进行连接所需信息的 DBConnectionSpec 对象的引用。

可以指定 connectionSpec 或 connectionSpecRef,但不能同时指定两者。

maxFieldSize
指定结果集中的任何列的最大大小,以字节计。0 值表示没有最大值。缺省值为 0。
maxRows
指定可以访存到每个结果集的高速缓存中的最大行数。0 值表示没有最大值。缺省值为 0。
distinctTypesEnabled
是否对包含用户定义的(相异)类型的结果集启用插入、更新和删除。缺省值为 False。
timeOut
允许语句执行的最大秒数。缺省值为 0,表示没有最大值。
readOnly
指定是否允许更新数据。true 值表示不允许更新,即使数据库管理器允许进行更新。false 值表示允许更新,倘若数据库管理器允许进行更新。缺省值为 false。
nullToken
指定将用来表示数据库空值的区分大小写字符串值。此属性是可选的。它作为任何对此 ProcedureCall 获取或设置列或参数值的操作上的同一属性的缺省值。如果在两个位置中都省略此属性,则缺省值为 &empty。&empty 是一个特殊值,类似于 HTML 字符实体, 在此属性中,将其识别为代表空字符串。有关空值表示法的更多信息,请参阅空值
trace
是否启用对数据库操作的跟踪。缺省值为 False。

x:procedureCall 操作的主体可以带有下列标记:

<x:sql>
此属性指定要执行的 SQL 语句。
<x:parameter>
此属性为 Call 语句中的参数指定值和元数据。在 x:parameter 标记与 Call 语句中的参数之间必须存在一一对应关系。

示例

以下操作创建一个 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"/>

反馈