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 変数を CF 変数に変換することが期待されます ( #local を使用するときに返す変数の名前ではなく、0も渡します)。 .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 に答える