有一个 cffunction(在 cfc 文档中)对用户进行身份验证。它引用了一个存储过程并有一个“out”类型的cfprocparam。在 Adobe CFML 参考中,它说这意味着“该参数仅用于从数据库系统接收数据。将参数作为绑定变量传递。”
什么是绑定变量?
有一个 cffunction(在 cfc 文档中)对用户进行身份验证。它引用了一个存储过程并有一个“out”类型的cfprocparam。在 Adobe CFML 参考中,它说这意味着“该参数仅用于从数据库系统接收数据。将参数作为绑定变量传递。”
什么是绑定变量?
术语“绑定变量”可能是 Adobe 的一个错误选择。我认为它们的意思是它绑定到存储过程中的变量,而不是“保存解释计划”意义上的绑定变量(对于 in 变量和 out 变量都应该如此)。选择“out”而不是“in”有一些很好的理由,还有一些副作用,你可能会觉得有用,或者如果你不期望它们可能会灼伤你。
首先,如果存储过程中的参数是“in”类型,那么大多数数据库不会让您在 proc 中分配给它 - 当您知道不应该更改变量时非常有用。这是一个 Oracle 示例...
CREATE PROCEDURE bind_test(p_testin IN NUMBER, p_testout OUT NUMBER) IS
BEGIN
-- p_testin := 100; -- error can not be used as an assignment target
p_testout := 100;
END bind_test;
p_testin 不能更改,仅用于“where”子句或启动其他变量之类的地方,但 p_testout 可以更改。
其次,您可以通过在冷融合中使用 cfprocparam "variable =" 语法更进一步,并在不通过 cfprocresult 的情况下实际取回 ColdFusion 中更改的值。请注意,在此示例中,nTypeIn 和 nTypeOut 的初始值都从 10 开始...
<cfset nTypeIn = 10 >
<cfset nTypeOut = 10 >
<cfstoredproc procedure = "bind_test" dataSource = "#ProdDB#" returnCode = "No">
<cfprocparam type="in" cfsqltype="CF_SQL_INTEGER" variable="nTypeIn" value="#nTypeIn#" null="No">
<cfprocparam type="out" cfsqltype="CF_SQL_INTEGER" variable="nTypeOut" value="#nTypeOut#" null="No">
</cfstoredproc>
<cfdump var="#nTypeIn#">
<cfdump var="#nTypeOut#">
在 Oracle 中,在此测试结束时,nTypeIn 将为 10,但 nTypeOut 将为 100 而不是 10。只要您期望数据库存储的 proc 更改它,这将非常有用。
希望对这个问题有更多的了解。
来自维基百科:
(计算)与值相关联的变量,因此是具有分配存储位置的变量。如果编程语言实现了规范未知值、无穷大等的表示,则绑定到变量的值可能是其中之一。
注意粗体部分
未绑定到位置的变量称为自由变量。