Oracle、PostgreSQL、羲和(Halo)数据库中的的IN、OUT 和 INOUT参数模式
一、前言
前些天看到PostgreSQL分会在微信上的一则翻译分享,标题为Oracle 与 PostgreSQL 中的 IN、OUT 和 INOUT 参数。文章大概内容为,在针对Oracle迁移至PostgreSQL中,对于函数/存储过程的输入输出类型这一细节方面,双方处理的差异点,通过了解这些差异点,来提高迁移的成功率。
恰好当处在实现这一块的时候,我也简单琢磨过一会,所以此处决定结合该文章,顺带拉上羲和数据库(以下简称Halo),结合Oracle、PostgreSQL数据库来做一次简单的分享,通过多则示例,加深一下大家对于这一块的理解。相关文章链接如下:
Oracle 与 PostgreSQL 中的 IN、OUT 和 INOUT 参数
IN, OUT and INOUT parameters in Oracle vs PostgreSQL
接下来就按照人家文章的节奏一步一步来吧。
二、按值传递和按引用传递?
在Oracle中,它的IN参数模式为引用传递,OUT以及IN OUT参数模式在默认的情况下,为值传递。更多详细内容如下图:
当 OUT 或 IN OUT 参数在过程中更改时,它仅更改参数值的副本。仅当过程无错误地完成后,结果值才会复制回形式参数。
如果将集合作为 OUT 或 IN OUT 参数发送,它将按值传递。这意味着在进入过程时,完整的集合将从形式参数复制到实际参数,并在退出过程时复制回形式参数。如果集合很大,这可能会消耗大量的 CPU 和内存。NOCOPY 参数模式提示通过指示运行时引擎尝试通过引用而不是通过值传递 OUT 或 IN OUT 参数来解决此问题。
而且在Oracle中,当参数使用了IN模式的话,不允许对该参数进行赋值操作。但是这方面没啥影响。
CREATE FUNCTION func_test (va IN INTEGER)
RETURN INTEGER
AS
BEGIN
va := 1; -- oracle不允许修改
RETURN 2;
END ;
/