Postgresql ColdFusion CFQuery块
我是ColdFusion的新手,我在CFQuery中编写了一段Postgres代码:Postgresql ColdFusion CFQuery块,postgresql,coldfusion,coldfusion-9,postgresql-9.1,Postgresql,Coldfusion,Coldfusion 9,Postgresql 9.1,我是ColdFusion的新手,我在CFQuery中编写了一段Postgres代码: <cffunction name="insertToReport" access="private" returntype="struct" output="false" > <cfset var xyz = structNew() > <cfset xyz.code = ""> <cfquery name="querysampleresult"
<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>
这发生在函数末尾的CFSet语句中:
<cfset xyz.code = querysampleresult.resultValue >
我不知道如何在结构中设置变量resultValue,我必须从这里向调用环境返回一个结构。
请在这方面帮助我,提前谢谢。在选择结果值的查询中添加另一个select语句。现在您正在选择一个不返回查询的表
<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 >
匿名代码块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;
若我使用的是SELECT resultValue,那个么抛出异常的原因是:错误:查询并没有结果数据的目标:我们不能直接在pl/pgsql中使用SELECT语句,我们必须返回任何值,或者必须将resultValue与INTO子句一起放入某个变量中。所以,您上面的代码似乎无法使resultValue在cfquery块中对uiCustomColumn可用。但是谢谢你的支持@是的,您可以在plpgsql中使用select。问题是,如果您在中的匿名代码块中执行此操作,而不是在函数中执行此操作,您可以按所说的那样使用into,也可以执行“选择结果值”。这两种方法都不起作用,因为将始终返回void。@Clodoaldo是的,你是对的,我用一个函数更改了匿名块,以便访问cfQuery之外的参数,谢谢你的支持。哇,很抱歉。我已经有一段时间没有使用PGSQL了,所以我一直在使用内存。哦,好吧!
select f() as resultValue;