如何在Vertica中创建外部过程

3
我该如何在 Vertica 中创建使用 SQL 子句(例如FROM、WHERE、GROUP BY、ORDER BY、LIMIT等)的函数/过程?

我投票关闭此问题,因为这些信息通常可以在文档中找到。 - Kermit
1
他们的支持和文档对此非常模糊,并没有提及vsql。文档指向使用C++或Shell脚本,但这种解决方式最终可以使用普通的SQL。为什么要downvote这个:/?我花了一个小时才弄清楚这个,这个信息可以节省别人的时间。 - Deepak Bala
2个回答

10

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'

您可以配置一个过程,使用bash调用vsql客户端。以下脚本实现了这一功能。您的脚本也可以接受由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 GUI或命令行安装脚本。

安装外部脚本

脚本必须具有正确的所有者并设置了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();

为什么对他要扣负分!这位小伙子在回答中付出了一些努力!来吧,伙计们!!! - Up_One
@Up_One 因为外部过程不返回执行结果:外部过程无法与HP Vertica通信。 ;) - user4512135

-2

Vertica不支持像某些数据库中那样的存储过程。相反,它有用户定义函数。您可以使用Java或其他语言编写它们,但它在数据库内部运行,就像存储过程一样。(如果您需要,它还支持外部过程来运行数据库外的内容)


尽管这可能是解决问题的有价值提示,但答案确实需要展示解决方案。请[编辑]提供示例代码以说明你的意思。特别是,在存储过程中,您应该提供FROMWHEREGROUP BYORDER BYLIMIT的示例;否则,您并没有真正回答所问的问题。 - Toby Speight

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接