PostgreSQL 可以在过程中声明过程吗?

发布于 2025-01-15 13:16:32 字数 269 浏览 4 评论 0原文

create or replace procedure procedure_1()
language plpgsql
as $$ 
declare 
    precedure procedure_2()
    begin 
        select 1;
    end
begin
    select 1;
end; $$

有什么方法可以在 procedure_1() 中声明 procedure_2() 吗?

create or replace procedure procedure_1()
language plpgsql
as $ 
declare 
    precedure procedure_2()
    begin 
        select 1;
    end
begin
    select 1;
end; $

Is there any way to declare a procedure_2() inside procedure_1()?

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(1

一个人的夜不怕黑 2025-01-22 13:16:32

- 如果“声明”是指“创建”。

CREATE OR REPLACE PROCEDURE procedure_1(INOUT result int)
  LANGUAGE plpgsql AS
$proc1$
BEGIN
   CREATE OR REPLACE PROCEDURE procedure_2(INOUT result int)
     LANGUAGE plpgsql AS
   $proc2$
   BEGIN
      result := 2;
   END
   $proc2$;
   
   result := 1;
END
$proc1$;

db<>fiddle 这里

你只需正确引用。请参阅:

函数和过程不是“声明”,但是 在 Postgres 中“创建”。这会在数据库中创建一个对象,然后所有具有适当权限的人都可以看到并使用该对象。 (不仅仅是过程或事务本地的临时对象。)

但是,您可以使用此“hack”创建一个“临时”函数或过程 - 如果这就是您的想法:

Yes - if by "declare" you mean "create".

CREATE OR REPLACE PROCEDURE procedure_1(INOUT result int)
  LANGUAGE plpgsql AS
$proc1$
BEGIN
   CREATE OR REPLACE PROCEDURE procedure_2(INOUT result int)
     LANGUAGE plpgsql AS
   $proc2$
   BEGIN
      result := 2;
   END
   $proc2$;
   
   result := 1;
END
$proc1$;

db<>fiddle here

You just have to get the quoting right. See:

Functions and procedures are not "declared", but "created" in Postgres. That creates an object in the database which is then visible and usable by all with appropriate permissions. (Not just a temporary object local to the procedure or transaction.)

You can, however, create a "temporary" function or procedure, with this "hack" - if that's what you had in mind:

~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文