如何在雪花存储过程中进行数学计算?

时间:2020-07-13 01:08:57

标签: stored-procedures apache-nifi snowflake-cloud-data-platform

加入两个Snowflake表后,我得到了一个count(*)。这是在存储过程中完成的。如果计数大于零,则需要传递一个值。我的存储过程从NiFi处理器调用,我必须将值返回给NiFi,以便可以从NiFi发送电子邮件。

对于以下代码,我得到“ NaN”作为输出。

CREATE OR REPLACE PROCEDURE test_Delete_excep()
returns float not null

language javascript
as

$$
var rs;
var return_value = 0;

var SQL_JOIN = "select count(*) from (Select GT.VARIANTDATA from GOV_TEST GT inner join GOV_TEST_H GTH on GT.VARIANTDATA:COL1::String = GTH.VARIANTDATA:COL1::String where to_char(GT.VARIANTDATA) != to_char(GTH.VARIANTDATA));";

var stmt = snowflake.createStatement({sqlText: SQL_JOIN});
      
rs = stmt.execute();
rs.next();
return_value += JSON.stringify(rs.getColumnValue(1));

if (return_value > 0) { return 'email required';}

$$;

这是结果:

Row                     TEST_DELETE_EXCEP
1                                     NaN

如何进行算术运算并将值返回给NiFi处理器?

1 个答案:

答案 0 :(得分:2)

您永远不会返回SP定义为返回类型的浮点值。如果return_value大于0,它将尝试返回字符串'email required。',它不是浮点数。那会产生NaN。如果return_value不大于0,则代码将永远不会返回任何类型的值。那将返回NULL。由于您为返回指定NOT NULL,因此将其强制为NaN

此外,我不确定您为什么要对rs.getColumnValue(1)进行字符串化。选择计数(*)将产生一个整数值,您可以直接读取该值。

您可能想要这样的东西:

CREATE OR REPLACE PROCEDURE test_Delete_excep()
returns float not null

language javascript
as

$$
var rs;
var return_value = 0;

var SQL_JOIN = "select count(*) from (Select GT.VARIANTDATA from GOV_TEST GT inner join GOV_TEST_H GTH on GT.VARIANTDATA:COL1::String = GTH.VARIANTDATA:COL1::String where to_char(GT.VARIANTDATA) != to_char(GTH.VARIANTDATA));";

var stmt = snowflake.createStatement({sqlText: SQL_JOIN});
      
rs = stmt.execute();

if(rs.next()) {
  return_value = rs.getColumnValue(1);
} else {
  return -1;
}
return return_value;

$$;

这将返回您的联接SQL产生的行数。如果您想要不同的东西,请说明所需的输出。