带有 IF 语句空值检查的存储过程雪花
Stored Procedure Snowflake with IF statement Null Check
我编辑了之前的代码以使其更简单。低于 returns 对我来说总是 SELECT 2. 我希望得到它 SELECT 1 因为 etlId 是 0.
问题可能出在哪里?
谢谢
此致
'
function getScalarValue(queryString) {
var out;
cmd = {sqlText: "set etl_id = 0 "};
stmt = snowflake.createStatement(cmd);
var rs;
rs = stmt.execute();
rs.next();
return rs.getColumnValue(1);
return out;
}
var etlId = getScalarValue("select $etl_id");
if (etlId == 0 )
{
var sql_command = "SELECT 1";
}
else {
var sql_command = "SELECT 2";
}
try {
snowflake.execute (
{sqlText: sql_command}
);
return "Success" ; // Return a success/error indicator.
}
catch (err) {
return "Failed: " + err; // Return a success/error indicator.
}
'
$etl_id
不是 JavaScript 变量。它是一个 SQL 变量。您可以使用辅助函数从 SQL 语句中获取标量值。此辅助函数获取第一列、第一行值和 returns it:
更新:根据你的更新,应该是这样的:
create or replace procedure TEST()
returns string
language javascript
execute as caller
as
$$
var etlId = getScalarValue("select $etl_id");
if (etlId == 0 )
{
var sql_command = "SELECT 1";
}
else {
var sql_command = "SELECT 2";
}
try {
snowflake.execute (
{sqlText: sql_command}
);
return "Success" ; // Return a success/error indicator.
}
catch (err) {
return "Failed: " + err; // Return a success/error indicator.
}
function getScalarValue(queryString) {
var out;
cmd = {sqlText: queryString};
stmt = snowflake.createStatement(cmd);
var rs;
rs = stmt.execute();
rs.next();
return rs.getColumnValue(1);
return out;
}
$$;
set etl_id = 1;
call test();
感谢您的回复。我有另一种解决方案,可以在脚本中使用变量作为参数。当我调用该过程时,我可以使用 SQL 来定义参数,所以这对我有用。再次感谢您的帮助。
此致
create or replace procedure TEST(etlId, float)
returns string
language javascript
execute as caller
as
$$
if (etlId == 0 )
{
var sql_command = "SELECT 1";
}
else {
var sql_command = "SELECT 2";
}
try {
snowflake.execute (
{sqlText: sql_command}
);
return "Success" ; // Return a success/error indicator.
}
catch (err) {
return "Failed: " + err; // Return a success/error indicator.
}
$$
call TEST (select count(etl_id) etlId from view where etl_id not in (select etl_id from table))
我编辑了之前的代码以使其更简单。低于 returns 对我来说总是 SELECT 2. 我希望得到它 SELECT 1 因为 etlId 是 0.
问题可能出在哪里?
谢谢
此致
'
function getScalarValue(queryString) {
var out;
cmd = {sqlText: "set etl_id = 0 "};
stmt = snowflake.createStatement(cmd);
var rs;
rs = stmt.execute();
rs.next();
return rs.getColumnValue(1);
return out;
}
var etlId = getScalarValue("select $etl_id");
if (etlId == 0 )
{
var sql_command = "SELECT 1";
}
else {
var sql_command = "SELECT 2";
}
try {
snowflake.execute (
{sqlText: sql_command}
);
return "Success" ; // Return a success/error indicator.
}
catch (err) {
return "Failed: " + err; // Return a success/error indicator.
}
'
$etl_id
不是 JavaScript 变量。它是一个 SQL 变量。您可以使用辅助函数从 SQL 语句中获取标量值。此辅助函数获取第一列、第一行值和 returns it:
更新:根据你的更新,应该是这样的:
create or replace procedure TEST()
returns string
language javascript
execute as caller
as
$$
var etlId = getScalarValue("select $etl_id");
if (etlId == 0 )
{
var sql_command = "SELECT 1";
}
else {
var sql_command = "SELECT 2";
}
try {
snowflake.execute (
{sqlText: sql_command}
);
return "Success" ; // Return a success/error indicator.
}
catch (err) {
return "Failed: " + err; // Return a success/error indicator.
}
function getScalarValue(queryString) {
var out;
cmd = {sqlText: queryString};
stmt = snowflake.createStatement(cmd);
var rs;
rs = stmt.execute();
rs.next();
return rs.getColumnValue(1);
return out;
}
$$;
set etl_id = 1;
call test();
感谢您的回复。我有另一种解决方案,可以在脚本中使用变量作为参数。当我调用该过程时,我可以使用 SQL 来定义参数,所以这对我有用。再次感谢您的帮助。
此致
create or replace procedure TEST(etlId, float)
returns string
language javascript
execute as caller
as
$$
if (etlId == 0 )
{
var sql_command = "SELECT 1";
}
else {
var sql_command = "SELECT 2";
}
try {
snowflake.execute (
{sqlText: sql_command}
);
return "Success" ; // Return a success/error indicator.
}
catch (err) {
return "Failed: " + err; // Return a success/error indicator.
}
$$
call TEST (select count(etl_id) etlId from view where etl_id not in (select etl_id from table))