在用户定义的函数中将 Table 名称作为参数传递

Passing Table Name as Parameter in User Defined Functions

我想创建一个包含参数化查询的 UDF。由于我想重用这个函数,所以我也想参数化table这个名字。这在 Snowflake 数据仓库(或 Oracle,因为它在语法方面有点相似)中是否可行?

我认为仅使用 SQL 无法做到这一点。关于如何使用 Python?

实现的任何输入

您不能在 Oracle 中使用 table 名称作为绑定变量。查询在编译时解析,而不是 运行 时。你必须使用 EXECUTE IMMEDIATE or dbms_sql

@MarcinZukowski 感谢您提供信息。是的,我查过了,他们计划在 6 月推出。我只是有查询来验证 UDF 中的 PK 约束,它不需要在 UDF 中。 我的 CSV 看起来像这样,其中包含 table 名称及其主键:

|  Table Name  |  Primary Key  | 
|    Table 1   |     Col1      |  
|    Table 1   |     Col2      |
|    Table 1   |     Col3      | 
|    Table 2   |     Col11     | 
|    Table 2   |     Col12     | 

我想对此 CSV 中的每个 table 执行以下查询。这里 table 名称可以是单个参数,但列名必须不同,因为 table 可以有 1 个或多个主键。

select Col1, Col2, Col3 from Table1
group by Col1, Col2, Col3
having count(*)>1 

这是一个非常基础的编程问题,与 Snowflake 无关。因此,您应该在此处询问之前进行更多调查。但这里有一个答案的草图:

#!/usr/bin/env python

# Connect to Snowflake
# See https://docs.snowflake.net/manuals/user-guide/python-connector-example.html#connecting-
...
con = 
...

# Scan the file to build the table/column info
tables = {}
with open("zz.csv") as f:
    for l in f.readlines():
        tname, cname = l.split(",")
        tables.setdefault(tname.strip(), []).append(cname.strip())

# Run a query for each query
for tname, clist in tables.iteritems():
    query = """select {columns} from {table} 
               group by {columns} 
               having count(*) > 1
            """.format(columns=",".join(clist), table=tname)
    print("Running query: {0}".format(query))
    cur = con.cursor()
    cur.execute(query)
    for rec in cur:
        print("DUPLICATED RECORD: {0}".format(rec))