Как выполнить математическое вычисление в хранимой процедуре в снежинке? - PullRequest
0 голосов
/ 13 июля 2020

Я получаю счет (*) после объединения двух столов Snowflake. Это делается внутри хранимой процедуры. Если счетчик больше нуля, мне нужно передать значение. Моя хранимая процедура вызывается из процессора 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

Как я могу выполнить расчет арифметики c и вернуть значение процессору NiFi?

1 Ответ

2 голосов
/ 13 июля 2020

Вы никогда не возвращаете значение с плавающей запятой, которое 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. Если вы хотите чего-то другого, уточните желаемый результат.

...