【问题标题】:Alias for function or procedure name函数或过程名称的别名
【发布时间】:2020-05-15 09:27:27
【问题描述】:

我遇到了下一篇文章中定义的问题,第一个答案解决了我将参数命名为与表列同名的主要问题。我的新担心是我的函数/过程参数被广泛使用,并且我的函数/过程的名称相当详细。

PL/pgSQL column name the same as variable

有没有办法为函数或过程名称定义别名 - 以在其主体内使用?

当前代码:

CREATE OR REPLACE PROCEDURE dbo.PR_DeleteCrazyNamedItemByCrazyNamedID(in NamedID UUID)
  LANGUAGE plpgsql AS
$BODY$
DECLARE
BEGIN
    Delete from dbo.Table t where PR_DeleteCrazyNamedItemByCrazyNamedID.NamedID = t.NamedID;
...

所需代码:

CREATE OR REPLACE PROCEDURE dbo.PR_DeleteCrazyNamedItemByCrazyNamedID(in NamedID UUID) as proc
  LANGUAGE plpgsql AS
$BODY$
DECLARE
BEGIN
    Delete from dbo.Table t where proc.NamedID = t.NamedID;
...

【问题讨论】:

  • 似乎在the answer that you linked to 中按字面意思回答? "最好一开始就避免这种歧义,这样更不容易出错。如果您也需要列名作为函数参数名,避免命名冲突的一种方法是在函数内使用 ALIAS。这是一个ALIAS 实际有用的极少数情况。或者您可以按序号位置引用输入参数"
  • 你为什么不给参数一个不同的名字呢?例如:(p_named_id uuid)
  • @bergi 我在表名上使用了别名,而这正是我试图对函数名执行的操作。我了解最佳实践,我只是想问问这样的事情是否存在。
  • 函数名没有对应的ALIAS作为表的别名。正如@a_horse_with_no_name 所说,只需给您的参数一个不同的名称。如果您不喜欢“p_xxxx”约定,请使用 in_name_id 或 name_id_in 之类的内容,或者其他适合您的内容。
  • @Bergi:还有一个棘手的细节:函数名称用作保存输入参数的记录,但ALIAS 功能本身无法访问。

标签: postgresql stored-procedures alias plpgsql


【解决方案1】:

不直接。函数名称似乎在函数体内作为包含输入参数的记录可见,但正如 my referenced answer 中所建议的那样,ALIAS 无法访问它,因为它实际上用作外部 标签 The manual:

注意

实际上有一个隐藏的“外块”围绕着任何人的身体 PL/pgSQL 函数。该块提供了 函数的参数(如果有),以及一些特殊的变量,如 如FOUND(见Section 42.5.5)。外部块标有 函数名,表示参数和特殊变量可以 用函数名限定。

但是您可以将函数参数的ALIASouter block label (在标有函数名称的内置外部块下方的一个嵌套级别)结合起来,如下所示:

带有函数的一般示例:

CREATE OR REPLACE FUNCTION weird_procedure_name(named_id int)
  RETURNS TABLE (referenced_how text, input_value int) LANGUAGE plpgsql AS
$func$
<< proc >>  -- outer label!
DECLARE
   named_id ALIAS FOR named_id; -- sic!
BEGIN
   RETURN QUERY VALUES
     ('weird_procedure_name.named_id', weird_procedure_name.named_id)
   , ('proc.named_id', proc.named_id)
   , ('named_id', named_id)
   ;
END
$func$;
SELECT * FROM  weird_procedure_name(666);
参考方法 |输入值 :---------------------------- | ----------: 奇怪的程序名称.named_id | 666 proc.named_id | 666 命名ID | 666

db小提琴here

named_id ALIAS FOR named_id; 似乎是毫无意义的噪音,但现在可以通过块标签访问输入参数 - 有效地按照您的要求进行操作。 (您可能会在使用时选择不同的名称。)
而且我肯定会添加一个代码注释来解释为什么需要标签和别名,以免下一个聪明的开发人员会试图删除它们。

应用于您的示例

CREATE OR REPLACE PROCEDURE PR_DeleteCrazyNamedItemByCrazyNamedID(in NamedID UUID)
  LANGUAGE plpgsql AS
$BODY$
<< proc >>  -- !
DECLARE
   NamedID ALIAS FOR NamedID; -- sic!
BEGIN
   DELETE FROM dbo.tbl t WHERE t.NamedID = proc.NamedID;  -- what you wanted !
END
$BODY$;

我仍然更愿意使用唯一的参数名称开始,因此根本不需要限定。我喜欢在所有参数名称前加上下划线(例如:_named_id)——而从不对其他对象名称做同样的事情。

【讨论】:

  • 我无法判断那是可爱还是丑陋,但它很有趣!
  • @LaurenzAlbe:我认为它在技术上是干净的。尽管如此,仍然感觉很奇怪,揭示了一些令人惊讶的实现细节。
猜你喜欢
  • 1970-01-01
  • 2021-03-25
  • 2012-08-26
  • 1970-01-01
  • 2016-04-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2014-07-19
相关资源
最近更新 更多