ColdFusion使用Oracle的“INSERT ... RETURNING ... INTO”语句

时间:2012-06-08 18:19:17

标签: oracle coldfusion

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

我得到的错误是

  

执行数据库查询时出错。

     

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

我知道存储过程有多种解决方法,并且运行多个查询。我想知道如何这样做。

2 个答案:

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