DrC*_*sos 47 postgresql stored-procedures plpgsql
所以这个问题的评论提到,PostgreSQL 中的“存储过程”和“存储功能”略有不同。
评论链接到维基百科文章,但其中一些似乎并不适用(例如,它们可以在SELECT
声明中使用)。
该语法本身似乎有点混乱:
CREATE FUNCTION emp_stamp() RETURNS trigger AS $emp_stamp$
BEGIN
[...]
END;
$emp_stamp$ LANGUAGE plpgsql;
CREATE TRIGGER emp_stamp BEFORE INSERT OR UPDATE ON emp
FOR EACH ROW EXECUTE PROCEDURE emp_stamp();
Run Code Online (Sandbox Code Playgroud)
您创建了一个FUNCTION
但将其称为PROCEDURE
.
那么这两者有什么区别呢?
Pet*_*aut 51
正式地,PostgreSQL 只有“函数”。触发器函数有时被称为“触发器过程”,但这种用法没有明显的意义。在内部,函数有时被称为过程,例如在系统目录中pg_proc
。这是 PostQUEL 的遗留物。某些人(可能具有不同数据库系统经验)可能与过程相关的任何功能,例如它们与防止 SQL 注入或使用输出参数的相关性,也适用于 PostgreSQL 中存在的函数。
现在,当 PostgreSQL 社区中的人们谈论“存储过程”或“真正的存储过程”时,他们通常指的是类函数对象的假设特征,可以在其主体中启动和停止事务,这是当前函数无法实现的做。在此上下文中使用术语“存储过程”似乎与其他数据库产品类似。有关模糊的想法,请参阅此邮件列表线程。
然而,在实践中,函数与过程在事务控制能力方面的这种区别并没有被普遍接受,当然,许多没有数据库偏见的程序员会将类似 Pascal 的过程解释为没有返回值的函数。(SQL 标准似乎采取了中间立场,因为默认情况下,过程具有与函数不同的事务行为,但可以根据对象进行调整。)所以在任何情况下,尤其是在查看 Stack Exchange 上的问题时对于非常复杂的受众,您应该避免假设太多并使用更清晰的术语或定义您期望的属性。
Jac*_*las 15
在 DDL 方面,Postgres 没有过程对象,只有函数。Postgres 函数可以返回 value(s) 或 void,因此它们在其他 RDBMS 中同时扮演函数和过程的角色。中的“过程”create trigger
一词指的是一个函数。
就 Postgres 文档而言,'procedure' 也是称为函数的数据库对象的同义词,例如:“使用 CREATE FUNCTION 命令创建触发器过程”。
触发器“过程”确实有特定的规则:它们必须声明为一个没有参数且返回类型为 trigger 的函数。示例在这里。
d4n*_*yll 14
PostgreSQL 11 添加了存储过程作为新的模式对象。您可以使用该CREATE PROCEDURE
语句创建一个新过程。
存储过程在以下方面与函数不同:
存储过程不需要返回任何东西,使用INOUT
参数时只返回一行。
您可以在存储过程中提交和回滚事务,但不能在函数中提交和回滚事务。
您使用CALL
语句而不是SELECT
语句执行存储过程。
与函数不同,过程不能嵌套在其他 DDL 命令(SELECT
、INSERT
、UPDATE
、DELETE
)中。
术语“存储过程”和“存储函数”在 PostgreSQL 中可以互换使用,通常表示相同的意思。其他数据库可能会区分过程和函数(很像 VB 如何区分子程序和函数)。
只要 PostgreSQL 中的函数返回类似于表的内容,您就可以像使用标准表一样使用该函数的输出。该CREATE TRIGGER
语法是有点混乱,但我怀疑它可能已经到位的ANSI标准定稿之前。我只有 SQL:2003 的副本,所以我只能推测为什么命名法很奇怪。
TL;DR 版本:使用 PostgreSQL,“过程”相当于“函数”。
简短的回答是函数返回一个值,但过程没有。
这种区别存在于持久存储模块 (SQL/PSM) 中,它是为 SQL 1992 提出的。我不知道 SQL/PSM 是否曾经将其纳入标准。
在 MSSQL 中,存储过程是一组预编译的 sql 命令。
一个存储过程:
- 可以有许多输入和输出参数 - 可用于修改数据库表/结构/数据 - 通常不在插入/更新/删除/选择语句中使用用户定义的函数有多种形式。根据编写的函数类型,函数:
- 可以有多个输入参数,但只返回一个值(即字符串连接) - 可以接受一组作为输入,返回单个值(即 dbo.FindLargestPig(ListOfPigs) ) - 返回一个表(即 select * from dbo.ExplodeString("this is a list of words") ) - 可用于选择/插入/更新/删除语句 - 不能用于修改数据库表/结构/数据
归档时间: |
|
查看次数: |
46441 次 |
最近记录: |