Как мне создать функции/процедуры в Vertica, которые используют SQL с такими предложениями, как FROM, WHERE, GROUP BY, ORDER BY, LIMIT
и т. д.?
Как создавать внешние процедуры в Vertica
Ответы (2)
Синтаксис Vertica create function
запрещает использование определенных предложений в expression
.
Создать функцию
CREATE [ OR REPLACE ] FUNCTION
... [[db-name.]schema.]function-name ( [ argname argtype [, ...] ] )
... RETURN rettype
... AS
... BEGIN
...... RETURN expression;
... END;
Примечание. В определении CREATE FUNCTION допускается только одно выражение RETURN. FROM, WHERE, GROUP BY, ORDER BY, LIMIT, агрегирование, аналитика и метафункции запрещены.
Чтобы обойти это, вы можете использовать вместо этого процедуру. Процедуры в Vertica не сравнимы с хранимыми процедурами/PL-SQL (Vertica их не поддерживает). В них устанавливаются скрипты, написанные на другом языке (например, Bash). Они берут синтаксис...
Создать процедуру
CREATE PROCEDURE [[db-name.]schema.]procedure-name (
... [ argname ] [ argtype [,...] ] )
... AS 'exec-name'
... LANGUAGE 'language-name'
... USER 'OS-user'
Вы можете настроить процедуру для вызова клиента vsql с помощью bash. Следующий скрипт делает это. Ваш скрипт также может принимать параметры, переданные Vertica.
Скрипт процедуры Bash
#!/bin/bash
/opt/vertica/bin/vsql --command 'select count(*) from my_table where condition > value;' -w 'XXX' --echo-all -h host db_name user_name
exit 0
Установите скрипт с помощью графического интерфейса admintool или командной строки.
Установить внешний скрипт
Сценарий должен иметь правильного владельца и должен быть установлен флаг setuid
. Вы можете сделать это с помощью chmod.
$ admintools -t install_procedure -d vmartdb -f /scratch/helloworld.sh -p ownerpassword
Installing external procedure...
External procedure installed
Создайте скрипт в базе данных, а затем вызовите его
CREATE PROCEDURE my_proc_name() AS 'my_script.sh' LANGUAGE 'external' USER 'db_user';
select my_proc_name();
Vertica не поддерживает хранимые процедуры, как в некоторых БД. Вместо этого он имеет определяемые пользователем функции. Вы пишете их на Java или как-то еще, но они работают ВНУТРИ базы данных, как если бы это была SP. (он также поддерживает внешние процедуры для запуска вещей вне БД, если вы хотите)
FROM
, WHERE
, GROUP BY
, ORDER BY
или LIMIT
в хранимой процедуре; в противном случае вы на самом деле не ответили на заданный вопрос.
- person Toby Speight; 28.09.2016
c++
или сценариев оболочки, но этот обходной путь может в конце концов использовать простой sql. Почему вы минусуете это :/? Мне потребовался час, чтобы понять это, и эта информация может сэкономить кому-то это время. - person Deepak Bala   schedule 10.02.2015