3

我正在使用 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>

我得到的错误是

执行数据库查询时出错。

并非所有返回参数都已注册

我知道有存储过程的解决方法,并运行多个查询。我想知道如何做到这一点。

4

2 回答 2

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>

希望这可以帮助。

于 2018-03-24T14:54:36.237 回答
-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 时希望返回的 var的名称.id# in value="")。

编辑:如果这是一个“自动增量”字段,另一种方法是使用“结果”变量。看起来像这样。

<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 或更高版本。

于 2012-06-08T18:26:57.513 回答