Я хочу создать UDF, который содержит параметризованный запрос. Поскольку я хочу повторно использовать эту функцию, я также хочу параметризовать имя таблицы. Возможно ли это в хранилище данных Snowflake (или Oracle, поскольку оно немного похоже с точки зрения синтаксиса)?
Я не думаю, что это можно сделать, используя только SQL. Любые данные о том, как этого можно достичь с помощью Python?
Вы не можете использовать имя таблицы в качестве переменной связывания в Oracle. Запрос анализируется во время компиляции, а не во время выполнения. Вы должны использовать EXECUTE IMMEDIATE
или dbms_sql
.
@eaolson спасибо. Любой ввод, как это можно сделать с помощью ООП, скажем, Python?
В Python вы, безусловно, можете это сделать, это тривиально. Если вы предоставите конкретный пример запроса и то, как вы хотите его параметризовать, вы можете получить более конкретный ответ.
Кстати, пользовательские функции Snowflake предназначены для операций, выполняемых внутри одного запроса. То, что вы хотите, требует того, что Snowflake называет «хранимыми процедурами». Сейчас они находятся в режиме предварительного просмотра. Пожалуйста, свяжитесь со службой поддержки Snowflake, чтобы получить к ней доступ.
@MarcinZukowski добавил более подробную информацию ниже
@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
Это действительно базовый вопрос программирования, и он не имеет отношения к 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))
ОП действительно хочет получить ответ для базы данных Snowflake. В документация на этот продукт нет ничего, что указывало бы на поддержку динамического SQL. Что неудивительно, учитывая, что это гораздо более молодой и более нишевый продукт.