2012-06-08 52 views
2

我正在使用ColdFusion構建一個簡單的聊天應用程序,並且我試圖在運行插入時獲取消息ID。以下是我迄今爲止使用Oracle的「INSERT ... RETURNING ... INTO」語句的ColdFusion

<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> 

我得到的錯誤是

錯誤執行數據庫查詢。

並非所有返回參數註冊

我知道有與存儲過程的解決方法,並運行多個查詢。我想知道如何做到這一點。

回答

-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變種實際上已經從驅動連接錯誤接收的結果(你也通過的值 0,而不是的名稱你希望返回當你使用#local.id#值=「」)。

編輯: 如果這是一個「自動增量」字段,另一種方法是使用「結果」變量。看起來像這樣。

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

+0

我得到一個'ORA-00905:missing keyword'錯誤,當我嘗試... – John

+0

是的..你需要調試它 - 但它是正確的方法。也許在結尾處添加一個select * in select select newID「以將其放入結果集中。 –