函数或过程名称的别名

问题描述 投票:2回答:1

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

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;
...
postgresql stored-procedures alias plpgsql
1个回答
4
投票

不是直接。函数名称看起来像是在函数体内包含输入参数的记录中可见的,但是ALIAS中建议的my referenced answer无法访问它,因为它实际上是外部labelThe manual:

注意

实际上,任何人的身体周围都有一个隐藏的“外块”PL / pgSQL函数。该块提供了函数的参数(如果有)以及一些特殊变量,例如作为FOUND(请参阅Section 42.5.5)。外部块标有函数的名称,意味着参数和特殊变量可以是用函数的名称限定。

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

具有功能的一般示例:

outer 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$;
referenced_how |输入值:---------------------------- | ----------:weird_procedure_name.named_id | 666proc.named_id | 666named_id | 666

db <>小提琴SELECT * FROM weird_procedure_name(666);

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$; ),并且永远不要对其他对象名称执行相同的操作。

© www.soinside.com 2019 - 2024. All rights reserved.