【问题标题】:How to call a stored procedure inside another stored procedure when the if condition satisfies当if条件满足时如何在另一个存储过程中调用一个存储过程
【发布时间】:2022-01-02 14:31:54
【问题描述】:

我在 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)

如何解决这个问题?

【问题讨论】:

  • 你好@DigvijayS,这不是我需要的。感谢您的回复...
  • 请您更详细地解释为什么@digvijayS 给出的答案不是您所需要的?您能否提供您编写的代码并解释为什么它没有达到您想要的效果?
  • Yes.. 这是在雪花中调用另一个 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) 如何解决这个问题?
  • 这段代码是否意味着是 javascript - 因为如果是这样,那么它离有效代码还很遥远?

标签: snowflake-cloud-data-platform


【解决方案1】:

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...
}

【讨论】:

  • 谢谢。在我们这样做之后,我们需要运行执行命令吗?比如executeStatement('', call, []) ?
猜你喜欢
  • 1970-01-01
  • 2010-11-14
  • 2014-09-17
  • 2011-05-08
  • 1970-01-01
  • 2013-03-08
  • 1970-01-01
  • 2014-06-05
相关资源
最近更新 更多