Передача имени таблицы в качестве параметра в определяемые пользователем функции - PullRequest
0 голосов
/ 10 апреля 2019

Я хочу создать UDF, который содержит параметризованный запрос. Поскольку я хочу повторно использовать эту функцию, я также хочу параметризовать имя таблицы. Возможно ли это в хранилище данных Snowflake (или Oracle, поскольку оно немного похоже по синтаксису)?

Я не думаю, что это можно сделать, используя только SQL. Любой вклад в то, как это может быть достигнуто с помощью Python?

Ответы [ 3 ]

1 голос
/ 17 апреля 2019

Это действительно базовый вопрос программирования, который не имеет отношения к 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))
0 голосов
/ 13 апреля 2019

@ MarcinZukowski Спасибо за информацию. Да, я проверил это, и они планируют запустить его в июне. У меня просто есть запрос для проверки ограничения PK в UDF, который не обязательно должен быть в UDF. Мой CSV выглядит так, у которого есть имя таблицы и ее первичные ключи:

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

Я хочу выполнить запрос ниже для каждой таблицы из этого CSV. Здесь имя таблицы может быть одним аргументом, но имена столбцов должны быть разными, поскольку таблицы могут содержать 1 или более первичных ключей.

select Col1, Col2, Col3 from Table1
group by Col1, Col2, Col3
having count(*)>1 
0 голосов
/ 10 апреля 2019

Вы не можете использовать имя таблицы в качестве переменной связывания в Oracle. Запрос анализируется во время компиляции, а не во время выполнения. Вы должны использовать EXECUTE IMMEDIATE или dbms_sql.

...