当IF条件满足时如何调用另一个存储过程内部的存储过程 [英] How to call a stored procedure inside another stored procedure when the if condition satisfies
问题描述
我在Snowflake中调用另一个存储过程中的2个存储过程时遇到了一个问题。以下是我的要求
if ((to_number((to_char(CURRENT_DATE,'dd')))=10)) then we need to call sp name edw.bison_details
每天如果满足或不满足上述条件,eds.bison_delta_details
存储过程需要与主存储过程一起运行。
有人能帮我吗?
已更新.
我已经用雪花编写了调用代码。但它会给出一个错误,如
SQL编译错误:位置0处的语法错误行1意外为‘IF’。
这是在雪花中调用另一个sp中的sp时导致错误消息的代码。
if ((to_number((to_char(CURRENT_DATE,'dd')))==5))
CALL STG.BISON_LAND_DATA('`+ID+`'::VARCHAR,CURRENT_TIMESTAMP()::TIMESTAMP_NTZ::VARCHAR,
'{"name": "`+name+`","task_name": "`+task_name+`","sp": "STG.BISON_LAND_DATA","up_date": "`+upd_date+`","date": "`+date+`","id": "`+ID+`"}'::VARCHAR)
如何解决此问题?
推荐答案
to_char(CURRENT_DATE,'dd')
为您提供每月的第几天,但使用DAYOFMONTH
会更简单,因此第一行可以变成:
if( DAYOFMONTH(CURRENT_DATE) == 5 ) {
...
}
您的StoredProc调用可以拆分,看看哪些有意义,哪些不喜欢:
var parm1 = '`+ID+`'::VARCHAR;
var parm2 = CURRENT_TIMESTAMP()::TIMESTAMP_NTZ::VARCHAR;
var json_str = '{"name": "`+name+`","task_name": "`+task_name+`","sp": "STG.BISON_LAND_DATA","up_date": "`+upd_date+`","date": "`+date+`","id": "`+ID+`"}'::VARCHAR;
CALL STG.BISON_LAND_DATA(parm1, parm2, json_str);
在显示的代码上下文中,使用所有三种引号样式是没有意义的,因为我们以'
引号开始字符串,要将它们断开以进行字符串连接,您可以再次使用普通的单引号。
var json_str = '{"name": "'+ name +'","task_name": "'+ task_name +'","sp": "STG.BISON_LAND_DATA","up_date": "'+ upd_date +'","date": "'+ date +'","id": "'+ ID +'"}'::VARCHAR;
parm1
只是一个toString(),因此可以是
var parm1 = ID.toString();
json_str
是表示json对象的字符串,如果您使用的是JavaScript,您只需创建该对象,然后使用toString()即可。因此,这一切都变成了:
if( DAYOFMONTH( CURRENT_DATE ) == 5 ) {
var parm1 = ID.toString();
var parm2 = CURRENT_TIMESTAMP()::TIMESTAMP_NTZ::VARCHAR;
var json_obj = {name: name, task_name: task_name, sp: "STG.BISON_LAND_DATA", up_date: upd_date, date: date, id: ID };
CALL STG.BISON_LAND_DATA(parm1, parm2, json_obj.toString());
}
并给出您的问题,然后实际编码您是正确的,并将Execute stored procedure inside another stored procedure in snowflake和working with Stored Procedures文档的链接问题中的逻辑复制在一起:
它应该变成:
if( DAYOFMONTH( CURRENT_DATE ) == 5 ) {
var parm1 = ID.toString();
var parm2 = CURRENT_TIMESTAMP()::TIMESTAMP_NTZ::VARCHAR;
var json_obj = {name: name, task_name: task_name, sp: "STG.BISON_LAND_DATA", up_date: upd_date, date: date, id: ID };
var cmd = "CALL STG.BISON_LAND_DATA(:1, :2, :3)";
var stmt = snowflake.createStatement(
{
sqlText: cmd,
binds: [parm1, parm2, json_obj.toString()]
}
);
var result1 = stmt.execute();
result1 .next();
var val = result1.doSomeThingWithResults...
}
这篇关于当IF条件满足时如何调用另一个存储过程内部的存储过程的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!