2011-12-01 111 views
3

我可以通过C语言函数API或使用接受回调函数作为参数的pl/pgsql在Postgres中创建用户定义的函数吗?作为Postgres中另一个函数的参数函数

据我所知,通过C语言API无法做到这一点,因为它只接受sql数据类型,并且没有“函数”的数据类型。但也许我错过了什么?

回答

1

我认为你不能,但由于没有匿名函数,传递函数名应该这样做。

+1

当我只有pl/pgsql中的函数名或通过c api时,你知道我是如何调用函数的吗? – Kungi

+0

@Kungi,类似于'EXECUTE'SELECT'|| funcname ||'()'...'。 –

+0

更多在这里 - http://www.postgresql.org/docs/9.1/static/plpgsql-statements.html#PLPGSQL-STATEMENTS-EXECUTING-DYN –

3

由于每个函数/过程都必须在pg_proc中有条目,因此可以使用主键来标识该过程。这也将消除具有相同名称但具有不同参数或不同参数类型的程序的问题。

对此的简要描述是类型regprocregprocedure与相关演员为更容易处理。查找这些manual

识别功能,并围绕它传递是没有问题的:

select 'pg_database_size(oid)'::regprocedure; -- create "reference" 
    regprocedure  
----------------------- 
pg_database_size(oid) 

使用regprocedure作为参数类型。

我还没搞清楚的问题是如何以一种方便的方式实际调用这样的事情。

+1

您必须构建动态SQL并在plpgsql函数中使用EXECUTE。将'regproc'转换回'text'来构建查询字符串。确保使用'quote_ident()'防止SQLi - 函数名称不安全。考虑:CREATE FUNCTION;从用户中删除;“()RETURNS int AS'SELECT 1'LANGUAGE sql;' –

相关问题