0

此查询返回提供名称和签名的函数的 OID:

  select 'myfunc(signature)'::regprocedure::oid;

但是 PostgreSQL plpgsql 中是否有类似myNameAndSignature()函数的东西,所以我们可以使用动态 sql 来构建一个获取函数的 OID 的语句,然后创建一个临时表,并将 OID 附加到临时表的名称?
动态执行的语句是:

create temp table TT17015

我是 PostgreSQL 新手,也许有更好的方法来处理临时表的命名,因此使用临时表并相互调用的函数不会收到它试图删除的特定临时表所在的错误在别处使用?

4

1 回答 1

0

使用函数的 OID 不一定能防止命名冲突。同一个函数可以在同一个会话中运行多次。

如果您需要一个唯一的名称,请使用SEQUENCE. 在您的数据库中运行一次:

CREATE SEQUENCE tt_seq;

然后,在您的 plpgsql 函数或DO语句中:

DO
$$
DECLARE
    _tbl text := 'tt' || nextval('tt_seq');
BEGIN
    EXECUTE 'CREATE TEMP TABLE ' || _tbl || '(id int)';
END
$$

缺点是您必须对动态标识符使用动态 SQL。普通 SQL 命令不接受标识符参数。

于 2013-01-27T19:30:57.800 回答