UDF中的Snowflake变量是否需要大写?

Does Snowflake variables in UDF need to be in uppercase?

我创建了一个 UDF 来测试这一点:

CREATE OR REPLACE function EDW_WEATHER.CHK_READING(p_reading VARCHAR2, P_SENSOR VARCHAR2 )
  RETURNS VARCHAR2
  LANGUAGE JAVASCRIPT
AS
$$
    if (P_SENSOR == 'A') return p_reading;
$$
;

运行正确:

select EDW_WEATHER.CHK_READING('A', 'B');

通过简单地将变量 P_SENSOR 小写为:

CREATE OR REPLACE function EDW_WEATHER.CHK_READING(p_reading VARCHAR2, p_sensor VARCHAR2 )
  RETURNS VARCHAR2
  LANGUAGE JAVASCRIPT
AS
$$
    if (p_sensor == 'A') return p_reading;
$$
;

我在 运行 UDF 时得到这个:

100132 (P0000): JavaScript execution error: Uncaught ReferenceError: p_sensor is not defined in CHK_READING at 'if (p_sensor == 'A') return p_reading;' position 0

我的问题是 Snowflake 是否真的要求变量(在“if”或“case”语句中使用)为大写,还是我做错了什么。

所以有两件事。一是您的会话对数据库对象名称的处理。默认情况下所有对象的默认值都是大写的(也就是大小写无关紧要),并且在该上下文中使用双引号意味着 "how I have the case is the intended case to use, also white space and other stuff is ok in here"。这可以通过会话变量更改,但这会导致使用引号的视图出现各种问题,并且不考虑不同的会话。

然后是 UDF 代码的名称约定行为 interacts/intersects,具体情况视情况而定,Snowflake 已经采用“对象的真实名称是它需要在 JavaScript.

因此,如果您正在访问传入的参数并且您没有双引号它的名称(当您声明它时),您将始终必须以 SHOUTING 样式引用它。但是,如果您在声明函数时在变量名称上使用双引号(在“尊重引号”的会话中),那么您可以在 javascript 中使用小写变量,我在第二个示例中展示了这一点。

因此通常这个函数

CREATE OR REPLACE function EDW_WEATHER.CHK_READING(p_reading VARCHAR2, p_sensor VARCHAR2 )

输入只有 P_READING & P_SENSOR

在这种情况下

CREATE OR REPLACE function EDW_WEATHER.CHK_READING("p_reading" VARCHAR2, "p_SeNsOr" VARCHAR2 )

输入只有p_reading & p_SeNsOr

所以你可以像这样改变你的函数

CREATE OR REPLACE function CHK_READING("p_reading" VARCHAR2, "p_sensor" VARCHAR2 )
  RETURNS VARCHAR2
  LANGUAGE JAVASCRIPT
AS
$$
    if (p_sensor == 'A') return p_reading;
$$
;

然后幸福就是真的!

select CHK_READING('A', 'B');

请参阅上面如何将函数命名为对象 CHK_READING 您也可以通过 chk_reading 调用它,因为在 SQL 情况下(默认情况下)无关紧要。

所以最后一部分:你的问题:

My question is whether Snowflake really require variables (used in "if" or "case" statements) to be in uppercase, or am I doing something wrong.

这不是 IF 或 CASE 中的问题,而是当您使用输入变量时的问题。

正如此处文档所述: https://docs.snowflake.com/en/developer-guide/udf/javascript/udf-javascript-introduction.html#javascript-arguments-and-returned-values

Note that an unquoted identifier must be referenced with the capitalized variable name.