雪花:是否必须从程序中返回值?

时间:2021-03-05 07:18:46

标签: snowflake-cloud-data-platform

https://docs.snowflake.com/en/sql-reference/stored-procedures-overview.html#returning-a-value-from-a-stored-procedure-is-optional

雪花医生说 存储过程允许返回值,但不要求返回值。

但在语法上 RETURNS 是强制性的。

CREATE [ OR REPLACE ] PROCEDURE <name> ( [ <arg_name> <arg_data_type> ] [ , ... ] )
  RETURNS <result_data_type> [ NOT NULL ]
  LANGUAGE JAVASCRIPT
  [ { CALLED ON NULL INPUT | { RETURNS NULL ON NULL INPUT | STRICT } } ]
  [ VOLATILE | IMMUTABLE ]
  [ COMMENT = '<string_literal>' ]
  [ EXECUTE AS { CALLER | OWNER } ]
  AS '<procedure_definition>'

有人能解释一下我们如何创建一个过程而不从中返回值吗?或者必须从过程中返回一个值?

1 个答案:

答案 0 :(得分:3)

根据该语法,它是强制性的。但是您的返回值可以只是静态 varchar 而不是来自您的查询结果。如果您的过程没有返回任何内容,甚至是 NULL。

例如像这样(返回NULL)

CREATE OR REPLACE PROCEDURE testproc()
RETURNS varchar
LANGUAGE JAVASCRIPT AS
'var sqlcommand =
`INSERT INTO foo (bar) VALUES (999);`
snowflake.execute({sqlText: sqlcommand});
';

但最好添加一些错误处理并返回成功/失败消息,如下所示:

CREATE OR REPLACE PROCEDURE testproc()
RETURNS varchar
LANGUAGE JAVASCRIPT AS
'var sqlcommand =
`INSERT INTO foo (bar) VALUES (999);`
try {
    snowflake.execute({sqlText: sqlcommand});
    return "Success";
    }
catch(err) {
    return "Failed: "+ err;
}
';