Postgresql源码(78)plpgsql中调用call proc()时的参数传递和赋值(pl参数)

news/2024/5/1 7:09:03/文章来源:https://blog.csdn.net/jackgo73/article/details/126922805

《Postgresql源码(77)plpgsql中参数传递和赋值(pl参数)》
《Postgresql源码(78)plpgsql中调用call proc()时的参数传递和赋值(pl参数)》

总结

  • 调用者在exec_stmt_call中拼接ParamListInfo传给SPI去执行call xxxx命令。
  • ParamListInfo记录了PL的一些回调函数,在SPI会走到:ExecuteCallStmt
  • ExecuteCallStmt核心流程两步:
      1. 拼参数列表:会拿到所有入参
      • 假设第一个入参是Param类型,会回调PL的plpgsql_param_fetch函数,从PL的Datums中拿变量的值赋值给fcinfo->args[0]
      • 假设第二个入参是Const类型常量,则会直接在执行器内赋值给fcinfo->args[1]
      1. 走FunctionCallInvoke进入plpgsql_exec_functions开始执行被调用函数。

请添加图片描述

实验用例

create or replace procedure p1(p_a in int, p_b in int, p_c out int)
language plpgsql
as $$
beginp_c := 30000;raise notice '% % %', p_a, p_b, p_c;
end;
$$;do $$                          
declare a1 int;a3 int;
begin a1 := 10;call p1(a1, 20, a3);raise notice 'a3: %', a3;
end;
$$;

进入exec_stmt_call时

  • a1:有值,value = 10,isnull = false,freeval = false

  • a3:无值,value = 0, isnull = true, freeval = false

(gdb) p *(PLpgSQL_var*)estate->datums[0]
$9 = {dtype = PLPGSQL_DTYPE_VAR, dno = 0, refname = 0x17107c0 "found", lineno = 0, isconst = false, notnull = false, default_val = 0x0, datatype = 0x17106b0,cursor_explicit_expr = 0x0, cursor_explicit_argrow = 0, cursor_options = 0,value = 0, isnull = false, freeval = false, promise = PLPGSQL_PROMISE_NONE}(gdb) p *(PLpgSQL_var*)estate->datums[1]
$10 = {dtype = PLPGSQL_DTYPE_VAR, dno = 1, refname = 0x1711518 "a1", lineno = 3, isconst = false, notnull = false, default_val = 0x0, datatype = 0x1711408,cursor_explicit_expr = 0x0, cursor_explicit_argrow = 0, cursor_options = 0, value = 10, isnull = false, freeval = false, promise = PLPGSQL_PROMISE_NONE}(gdb) p *(PLpgSQL_var*)estate->datums[2]
$11 = {dtype = PLPGSQL_DTYPE_VAR, dno = 2, refname = 0x1711e20 "a3", lineno = 4, isconst = false, notnull = false, default_val = 0x0, datatype = 0x1711d10,cursor_explicit_expr = 0x0, cursor_explicit_argrow = 0, cursor_options = 0, value = 0, isnull = true, freeval = false, promise = PLPGSQL_PROMISE_NONE}(gdb) p *expr
$13 = {query = 0x1712178 "call p1(a1, 20, a3)", parseMode = RAW_PARSE_DEFAULT, plan = 0x0, paramnos = 0x0, func = 0x0, ns = 0x1711e40, expr_simple_expr = 0x0,expr_simple_type = 0, expr_simple_typmod = 0, expr_simple_mutable = false, target_param = -1, expr_rw_param = 0x0, expr_simple_plansource = 0x0,expr_simple_plan = 0x0, expr_simple_plan_lxid = 0, expr_simple_state = 0x0, expr_simple_in_use = false, expr_simple_lxid = 0}

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.luyixian.cn/news_show_9843.aspx

如若内容造成侵权/违法违规/事实不符,请联系dt猫网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

第12章:动态内存【C++ Primer 中文版 第五版】阅读笔记 + 源码解析

动态内存12.1 动态内存与智能指针shared_ptr类对象的生存周期对象类型生存周期全局对象创建:程序启动时。 销毁:程序结束时。局部自动对象创建:进入其定义所在的程序块时。 销毁:离开其定义所在的程序块时。局部static对象创建&am…

软件设计师笔记-----系统安全分析与设计

五、系统安全分析与设计 5.1、信息系统安全属性 安全属性包括 保密性:最小授权原则、防暴露、信息加密、物理保密完整性:安全协议、校验码、密码验、数字签名、公证可用性:综合保障(IP过滤、业务流控制、路由选择控制、审计眼踪…

复习单片机:定时器/计数器部分(内含:1.51 单片机定时器原理 +2.51 单片机定时/计数器结构+3.定时器配置+4.代码部分+5.实验现象)

1.51 单片机定时器原理STC89C5X 单片机内有两个可编程的定时/计数器 T0、T1 和一个特殊功能定 时器 T2。定时/计数器的实质是加 1 计数器(16 位),由高 8 位和低 8 位两 2个寄存器 THx 和 TLx 组成。 它随着计数器的输入脉冲进行自加 1&#x…

初识kotlin(初用kotlin一时爽、一直用一直爽)

kotlin历程 2011年7月,JetBrains推出Kotlin项目,这是一个面向JVM的新语言2012年2月,JetBrains以Apache 2许可证开源此项目2016年2月15日,Kotlin v1.0发布。这被认为是第一个官方稳定版本,并且JetBrains已准备从该版本…

【云原生】zookeeper + kafka on k8s 环境部署

文章目录一、概述二、Zookeeper on k8s 部署1)添加源2)修改配置3)开始安装4)测试验证5)Prometheus监控6)卸载三、Kafka on k8s 部署1)添加源2)修改配置3)开始安装4&#…

