作为Postgres中另一个函数的参数

时间:2011-12-01 18:02:41

标签: sql c database postgresql plpgsql

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

据我所知,无法通过C语言API执行此操作,因为它只接受sql数据类型,并且function没有数据类型。但也许我错过了什么?

3 个答案:

答案 0 :(得分:4)

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

对此的缩写是类型regprocregprocedure以及相关联的强制转换,以便于处理。查找这些manual

识别函数并传递它是没有问题的:

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

使用regprocedure作为参数类型。

我还没弄清楚的问题是如何以方便的方式实际调用这样的东西。

答案 1 :(得分:1)

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

答案 2 :(得分:0)

旧问题,并且已经接受了答案。但这并没有明确说明如何执行此操作。所以我想添加一个更明确的答案。

假设您将回调函数的名称作为varchar值传递给主函数。

CREATE OR REPLACE FUNCTION public.get_function_fields(fn_name character varying)
    ...
    ...

现在,如果要在查询中调用此fn_name函数,则需要使用EXECUTE命令,并使用regproc正确地转换函数名称,如下所示。

EXECUTE 'create temp table if not exists temp_call as select * from ' || fn_name::regproc || '() limit 1';

重要的部分是:...|| fn_name::regproc || '()..。如您所见,您必须附加括号并使用::regproc强制转换函数名称。

希望它将对某人有所帮助!