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 中的问题,而是当您使用输入变量时的问题。
Note that an unquoted identifier must be referenced with the capitalized variable name.
我创建了一个 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 中的问题,而是当您使用输入变量时的问题。
Note that an unquoted identifier must be referenced with the capitalized variable name.