Tcl语言因其字符串处理能力而闻名,因此如果想要更好地分析查询结果,那么Tcl语言是个很好的选择。其另一个很棒的特性是安全,因为PL/Tcl(即PostgreSQL提供的集成Tcl接口)无法访问数据库服务器内部的工作。不过,如果要想获取更多能力,可以参考PL/TclU,U表示Untrusted(不可信的)。要用它访问数据库,需要用户为超级用户,并且通常也需要更加小心。 相关文章:
任意语言访问PostgreSQL:C语言接口
任意编程语言访问PostgreSQL:C++接口
任意编程语言访问PostgreSQL:PHP接口
由于PL/Tcl是默认集成的,使用之前用户无需安装任何东西,但需要将以下语句添加到要使用PL/Tcl的代码中:
CREATE EXTENSION pltcl #or pltclu
由于PL/Tcl集成到Postgres系统中,与查询和事务处理相比,其对函数与触发器更有用。通常情况下,比起集成一个完整的数据库环境来说,以PL/开头的语言对能力的扩展更加有效,创建用户自己函数的语法格式如下所示:
CREATE FUNCTION name (argtypes) RETURNS type AS $$#这里为函数体$$ LANGUAGE pltcl;
例如为一个简单的相加函数示例:
CREATE FUNCTION tcl_add (integer, integer) RETURNS integer AS $$ return $1 + $2$$ LANGUAGE pltcl;
如果在句末使用LANGUAGE指令的同时使用STRICT,则不必判断输入是否为null。如果不想使用STRICT,可以使用一些if模块和argisnull关键字(点击这里查看更多详细信息)。
使用数据库中的值很简单。例如,假设用户有一个电脑规格表,并且想要使用一个函数查看硬件是否过时以及是否需要更换,可以使用如下代码:
CREATE TABLE machine ( name text, cpuspeed integer #Mhz memory integer #MB hard_drive integer #GB);CREATE FUNCTION isObsolete (machine) RETURNS boolean AS $$ if {$1(cpuspeed) < 266 && $1(memory) < 256 && $1(hard_drive) < 2} { return "t" }return "f"$$ LANGUAGE pltcl;
可以用“spi”(server programming interface - 服务器编程接口)助记符为前缀的系列函数在Postgres数据库中进行选择(select)、插入(insert)及更新(update)对象。spi函数如spi_exec、spi_prepare、spi_execp和quote等,与libpq中的PQ函数类似。spi_exec执行一个SQL命令,返回处理的行数。用户可以指定返回的最大行数,并且将选择的列的值保存到Tcl变量中,如下所示:
spi_exec "SELECT count(*) AS cnt FROM mytable"
spi_prepare比较并存储查询结果供以后使用,用户可以用spi_execp函数对这些数据进行处理。spi_prepare会返回一个查询ID,因此spi_execp知道要处理哪些数据。当使用单引号和/或转义字符时,quote符号十分有用。示例如下:
"SELECT $myvar AS ret"# myvar 包含字符串 "won't"# 当展开时,分析器会给出错误提示"SELECT '[ quote $val ]' AS ret" # 这么表示则没有问题 |