无法在 Snowflake 中创建返回 "Table" 的 UDF - 编译错误
Cannot create UDFs returning "Table" in Snowflake - compilation error
USE AGDWHDEV.EDW_WEATHER; -- My database and schema
CREATE OR REPLACE function EDW_WEATHER.find_nearest_radar()
returns table (LATITUDE number, LONGITUDE number)
as 'SELECT 1 LATITUDE, 1 LONGITUDE';
-- The function compiled successfully but when I ran it:
select EDW_WEATHER.find_nearest_radar();
-- I get this:
002141 (42601): SQL compilation error:
Unknown user-defined function EDW_WEATHER.FIND_NEAREST_RADAR
如果我将 return 类型更改为 FLOAT(非 Table)或任何简单的 return 类型,它将起作用。下定决心,我在网上搜索并按照以下示例进行操作,网址为:
https://www.bmc.com/blogs/snowflake-user-defined-functions/
在“雪花 table 函数”部分中
但是我得到了同样的错误!我做错了什么?
因为它returns一个table,你不能直接select它。它需要是一个来源,因此包裹在 TABLE 中并被称为:
CREATE OR REPLACE function edw_weather.find_nearest_radar()
returns table (LATITUDE number, LONGITUDE number)
as 'SELECT 1, 1';
SEECT *
FROM TABLE(edw_weather.find_nearest_radar());
给出:
LATITUDE
LONGITUDE
1
1
注意:SELECT 1 LATITUDE, 1 LONGITUDE
可以只是 SELECT 1,1
,因为列的名称已在输出中声明。但是经常使用别名,使用 AS 来帮助显示你对 rename/etc 节错过逗号的含义不太容易出错。
SELECT 1 AS latitude, 1 AS longitude
USE AGDWHDEV.EDW_WEATHER; -- My database and schema
CREATE OR REPLACE function EDW_WEATHER.find_nearest_radar()
returns table (LATITUDE number, LONGITUDE number)
as 'SELECT 1 LATITUDE, 1 LONGITUDE';
-- The function compiled successfully but when I ran it:
select EDW_WEATHER.find_nearest_radar();
-- I get this:
002141 (42601): SQL compilation error:
Unknown user-defined function EDW_WEATHER.FIND_NEAREST_RADAR
如果我将 return 类型更改为 FLOAT(非 Table)或任何简单的 return 类型,它将起作用。下定决心,我在网上搜索并按照以下示例进行操作,网址为:
https://www.bmc.com/blogs/snowflake-user-defined-functions/
在“雪花 table 函数”部分中
但是我得到了同样的错误!我做错了什么?
因为它returns一个table,你不能直接select它。它需要是一个来源,因此包裹在 TABLE 中并被称为:
CREATE OR REPLACE function edw_weather.find_nearest_radar()
returns table (LATITUDE number, LONGITUDE number)
as 'SELECT 1, 1';
SEECT *
FROM TABLE(edw_weather.find_nearest_radar());
给出:
LATITUDE | LONGITUDE |
---|---|
1 | 1 |
注意:SELECT 1 LATITUDE, 1 LONGITUDE
可以只是 SELECT 1,1
,因为列的名称已在输出中声明。但是经常使用别名,使用 AS 来帮助显示你对 rename/etc 节错过逗号的含义不太容易出错。
SELECT 1 AS latitude, 1 AS longitude