我正在使用ColdFusion构建一个简单的聊天应用程序,我正在尝试在运行插入时获取消息ID。这是我到目前为止所拥有的
<cffunction name="putMessage" access="remote" returnformat="JSON">
<cfargument name="message" />
<cfset LOCAL.id = 0 />
<cfquery name="insertquery" datasource="myDS">
insert into
chat (message)
values
(<cfqueryparam cfsqltype="cf_sql_varchar" value="#ARGUMENTS.message#">)
RETURNING
id
INTO
<cfqueryparam cfsqltype="cf_sql_numeric" value="#LOCAL.id#">
</cfquery>
<cfreturn LOCAL.id />
</cffunction>
我得到的错误是
执行数据库查询时出错。
并非所有返回参数都已注册
我知道存储过程有多种解决方法,并且运行多个查询。我想知道如何这样做。
答案 0 :(得分:2)
这是一个古老的问题,所以要提前为这个死灵法术道歉。在我看来,实现这一目标的最好(也许是唯一的)方法是将INSERT
语句包装在存储过程中,并从输出参数中的RETURNING ... INTO
子句中返回值。
CREATE OR REPLACE PROCEDURE chat_insert
( p_message IN VARCHAR2, r_id OUT NUMBER )
AS
BEGIN
INSERT INTO chat ( message )
VALUES ( p_message )
RETURNING id INTO r_id;
END;
/
然后,您可以按如下方式从ColdFusion调用此存储过程:
<cffunction name="putMessage" access="remote" returnformat="JSON">
<cfargument name="message" />
<cfset LOCAL.id = 0 />
<cfstoredproc procedure="chat_insert" datasource="myDS">
<cfprocparam cfsqltype="CF_SQL_VARCHAR" type="in" value="#ARGUMENTS.message#" />
<cfprocparam cfsqltype="CF_SQL_VARCHAR" type="out" variable="LOCAL.id" />
</cfstoredproc>
<cfreturn LOCAL.id />
</cffunction>
希望这有帮助。
答案 1 :(得分:-1)
ID是查询返回的内容 - 不是您要发送到查询中的内容 - 对吗?像(注意 - 未经测试):
<cfargument name="message" />
<cfset LOCAL.id = 0 />
<cfquery name="insertquery" datasource="myDS">
DECLARE newID NUMBER;
insert into
chat (message)
values
(<cfqueryparam cfsqltype="cf_sql_varchar"
value="#ARGUMENTS.message#">)
RETURNING
id
INTO
newID
</cfquery>
<cfreturn insertquery.newID />
否则,您希望驱动程序在 CF实际收到驱动程序连接的结果之前将Oracle var转换为CF var (您还传递了值 0 ,而不是在使用#local.id#in value =“”时希望返回的var的名称。
编辑: 如果这是“自动增量”字段,则另一种方法是使用“结果”变量。看起来像这样。
<cfquery name="insertquery" datasource="myDS" result="r">
insert into
chat (message)
values
(<cfqueryparam cfsqltype="cf_sql_varchar"
value="#ARGUMENTS.message#">)
</cfquery>
<cfreturn r.rowID/>
RowID是我认为的Oracle版本。注意 - 这是CF8或更高版本。