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

标签 postgresql stored-procedures ddl

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(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

您只需正确引用即可。请参阅:

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

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

关于postgresql - PostgreSQL 可以在过程中声明过程吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/71543015/

相关文章:

postgresql - 当表a中的列更新时用于更新表b的Postgres函数

mysql - 显然 fetch 返回 NULL

mysql - 无法多次调用Mysql存储过程,存在于同一个sql文件中

sql-server - 自动创建包含 n 列的表

postgresql - 将本地数据库迁移到 AWS Aurora

sql - postgresql 更新最新行

mysql - 如何使用触发器来限制修改

sql-server - 应用默认约束时出错

sql - 如何忽略 Postgres INSERT INTO 中违反外键约束的行?

MySQL 存储过程不起作用