LightDB 23.3 plorasql 函数支持inout参数输出
开篇立意
oracle PLSQL函数中返回值有两种情况:
(1)使用return返回值;
(2)使用out修饰的参数(oracle不支持inout)
SQL> create function yu(id inout int) return int asbeginnull;return 12;end; 2 3 4 5 6 /Warning: Function created with compilation errors.SQL> show error function yu;
Errors for FUNCTION YU:LINE/COL ERROR
-------- -----------------------------------------------------------------
1/22 PLS-00103: Encountered the symbol "INT" when expecting one of thefollowing::= . ) , @ % default character
在一个函数中上述两种返回值的方法都可以使用在同一个函数中
create table nested_tab(id int, name varchar2(100), job varchar2(100), age int);insert into nested_tab values (2, 'sdfsd', 'cvxvx', 14);SQL> create or replace function nested_func(id1 out int, name1 out varchar2, job1 out varchar2, age1 out int)
return int asid2 int;name2 varchar2(100);job2 varchar2(100);age2 int;
beginselect * into id2, name2, job1, age1 from nested_tab where 2 3 4 5 6 7 8 age = 14;id1 := id2;name1 := name2;job1 := job2;age1 := age2;beginid1 := 45;name1 := 'name';job1 := 'job';age1 := 45;end;return 0;
end;
/ 9 10 11 12 13 14 15 16 17 18 19 20 21 Function created.SQL> create or replace function nested_func12(id1 out int, name1 out varchar2, job1 out varchar2, age1 out int)
return int asretcode int;
beginbeginretcode := nested_func(id1, name1, job1, age1);end;return 1;
end;
/ 2 3 4 5 6 7 8 9 10 Function created.SQL> declareid2 int;name2 varchar2(100);job2 varchar2(100);age2 int;retcode int;
beginbeginretcode := nested_func12(id2, name2, job2, age2);end;dbms_output.put_line(id2 || name2 || job2 || age2);
end;
/ 2 3 4 5 6 7 8 9 10 11 12 13
45namejob45PL/SQL procedure successfully completed.
问题就出现了,LightDB是不支持这两者混用的,而且要有返回值。则这个参数必须既是输入又是输出,即inout,不然这个值是不能作为参数出现在函数中的。
问题解决
从plorasql内核代码可以知道,匿名块中函数的返回值是不能返回到上层的。涉及到执行器状态的切换,会释放函数内出现的变量的值,就算不释放也找不到函数内的变量和函数外的变量的对应值。因此解决这个问题需要分两步:
(1)解决执行器切换值释放问题;
(2)函数内的变量与函数外值的对应关系。
测试
CREATE TABLE fusettfundaccount (branch_no numeric(10,0) NOT NULL DEFAULT 0,fund_account character varying(18) NOT NULL DEFAULT ' '::character varying,client_id character varying(18) NOT NULL DEFAULT ' '::character varying,client_name character varying(60) NOT NULL DEFAULT ' '::character varying,asset_prop character(1) NOT NULL DEFAULT ' '::bpchar,fundacct_status character(1) NOT NULL DEFAULT ' '::bpchar,remark character varying(2000) NOT NULL DEFAULT ' '::character varying,position_str character varying(100) NOT NULL DEFAULT ' '::character varying,client_group numeric(10,0) NOT NULL DEFAULT 0,room_code numeric(10,0) NOT NULL DEFAULT 0,organ_flag character(1) NOT NULL DEFAULT ' '::bpchar) ;CREATE UNIQUE INDEX idx_fusettfundacct ON fusettfundaccount USING btree (fund_account);CREATE INDEX IF NOT EXISTS idx_fusettfundacct_id ON fusettfundaccount USING btree (client_id);CREATE INDEX IF NOT EXISTS idx_fusettfundacct_pos ON fusettfundaccount USING btree (position_str);
insert into fusettfundaccount values (6666, '6661347', '6661347', 'F148', '9','0',' ', '06666000000000006661347', 666607, 666617,'0');
CREATE OR REPLACE FUNCTION ap_fusett_fundaccount_get(p_fund_account varchar2, INOUT p_branch_no numeric, INOUT p_client_id varchar2, INOUT p_client_name varchar2, INOUT p_asset_prop varchar2, INOUT p_remark varchar2, INOUT p_error_pathinfo varchar2, INOUT p_error_info varchar2, INOUT p_error_no numeric, INOUT p_error_id numeric, INOUT p_error_sysinfo varchar2)RETURNS numericLANGUAGE plorasql
AS $function$
v_error_pathinfo_tmp varchar2(100); beginp_branch_no := 0;
p_client_id := ' ';
p_client_name := ' ';
p_asset_prop := ' ';
p_remark := ' ';
p_error_info := ' ';
p_error_no := 0;
p_error_id := 0;
p_error_sysinfo := ' ';p_error_pathinfo := substr(p_error_pathinfo || '-->AP_FUSETT_FUNDACCOUNT_GET',1,500);
v_error_pathinfo_tmp := p_error_pathinfo;beginselect/*AP_FUSETT_FUNDACCOUNT_GET*/ branch_no, client_id, client_name, asset_prop,
remarkinto p_branch_no, p_client_id, p_client_name, p_asset_prop, p_remarkfrom fusettfundaccountwhere fund_account = p_fund_account;exceptionwhen others thenp_error_no := 318100;p_error_info := substrb('p_fund_account='||p_fund_account||']', 1, 500);p_error_id := SQLCODE;p_error_sysinfo := substr(SQLERRM,1,500);return (p_error_no);end;
return(0);
exceptionwhen others thenp_error_no := 101;p_error_info :='ִAP_FUSETT_FUNDACCOUNT_GET';p_error_id := SQLCODE;p_error_sysinfo := SQLERRM;return(p_error_no);
end AP_FUSETT_FUNDACCOUNT_GET$function$;
DO $$BEGINbegin$1 := AP_FUSETT_FUNDACCOUNT_GET ($2,$3,$4,$5,$6,$7,$8 ,$9,$10,$11,$12);end;if ($1 = 0) then$8 := $13;end if;END;$$ (INT, CHAR, INT, char, char, char, char, char, char, INT, INT, varchar, char) using (0, 6661347, 0, null,null, 0, null, NULL, null, 0, 0, null,null) Language plorasql;column1 | column2 | column3 | column4 | column5 | column6 | column7 | column8 | column9 | column10 | column11 | column12 | column13
---------+---------+---------+---------+---------+---------+---------+---------+---------+----------+----------+----------+----------0 | 6661347 | 6666 | 6661347 | F148 | 9 | | | | 0 | 0 | |
(1 row)
总结
在lightdb中,使用该功能需要注意:(1)函数用inout修饰需要返回的变量;(2)如果匿名块需要函数返回值时,使用inout修饰参数,return返回值必须要有具体的返回值,不然返回的就是一个record。
相关文章:
LightDB 23.3 plorasql 函数支持inout参数输出
开篇立意 oracle PLSQL函数中返回值有两种情况: (1)使用return返回值; (2)使用out修饰的参数(oracle不支持inout) SQL> create function yu(id inout int) return int asbeginn…...
SpringBoot第41讲:SpringBoot集成Redis - 基于RedisTemplate+Jedis的数据操作
SpringBoot第41讲:SpringBoot集成Redis - 基于RedisTemplate+Jedis的数据操作 Redis是最常用的KV数据库,Spring 通过模板方式(RedisTemplate)提供了对Redis的数据查询和操作功能。本文是SpringBoot第41讲,主要介绍基于RedisTemplate + Jedis方式对Redis进行查询和操作的案…...
用 React+ts 实现无缝滚动的走马灯
一、走马灯的作用 走马灯是一种常见的网页交互组件,可以展示多张图片或者内容,通过自动播放或者手动切换的方式,让用户能够方便地浏览多张图片或者内容。 本次实现的不是轮播图而是像传送带一样的无限滚动的形式。 二、需求梳理 走马灯可设…...
三维模型OSGB格式轻量化重难点分析
三维模型OSGB格式轻量化重难点分析 在三维模型应用中,为了适应移动设备的硬件和网络限制等问题,OSGB格式轻量化处理已经成为一个重要的技术手段。但是,在实际应用中,OSGB格式轻量化仍然存在着一些重难点问题。下面将对这些问题进行…...
C#__事件event的简单使用:工具人下楼问题
// 工具人类 namespace DownStair {delegate void DownStairDelegate(); // 定义了一个下楼委托class ToolMan{public string Name { get; set; } // 声明工具人的名字属性// public DownStairDelegate downStairDelegate null; // 初始化委托downStair为空委托// 解决方案pu…...
初识Spring-ioc
初识Spring-ioc 1. Spring的简介2.Spring容器ioc的特点3.spring注入方式1.Setter方法注入(Setter Injection):通过Setter方法来注入依赖。在类中定义对应的Setter方法,并在方法中接收依赖的参数,Spring容器会通过调用S…...
windows10 安装WSL2, Ubuntu,docker
AI- 通过docker开发调试部署ChatLLM 阅读时长:10分钟 本文内容: window上安装ubuntu虚拟机,并在虚拟机中安装docker,通过docker部署数字人模型,通过vscode链接到虚拟机进行开发调试.调试完成后,直接部署在云…...
Java面试题目汇总
一、面向对象的三个基本特征 2、方法重载和方法重写的概念和区别 3、接口和内部类、抽象类的特性 4、文件读写的基本类 **5、串行化的注意事项以及如何实现串行化 6、线程的基本概念、线程的基本状态以及状态之间的关系 7、线程的同步、如何实现线程的同步 8、几种常用的数据结…...
【ARM 嵌入式 编译系列 6 -- GCC objcopy, objdump, readelf, nm 介绍】
文章目录 GCC objcopy 简介objcopy 常用参数GCC objdump 简介GCC readelf 介绍GCC nm 介绍上篇文章:ARM 嵌入式 编译系列 5 – GCC 内建函数 __builtin 详细介绍 下篇文章:ARM 嵌入式 编译系列 7 – ARM GCC 链接脚本详细讲解 GCC objcopy 简介 objcopy 是 GNU二进制工具集(…...
c语言每日一练(9)
前言:每日一练系列,每一期都包含5道选择题,2道编程题,博主会尽可能详细地进行讲解,令初学者也能听的清晰。每日一练系列会持续更新,暑假时三天之内必有一更,到了开学之后,将看学业情…...
毫米波射频方案分析
豪米波被誉为能够带来令人难以置信的网络吞吐量数据,但迄今为止它的采用一直乏善可陈。 毫米波技术的领导者高通公司认为,他们拥有高达60亿美元的前端机会。这 60亿美元将需要在日本、中国、韩国、欧洲和印度广泛采用 mmWave。尽管有这个巨大的机会&am…...
神经网络基础-神经网络补充概念-04-梯度下降法
概念 梯度下降法是一种常用的优化算法,用于在机器学习和深度学习中更新模型参数以最小化损失函数。它通过迭代地调整参数,沿着损失函数的负梯度方向移动,从而逐步逼近损失函数的最小值。 基本思想 梯度下降法的基本思想是:在每…...
神经网络基础-神经网络补充概念-45-指数加权平均
概念 指数加权平均(Exponential Moving Average,EMA)是一种平均方法,用于平滑时间序列数据或者计算变量的滚动均值。它对数据的权重分布呈指数递减,越靠近当前时刻的数据权重越高,越远离当前时刻的数据权重…...
模型预测笔记(一):数据清洗及可视化、模型搭建、模型训练和预测代码一体化和对应结果展示(可作为baseline)
模型预测 一、导入关键包二、如何载入、分析和保存文件三、修改缺失值3.1 众数3.2 平均值3.3 中位数3.4 0填充 四、修改异常值4.1 删除4.2 替换 五、数据绘图分析5.1 饼状图5.1.1 绘制某一特征的数值情况(二分类) 5.2 柱状图5.2.1 单特征与目标特征之间的…...
【Pytroch】基于K邻近算法的数据分类预测(Excel可直接替换数据)
【Pytroch】基于K邻近算法的数据分类预测(Excel可直接替换数据) 1.模型原理2.数学公式3.文件结构4.Excel数据5.下载地址6.完整代码7.运行结果1.模型原理 K最近邻(K-Nearest Neighbors,简称KNN)是一种简单但常用的机器学习算法,用于分类和回归问题。它的核心思想是基于已…...
Centos 7 通过Docker 安装MySQL 8.0.33实现数据持久化及my.cnf配置
要在 CentOS 7 上使用 Docker 启动 MySQL 8.0.33,并配置 MySQL 的 my.cnf 文件,同时实现 MySQL 数据的持久化,可以按照以下步骤进行操作: 1、安装 Docker:确保你在 CentOS 7 上已经安装了 Docker。如果尚未安装&#…...
自夹持P型屏蔽型碳化硅沟槽型绝缘栅双极晶体管,用于低开通电压和开关损耗
目录 标题:Self-Clamped P-shield SiC Trench IGBT for Low On-State Voltage and Switching LossProceedings of the 35st International Symposium on Power Semiconductor Devices & ICs摘要信息解释研究了什么文章的创新点文章的研究方法文章的结论 标题&am…...
【数据结构与算法——TypeScript】树结构Tree
【数据结构与算法——TypeScript】 树结构(Tree) 认识树结构以及特性 什么是树? 🌲 真实的树:相信每个人对现实生活中的树都会非常熟悉 🌲 我们来看一下树有什么特点? ▫️ 树通常有一个根。连接着根的是树干。 ▫️ 树干到…...
多维时序 | MATLAB实现PSO-CNN-BiGRU多变量时间序列预测
多维时序 | MATLAB实现PSO-CNN-BiGRU多变量时间序列预测 目录 多维时序 | MATLAB实现PSO-CNN-BiGRU多变量时间序列预测预测效果基本介绍模型描述程序设计参考资料 预测效果 基本介绍 1.多维时序 | MATLAB实现PSO-CNN-BiGRU多变量时间序列预测; 2.运行环境为Matlab20…...
Shell 编程基础01
0:目录 1.创建新的虚拟机项目 2.linux常见命令和配置时间同步器 3.文件属性 4.if for while和方法 1.创建新的虚拟机项目 默认下一步到虚拟机命名 默认下一步设置磁盘大小 自定义硬件 删除打印机设置映像地址 启动虚拟机 选择 install centOS 7 选择英文 设置时…...
AI Agent与Agentic AI:原理、应用、挑战与未来展望
文章目录 一、引言二、AI Agent与Agentic AI的兴起2.1 技术契机与生态成熟2.2 Agent的定义与特征2.3 Agent的发展历程 三、AI Agent的核心技术栈解密3.1 感知模块代码示例:使用Python和OpenCV进行图像识别 3.2 认知与决策模块代码示例:使用OpenAI GPT-3进…...
LeetCode - 394. 字符串解码
题目 394. 字符串解码 - 力扣(LeetCode) 思路 使用两个栈:一个存储重复次数,一个存储字符串 遍历输入字符串: 数字处理:遇到数字时,累积计算重复次数左括号处理:保存当前状态&a…...
多模态商品数据接口:融合图像、语音与文字的下一代商品详情体验
一、多模态商品数据接口的技术架构 (一)多模态数据融合引擎 跨模态语义对齐 通过Transformer架构实现图像、语音、文字的语义关联。例如,当用户上传一张“蓝色连衣裙”的图片时,接口可自动提取图像中的颜色(RGB值&…...
质量体系的重要
质量体系是为确保产品、服务或过程质量满足规定要求,由相互关联的要素构成的有机整体。其核心内容可归纳为以下五个方面: 🏛️ 一、组织架构与职责 质量体系明确组织内各部门、岗位的职责与权限,形成层级清晰的管理网络…...
令牌桶 滑动窗口->限流 分布式信号量->限并发的原理 lua脚本分析介绍
文章目录 前言限流限制并发的实际理解限流令牌桶代码实现结果分析令牌桶lua的模拟实现原理总结: 滑动窗口代码实现结果分析lua脚本原理解析 限并发分布式信号量代码实现结果分析lua脚本实现原理 双注解去实现限流 并发结果分析: 实际业务去理解体会统一注…...
(转)什么是DockerCompose?它有什么作用?
一、什么是DockerCompose? DockerCompose可以基于Compose文件帮我们快速的部署分布式应用,而无需手动一个个创建和运行容器。 Compose文件是一个文本文件,通过指令定义集群中的每个容器如何运行。 DockerCompose就是把DockerFile转换成指令去运行。 …...
vue3+vite项目中使用.env文件环境变量方法
vue3vite项目中使用.env文件环境变量方法 .env文件作用命名规则常用的配置项示例使用方法注意事项在vite.config.js文件中读取环境变量方法 .env文件作用 .env 文件用于定义环境变量,这些变量可以在项目中通过 import.meta.env 进行访问。Vite 会自动加载这些环境变…...
【HarmonyOS 5 开发速记】如何获取用户信息(头像/昵称/手机号)
1.获取 authorizationCode: 2.利用 authorizationCode 获取 accessToken:文档中心 3.获取手机:文档中心 4.获取昵称头像:文档中心 首先创建 request 若要获取手机号,scope必填 phone,permissions 必填 …...
return this;返回的是谁
一个审批系统的示例来演示责任链模式的实现。假设公司需要处理不同金额的采购申请,不同级别的经理有不同的审批权限: // 抽象处理者:审批者 abstract class Approver {protected Approver successor; // 下一个处理者// 设置下一个处理者pub…...
MySQL:分区的基本使用
目录 一、什么是分区二、有什么作用三、分类四、创建分区五、删除分区 一、什么是分区 MySQL 分区(Partitioning)是一种将单张表的数据逻辑上拆分成多个物理部分的技术。这些物理部分(分区)可以独立存储、管理和优化,…...
