the*_*3RV 4 postgresql alias stored-procedures plpgsql
我遇到了下一篇文章中定义的问题,第一个答案解决了我将参数命名为与表列同名的主要问题。我的新担忧是我的函数/过程参数被广泛使用,并且我的函数/过程的名称相当详细。
有没有办法为函数或过程名称定义别名 - 在其体内使用?
当前代码:
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;
...
Run Code Online (Sandbox Code Playgroud)
所需代码:
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;
...
Run Code Online (Sandbox Code Playgroud)
不直接。函数名称似乎作为包含函数体内输入参数的记录可见,但正如我引用的答案ALIAS中所建议的那样,它无法访问,因为它实际上充当外部label。手册:
\n\n\n笔记
\n\n实际上,任何 PL/pgSQL 函数的主体周围都有一个隐藏的 \xe2\x80\x9couter 块\xe2\x80\x9d。该块提供函数参数(如果有)的声明,以及一些特殊变量,例如
\nFOUND(参见第 42.5.5 节)。外部块标有函数的名称,这意味着参数和特殊变量可以使用函数的名称进行限定。
但是您可以将ALIASfor 函数参数与外部块标签(标有函数名称的内置外部块下方的一层嵌套)组合起来,如下所示:
函数的一般示例:
\n\nCREATE OR REPLACE FUNCTION weird_procedure_name(named_id int)\n RETURNS TABLE (referenced_how text, input_value int) LANGUAGE plpgsql AS\n$func$\n<< proc >> -- outer label!\nDECLARE\n named_id ALIAS FOR named_id; -- sic!\nBEGIN\n RETURN QUERY VALUES\n (\'weird_procedure_name.named_id\', weird_procedure_name.named_id)\n , (\'proc.named_id\', proc.named_id)\n , (\'named_id\', named_id)\n ;\nEND\n$func$;\nRun Code Online (Sandbox Code Playgroud)\n\n\n\n\n\n\nRun Code Online (Sandbox Code Playgroud)\n\nSELECT * FROM weird_procedure_name(666);\n\n参考方式 | 输入值\n:---------------------------- | ----------:\nweird_procedure_name.named_id | 666\nproc.named_id | 666 666\n命名_id | 666\n\n
db<>在这里摆弄
\n\nnamed_id ALIAS FOR named_id;似乎是毫无意义的噪音,但现在可以通过块标签访问输入参数 - 有效地执行您所要求的操作。(您可能会在使用时选择不同的名称。)
\n而且我肯定会添加一个代码注释来解释为什么需要标签和别名,以免下一个聪明的开发人员试图删除其中任何一个。
应用于您的示例:
\n\nCREATE OR REPLACE PROCEDURE PR_DeleteCrazyNamedItemByCrazyNamedID(in NamedID UUID)\n LANGUAGE plpgsql AS\n$BODY$\n<< proc >> -- !\nDECLARE\n NamedID ALIAS FOR NamedID; -- sic!\nBEGIN\n DELETE FROM dbo.tbl t WHERE t.NamedID = proc.NamedID; -- what you wanted !\nEND\n$BODY$;\nRun Code Online (Sandbox Code Playgroud)\n\n我仍然更愿意一开始就使用唯一的参数名称,因此根本不需要任何资格。我喜欢在所有参数名称前加上下划线(例如:)_named_id- 并且永远不会对其他对象名称执行相同的操作。