snowflake javascript proc变量设置

问题描述 投票:0回答:1

我有下面的代码,我试图将 SQL 语句中的值插入到变量中。 然后使用这个变量值来构建文件名。但我不断收到错误。 错误沿“JavaScript 编译错误:未捕获的语法错误:FINANCE_REPORTS 中的意外标识符(选择“

”)

如果我对日期进行硬编码,我可以让整个过程正常工作,甚至可以在 blob 中生成文件。但最终无论工作运行的月份如何,这都需要自动化;或上个月。我在下面添加了一个示例行以及需要成为 .gz zip 文件名一部分的确切列名 [FILE_NAME_POSTFIX]。任何帮助都会很棒。

CREATE or replace procedure  "SP_MONTHLY_FINANCE_REPORTS"()
RETURNS VARCHAR(10000)
language javascript
as
$$


var ReturnVal = 'REPORT PROC EXECUTION Complete';

var TMP_DATES_crt = `create or replace temporary table TMP_DATES AS 
select *
, case when len(FISCAL_PERIOD) = 1 then concat( to_varchar(FISCAL_YEAR) ,'0',to_varchar( FISCAL_PERIOD) )
when len(FISCAL_PERIOD) > 1 then concat( to_varchar(FISCAL_YEAR) ,to_varchar( FISCAL_PERIOD) ) 
end as File_Name_PostFix
,concat(to_varchar(FISCAL_YEAR),' - ',to_varchar( FISCAL_PERIOD) ) as File_FiscalYear_FiscalPeriod_concat
from (
select a.FISCAL_YEAR,a.FISCAL_PERIOD ,b.MONTH_END_DATE
from (
select FISCAL_YEAR , FISCAL_PERIOD,BEGNNING_DATE_PV
from  Calendar
         where FISCAL_PERIOD >= 1 and FISCAL_YEAR = year( CURRENT_date() )
         and FISCAL_PERIOD = ( month( CURRENT_date() ) - 1 ) 
           and FISCAL_PERIOD_WEEK = 1 and FISCAL_PERIOD_DAY = 1
) as a
FULL OUTER join (
select FISCAL_YEAR , FISCAL_PERIOD, (BEGNNING_DATE_PV -1 ) as MONTH_END_DATE
from  Calendar
         where FISCAL_PERIOD >= 1 and FISCAL_YEAR = year( CURRENT_date() ) 
         and FISCAL_PERIOD = ( month( CURRENT_date() ) ) 
           and FISCAL_PERIOD_WEEK = 1 and FISCAL_PERIOD_DAY = 1
) as b on a.FISCAL_YEAR = b.FISCAL_YEAR
) as c ;`;
var TMP_DATES_crt_stmt = snowflake.createStatement({sqlText: TMP_DATES_crt});
var TMP_DATES_crt_res= TMP_DATES_crt_stmt.execute();
/* here is the sample data for this if you wish to engage
FISCAL_YEAR FISCAL_PERIOD   MONTH_END_DATE  FILE_NAME_POSTFIX   FILE_FISCALYEAR_FISCALPERIOD_CONCAT
2024    3   2024-03-30  202403  2024 - 3
*/

var THEDATE = snowflake.createStatement({sqlText: `select FILE_NAME_POSTFIX from TMP_DATES`});
var result = THEDATE.execute();
/*trying to put 202403 value where THEDATE IS BELOW but keeps erroring out. */
var File_1_crt = `copy into @StagingAzure/FINANCE/TEST_Summary_`+ THEDATE +`_.gz
from ( Select 1
FROM PERIOD_SUM
 
 )
SINGLE=true file_format=(type=csv null_if = ('NULL', 'null')
  empty_field_as_null=false) MAX_FILE_SIZE = 150000000 OVERWRITE=TRUE ;`; 
var File_1_crt_stmt = snowflake.createStatement({sqlText: File_1_crt});
var File_1_crt_res= File_1_crt_stmt.execute();  


var ReturnVal = 'REPORTS EXECUTION Complete';

return ReturnVal;
$$
sql snowflake-cloud-data-platform
1个回答
0
投票

@junketsu,似乎您正在尝试构建一个查询并触发相同的查询来获取文件名。在这种情况下,您必须将查询结果捕获到变量中,然后在 COPY into 语句中引用相同的结果。但是您引用的是保存用于生成值的 SELECT 语句的变量。如果您的查询仅返回一行,则使用下面的代码片段将查询结果捕获到变量中。

我不确定生成文件名日期的用例。它可以通过使用雪花中的日期函数的简单选择来生成。但现在我将分享将查询结果捕获到变量中的语法。如果您需要任何其他用例场景,我只是在 SELECT 中使用 * 来提取所有列并将它们导出到不同的变量中。

var THEDATE = snowflake.createStatement({sqlText: `select * from TMP_DATES`});
var result = THEDATE.execute();
/*Capturing query result into variable, each column value will be exported to separate variable*/

while(result.next()){
fiscal_year=result.getColumnValueAsString(1)
fiscal_period=result.getColumnValueAsString(2)
mon_enddate=result.getColumnValueAsString(3)
filename_posix=result.getColumnValueAsString(4)
file_fiscal_period_concat=result.getColumnValueAsString(5)
}
var File_1_crt = `copy into @StagingAzure/FINANCE/TEST_Summary_`+ /*use whatever variable you want from above*/ +`_.gz
© www.soinside.com 2019 - 2024. All rights reserved.