PostgreSQL plpgsql get current procedures oid

w51jfk4q  于 5个月前  发布在  PostgreSQL
关注(0)|答案(3)|浏览(89)

是否可以在函数中获取当前的值?例如:

CREATE FUNCTION foo()
 RETURNS numeric
 LANGUAGE plpgsql
AS '
  BEGIN
    return THIS_FUNCTIONS_OID;
  END
';

字符串
我需要这个,因为我在不同的模式中创建了函数foo,所以函数名在这里没有帮助。

axzmvihb

axzmvihb1#

我猜你看起来就像
第一个月
我怀疑你能不能把它作为变量得到。你可以从current_query()得到函数名,但它会非常不可靠...除非你每次调用它时都把函数名定义为第一个参数:),那么你可以使用$1,但它也不太可靠...

ewm0tg9j

ewm0tg9j2#

我不知道你在做什么,但我肯定你做得不好:)通常,这些奇怪的需求与奇怪的设计有关,导致代码难以维护。
但是你可以使用PostgreSQL 9.4或更高版本轻松获取当前函数的oid。(这个信息在C PL函数中很容易获得,但它隐藏在PLpgSQL中。)如果你的函数来自其他模式而不是public,那么就容易得多:

CREATE OR REPLACE FUNCTION omega.inner_func()
RETURNS oid AS  $$
DECLARE
  stack text; fcesig text;
BEGIN
  GET DIAGNOSTICS stack = PG_CONTEXT;
  fcesig := substring(stack from 'function (.*?) line');
  RETURN fcesig::regprocedure::oid;
END;
$$ LANGUAGE plpgsql;

字符串
对于来自public模式的函数,这有点困难-存在不一致性,并且如果没有显式地附加前缀“public”,则当public不在search_path中时,转换到regprocedure不应该工作。通用解决方案需要多几行:

CREATE OR REPLACE FUNCTION omega.inner_func()
RETURNS oid AS  $$
DECLARE
  stack text; fcesig text; retoid oid;
BEGIN
  GET DIAGNOSTICS stack = PG_CONTEXT;
  fcesig := substring(stack from 'function (.*?) line');
  retoid := to_regprocedure(fcesig::cstring);
  IF retoid IS NOT NULL THEN RETURN retoid; END IF;
  RETURN to_regprocedure(('public.' || fcesig)::cstring);
END;
$$ LANGUAGE plpgsql;

nwlqm0z1

nwlqm0z13#

这是一个老问题了,但是这个功能似乎已经由上面回答这个问题的同一个Pavel提交给了Postgres版本16:
在PL/pgSQL中添加获取当前函数的参数的功能(Pavel Stehule)
这是通过GET DIAGNOSTICS变量= PG_ROUTINE_DATA. https://www.postgresql.org/docs/release/16.0/完成的
下面是提交:https://www.postgresql.org/message-id/E1pjkX2-001M2a-UE%40gemulon.postgresql.org

相关问题