6

私はColdFusionを初めて使用し、CFQueryでPostgresコードのブロックを記述しました。

<cffunction name="insertToReport" access="private" returntype="struct" output="false" >

  <cfset var xyz = structNew() >
  <cfset xyz.code = "">
      <cfquery name="querysampleresult" datasource="abc">
            DO            
            $BODY$
                DECLARE resultValue int;
            BEGIN
               resultValue = 1;
               SELECT resultValue INTO resultValue ;    
            END;
            $BODY$
      </cfquery>

            <cfset xyz.code = querysampleresult.resultValue  >

           <cfreturn xyz >
</cffunction>

私の問題はresultValue、CFQueryタグの外部の変数にアクセスできないことです。つまり、例外がスローされます。

Element RESULTVALUE is undefined in querysampleresult

これは、関数の最後にあるCFSetステートメントで発生しています。

<cfset xyz.code = querysampleresult.resultValue  >

構造体に変数を設定する方法がわからないのでresultValue、ここから呼び出し元の環境に構造体を返す必要があります。これで私を助けてください、事前に感謝します。

4

2 に答える 2

2

結果値を選択する別のselectステートメントをクエリに追加します。現在、クエリを返さないテーブルにINTOを選択しています。

<cffunction name="insertToReport" access="private" returntype="struct" output="false" >
<cfargument name="rptDataObj" required="yes" type="com.certain.register123.data.reportData" hint="The affected report.">
<cfargument name="maxColumns" type="numeric" required="false" default="10" hint="The maximum number of active columns that should be saved to the report. " ><!--- As of REG-559 20060215, the default was 10 --->
<cfargument name="dsn" type="string" required="false" default="#application.portals.data[request.applicationName].dsn#" >
<cfset var uiCustomColumn = queryNew("") >
<cfset var strSaveError = structNew() >
<cfset strSaveError.code = 0 >
<cfset strSaveError.message = "">
<cfset strSaveError.udcId = "">


<cfquery name="uiCustomColumn" datasource="#arguments.dsn#">
DO            
$BODY$
    DECLARE resultValue int;
    DECLARE nextId bigint;
    DECLARE maxColumns bigint;
    DECLARE udcReportId bigint; /*Have to use this value more than once, so declare it to reduce number of parameters*/
    DECLARE udcOrder int;  /*Have to use this value more than once, so declare it to reduce number of parameters*/

BEGIN
    udcReportId = #arguments.rptDataObj.getId()# ;
    maxColumns = #arguments.maxColumns# ;

    IF (( select count( udc_id ) from user_defined_column WHERE udc_frn_rpt_id = udcReportId AND udc_is_active = true ) >= maxColumns) THEN
        BEGIN
            resultValue = 1; /*There isn't an available slot for this column */
        END;
        ELSE
        BEGIN

            nextId = (SELECT coalesce( MAX(udc_id), 0 ) FROM user_defined_column ) + 1 ;
            udcOrder = (SELECT coalesce( MAX(udc_order), 0 ) FROM user_defined_column WHERE udc_frn_rpt_id = udcReportId AND udc_is_active = true ) + 1 ;

            INSERT INTO user_defined_column(
                udc_id
                ,udc_frn_rpt_id
                ,udc_label
                ,udc_data
                ,udc_type
                ,udc_order
                ,udc_is_active
                ,udc_date_created
                ,udc_date_modified
            )
            VALUES(
                nextId
                ,udcReportId
                ,'hi'
                ,'hi'
                ,12
                ,udcOrder
                ,true
                ,now()
                ,now()
            );


            resultValue = 0;
        END ;
    END IF;
    SELECT resultValue, nextId INTO resultValue  /*Set a success result */
          , nextId;

    SELECT resultValue;

END;
$BODY$
</cfquery>

<cfset strSaveError.code = uiCustomColumn.resultValue  >
<cfset strSaveError.udcId = uiCustomColumn.nextId  >

<cfreturn strSaveError >

于 2013-01-28T13:50:42.017 に答える
1

匿名コードブロック(DO)は常に。を返しますvoid。他のものを返すには、関数を使用する必要があります。

create function f()
returns integer as $body$
declare 
    resultValue integer;
begin
    resultValue := 1;
    return resultValue;
end;
$body$
language plpgsql

関数が作成されたら、クエリで使用できます。

select f() as resultValue;
于 2013-01-29T08:45:25.330 に答える