postgresql - postgres 函数参数是通过引用还是值传递?
问题描述
当我调用一个函数并传递一个参数时,该参数的值实际上是在内存中复制的,以便被调用的函数接收该值的副本,还是传递一个引用/指针?
我想在某些情况下这很明显 - 例如,我希望复制一个整数,但是如果我有一个大字符串或数组或表行怎么办?
从我自己的观察来看,该值似乎总是被复制的,因为我可以在不更改调用函数中的值的情况下编辑被调用函数中的值。事实上,我想不出在任何情况下我都能够修改作为参数传入的内容,并让调用函数在不从被调用函数返回更改数据的情况下获取更改。
由于这个原因,我总是对将大量数据从一个函数传递到另一个函数感到不安。我找不到任何关于 postgres 如何处理参数的文档,因此这个问题。我使用的函数类型是 SQL 和 plpgsql。
解决方案
这取决于程序语言和类型。
C函数:
typbyval
如果 中的列pg_type
是,则固定长度数据类型按值传递TRUE
。除非您使用 , 配置 PostgreSQL,否则
--disable-float4-byval
按real
值传递。bigint
,double precision
并且timestamp
类型在 64 位架构上按值传递,除非您使用--disable-float8-byval
.
所有其他数据类型都是通过引用传递的,您有责任不修改数据(请参阅文档configure.in
和源代码src/include/postgres.h
)。
PL/pgSQL 函数:
plpgsql_exec_function
所有参数都按值传递,因为函数in 中的以下代码src/pl/plpgsql/src/pl_exec.c
创建了一个副本:
/*
* Make local execution copies of all the datums
*/
estate.err_text = gettext_noop("during initialization of execution state");
copy_plpgsql_datums(&estate, func);
我没有明确检查其他过程语言,但我很确定所有内容也将按值传递,因为必须将这些数据转换为相应编程语言的内部表示。
推荐阅读
- c# - 无法正确获取 F# 库中派生的类型的实例
- laravel - Laravel 查看不同设计的文件夹结构
- javascript - Heroku 应用出现奇怪的控制台消息
- java - 如何在不使用任何字符串方法且不导入的情况下确定填充字符串的字符列表的长度
- javascript - 如何为随机内容制作 tabBar 元素?
- swift - 如何使用手机默认摄像头
- java - Spock框架中的模拟
- facebook - 如何为最终用户添加“集成流程以连接他们的 Instagram 业务帐户”-FB Graph API (For IG) 问题
- angular - 按下删除时出现内部服务器错误
- javascript - 使用重复键过滤映射结果