Как создавать внешние процедуры в Vertica

Как мне создать функции/процедуры в Vertica, которые используют SQL с такими предложениями, как FROM, WHERE, GROUP BY, ORDER BY, LIMIT и т. д.?


person Deepak Bala    schedule 10.02.2015    source источник
comment
Я голосую за то, чтобы закрыть этот вопрос как не по теме, потому что эта информация обычно содержится в документации.   -  person Kermit    schedule 10.02.2015
comment
Их поддержка и документация довольно расплывчаты по этому поводу и не упоминают vsql. Документы указывают на использование c++ или сценариев оболочки, но этот обходной путь может в конце концов использовать простой sql. Почему вы минусуете это :/? Мне потребовался час, чтобы понять это, и эта информация может сэкономить кому-то это время.   -  person Deepak Bala    schedule 10.02.2015


Ответы (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();
person Deepak Bala    schedule 10.02.2015
comment
почему отрицательный момент для него ! парень приложил некоторые усилия к этому ответу! Давайте, ребята !!! - person Up_One; 10.02.2015
comment
@Up_One Поскольку внешние процедуры не возвращают результат выполнения: Внешняя процедура не может связаться с HP Vertica.;) - person ; 12.02.2015

Vertica не поддерживает хранимые процедуры, как в некоторых БД. Вместо этого он имеет определяемые пользователем функции. Вы пишете их на Java или как-то еще, но они работают ВНУТРИ базы данных, как если бы это была SP. (он также поддерживает внешние процедуры для запуска вещей вне БД, если вы хотите)

person Myles2Go    schedule 28.09.2016
comment
Хотя это может быть ценным советом для решения проблемы, ответ действительно должен демонстрировать решение. Пожалуйста, отредактируйте, чтобы предоставить пример кода, чтобы показать, что вы имеете в виду. В частности, вы должны предоставить пример FROM, WHERE, GROUP BY, ORDER BY или LIMIT в хранимой процедуре; в противном случае вы на самом деле не ответили на заданный вопрос. - person Toby Speight; 28.09.2016