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



我创建了一个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执行错误:未捕获引用错误:p_sensor未在CHK_READING中的'if处定义(p_sensor=='A'(return p_reading;'位置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代码交互/相交的地方,根据具体情况,Snowflake使用了";对象的真实名称是它在JavaScript中需要调用的名称。

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

因此正常情况下这个功能

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

输入仅为CCD_ 2&P_SENSOR

这里是

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

输入仅为CCD_ 4&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情况下(默认情况下(并不重要。

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

我的问题是Snowflake是否真的要求变量(用于"if"或"case"语句(为大写,或者我做错了什么。

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

如文档所述:https://docs.snowflake.com/en/developer-guide/udf/javascript/udf-javascript-introduction.html#javascript-参数和返回值

请注意,未加引号的标识符必须用大写的变量名引用。

最新更新