我创建了一个 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”语句中使用)为大写,或者我做错了什么。
最佳答案
所以有两件事。一是 session 对数据库对象名称的处理。默认情况下,所有对象都是大写的(也称为大小写无关紧要),并且在这种情况下使用双引号,将意味着 “我的大小写是要使用的预期大小写,还有空格和其他内容这里没问题”
。这可以通过 session 变量进行更改,但这会导致使用引号和尊重大小写的 View 出现各种问题,而不适用于不同的 session 。
然后,名称约定行为与 UDF 代码交互/相交,具体情况视情况而定,Snowflake 已经同意“对象的真实名称是它需要在 JavaScript 中调用的名称。
因此,如果您正在访问传入的参数并且没有双引号它的名称(当您声明它时),您将始终必须以 SHOUTING 风格引用它。但是,如果在声明函数时(在“尊重引号”的 session 中)在变量名称上使用双引号,那么您可以在 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 中的问题,而是当您使用输入变量时的问题。
关于variables - UDF中的Snowflake变量需要大写吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/70934891/