【问题标题】:PostgreSQL function-OID: 'my OID' where 'my' is the currently executing user-defined-functionPostgreSQL function-OID: 'my OID' 其中 'my' 是当前执行的用户定义函数
【发布时间】:2013-01-27 13:01:13
【问题描述】:

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

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

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

create temp table TT17015

我是 PostgreSQL 的新手,也许有更好的方法来处理临时表的命名,这样使用临时表并相互调用的函数就不会收到它尝试的特定临时表的错误delete 正在其他地方使用?

【问题讨论】:

    标签: postgresql plpgsql temp-tables postgresql-9.2


    【解决方案1】:

    使用函数的 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
    $$
    

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

    【讨论】:

    • 好主意,感谢动态创建的表名只能在动态 SQL 语句中使用的警告。
    猜你喜欢
    • 1970-01-01
    • 2011-06-29
    • 1970-01-01
    • 1970-01-01
    • 2011-03-28
    • 2021-05-19
    • 1970-01-01
    • 1970-01-01
    • 2013-07-11
    相关资源
    最近更新 更多