pytorch线性代数的基本操作

线性代数的基本操作 标量由只有一个元素的张量表示 import torch xtorch.tensor([3.0]) ytorch.tensor([2.0]) xy,x*y,x/y,x**y向量视为标量值的组成 通过张量的索引来访问任一元素 xtorch.arange(4) x,x[3] #张量的长度 len(x) #张量的形状 x.shape对称矩阵 AAT Btorch.ten…

一文看懂线性回归(保姆级别 含源码)

来源: AINLPer 微信公众号(每日论文干货分享!!) 编辑: ShuYini 校稿: ShuYini 时间: 2022- 9 -18 引言 最近作者网上看了很多关于线性回归的帖子,个人感觉比较乱,所以打算自己整理一版,希望能把…

(41)STM32——外部SRAM实验笔记

目录 学习目标 成果展示 硬件知识 特点 功能框图 读时序 ​编辑写时序 FSMC驱动 寄存器 闪存片选控制寄存器 硬件 配置 代码 总结 学习目标 今天我们要学习的是有关外部SRAM实验,其实F4内部也是有一个19&#x…

本周大新闻|索尼PS VR2体验首次公开;Meta Quest Pro开箱视频曝光

本周大新闻,AR方面,沃尔玛App加入AR试穿功能;谷歌搜索AR新增60个行星、卫星模型;Niantic宣布与漫威娱乐合作打造新款LBS AR游戏;AR眼镜ActiveLook打通Apple Watch。 VR方面,索尼PS VR2体验首次公开&#x…

2022年笔试知识总结展望

应届生的笔试知识总结,温故而知新,看看知识加深印象,希望学得更好,有个好结果。 目录 1. TCP的拥塞控制 2. position属性 3. [‘1‘, ‘2‘, ‘3‘].map(parseInt) 输出结果 4. 排序算法的稳定性分析 1)稳定的排…

事件研究法与其应用(2)---Excel实操步骤

我们借着学习事件研究法的应用,可以用Excel和Stata等软件进行操作。 今天这主要是利用EXCEL计算累积异常收益率。 在正式开展实操之前,我们先回顾一下事件研究法的步骤(尤其是我们写作论文的时候): 事件研究法计算步骤: 1. 获取数据,定义事件期 2.计算估计期间个股与市…

npm yarn 报错

目录npm yarn报错yarn: 无法加载文件 npm yarn报错 yarn: 无法加载文件 win10系统,yarn : 无法加载文件 C:\Users\丽丽小可爱\AppData\Roaming\npm\yarn.ps1,因为在此系统上禁止运行脚本。有关详细信息,请参阅 ... 导致此错误的原因是,PowerShell 执行策略,默认设置为Rest…

JSON 数据类型转换工具

简介 本文介绍一款数据类型转换工具,可以将JSON格式数据转换成YAML、MYSQL、XML、TOML、JavaScript等数据类型。 背景 在日常的开发工程中,我们经常使用JSON表达数据,但有些时候我们需要使用YAML、JavaScript等语言表达数据。因此&#xf…

HTML + HTTP请求 +CSS知识点

文章目录HTML1.HTML元素2.HTML页面3.常见元素1)文本2)多媒体3)表单作用与语法常见表单项案例体验4.HTTP请求1)请求组成2) 请求方式与数据格式get 请求示例post 请求(默认格式)示例json 请求&…

Python必知必会 os 模块详解

文章目录Python os 模块os模块的常用操作os.path模块os.open()模块Python os 模块 os是“operating system”的缩写,os模块提供各种 Python 程序与操作系统进行交互的接口,使用os模块,一方面可以方便地与操作系统进行交互,另一方…

【SLAM】4李群李代数

文章目录4.1.基础群李代数的引出李代数李代数so(3)\mathfrak{so}(3)so(3)李代数se(3)\mathfrak{se}(3)se(3)4.2.指数与对数映射4.2.1.SO(3)SO(3)SO(3)指数映射4.2.2.SE(3)SE(3)SE(3)的指数映射4.3.李代数求导与扰动模型4.3.1.BCH公式&近似形式4.3.2.李代数求导4.3.4.扰动模…

redis下载与安装(Linux环境下)

用的是阿里云的深度os Linux系统 一,下载 键入命令: wget http://download.redis.io/releases/redis-6.2.1.tar.gz 检查时候有gcc环境 gcc --version 若有gcc环境会有类似于下图的提示 没有则执行: yum install gcc 下载完毕之后&…

JavaEE基础知识

文章目录前言计算机的基本组成CPUCPU运行程序的过程CPU的构造操作系统操作系统功能常见的操作系统操作系统的具体组成操作系统的进程管理(重点)操作系统安排程序进程PCB(进程管理块)进程调度关于进程的几个属性虚拟地址空间线程(thread [θred] )前言 之前已经学过很多的知识,…

企业薪资系统

开发工具(eclipse/idea/vscode等): 数据库(sqlite/mysql/sqlserver等): 功能模块(请用文字描述,至少200字):

PostgreSQL - 基于pg_basebackup实现主从流复制

PostgreSQL - 基于pg_basebackup实现主从流复制1 数据库节点2 安装PostgreSQL2.1 创建postgres用户2.2 安装PostgreSQL3 配置主节点4 配置从节点5 验证主从同步1 数据库节点 节点ip节点角色192.168.163.133主节点192.168.163.134从节点 2 安装PostgreSQL 2.1 创建postgres用户…