当IF条件满足时如何调用另一个存储过程内部的存储过程 [英] How to call a stored procedure inside another stored procedure when the if condition satisfies

查看:8
本文介绍了当IF条件满足时如何调用另一个存储过程内部的存储过程的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

我在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 snowflakeworking 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屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