当前位置: 首页 > news >正文

Oracle的PLSQL中动态执行函数

背景

某个PLSQL的函数中,通过 if-elsif 控制执行分支,代码行数巨大,影响更新、编译和维护。

解决方法

希望通过策略模式,依据策略类型,动态执行函数。
注:策略模式,集中定义,遍历执行,与一般的策略模式没有区别,略述。

动态执行方法

方法1:使用动态sql+bind变量

关键点:

  1. 返回值使用集合类型;
  2. 返回值用select into ;
  3. 参数使用bind。

--  使用动态sql+bind变量--    **[可行1]**/*    dbms_output.put_line(chr(10)||'--3、使用动态sql+bind变量');execute immediate 'select ' || vs_fun_name ||'(:I_TABLENAME,:I_WHERESQL )  from dual'into  vt_return_result              using I_TABLENAME, I_WHERESQL ;dbms_output.put_line('3.1、使用动态sql+bind变量: 执行ok');dbms_output.put_line('executor.vn_result:' || vt_return_result.o_id || '  ' ||vt_return_result.o_msg);*/

方法2:使用动态代码块+bind变量

关键点:

  1. 动态sql是代码块;
  2. 使用绑定,支持入参、出参、返回值等3种类型,【扩展性更好】 ;
    dbms_output.put_line('5.1、使用动态sql-代码块+bind out 变量');vs_sql_execute := 'begin' || '  :result:=' || vs_fun_name ||'(:input1,:input2,:msg); ' || 'end;';execute immediate vs_sql_executeusing out vn_result, in I_TABLENAME, in I_WHERESQL, out vs_RETURN_MSG;dbms_output.put_line('5.2、使用动态sql-代码块+bind out 变量: ok');dbms_output.put_line('executor.vn_result:' || vn_result || '  ' ||vs_RETURN_MSG);

不可行的方法

法1:出参函数无法直接调用

直接使用出参变量名【O_RETURN_MSG】,无法识别变量

vs_sql_execute := 'declare O_RETURN_MSG varchar2(30000); vn_result    number := 0;begin vn_result := ';vs_sql_execute := vs_sql_execute || vs_fun_name;vs_sql_execute := vs_sql_execute || '(''' || ''',' || I_WHERESQL || ',' ||'O_RETURN_MSG); dbms_output.put_line(''executor.O_RETURN_MSG:'' || O_RETURN_MSG);' ||'dbms_output.put_line(''executor.vn_result:'' || vn_result);end;';execute immediate    vs_sql_execute    */--vs_sql_execute:='select '||vs_fun_name||'('''||I_TABLENAME||''','''||I_WHERESQL||''','||'O_RETURN_MSG) from dual';-- 使用execute immediate --     **[直接使用变量名,无法识别变量]

法2:使用动态sql+bind out 变量

注意:sql中无法绑定out变量。

    --  使用动态sql+bind out 变量                      /*    dbms_output.put_line(chr(10) || '--4、使用动态sql+bind out 变量 ');execute immediate 'select ' || vs_fun_name ||'(:I_TABLENAME,:I_WHERESQL,:out_msg )  from dual'--into vn_resultusing I_TABLENAME, I_WHERESQL,out vs_RETURN_MSG;dbms_output.put_line('4.1、使用动态sql+bind out 变量: 执行ok');dbms_output.put_line('executor.vn_result:' || vn_result || '  ' ||vs_RETURN_MSG);*/

相关文章:

  • Ubuntu中C++项目安装二次规划库——qpOASES 库
  • 基于STM32、HAL库的DS2411R安全验证及加密芯片驱动程序设计
  • HarmonyOS NEXT 诗词元服务项目开发上架全流程实战(一、项目介绍及实现效果展示)
  • 蓝桥杯Python组高频考点与解题策略
  • Axios 传参与 Spring Boot 接收参数完全指南
  • Visual Studio 技能:调整软件界面布局
  • SoapUi测试1——REST(WebAPi、Json协议/HTTP、Post通讯方式)接口测试
  • C语言基础—(函数,指针与形参实参,字符串与指针,结构体)
  • 在另外一台可以科学下载的电脑用ollama下载模型后,怎么导入到另外一台服务器的ollama使用
  • (一)Linux的历史与环境搭建
  • 云原生--核心组件-容器篇-6-Docker核心之-镜像仓库(公共仓库,私有仓库,第三方仓库)
  • 香橙派打包qt文件报错“xcb 插件无法加载”与“QObject::moveToThread”线程错误的解决方案
  • 2.2.1goweb内置的 HTTP 处理程序
  • uniapp做app,使用v-for遍历渲染第二层的时候,打包到手机上渲染不出第二层的数据
  • 5G与边缘计算:协同发展,开启智慧世界新篇章
  • (云计算HCIP)HCIP全笔记(十三)本篇介绍虚拟化技术,内容包含:虚拟化资源、虚拟化过程、I/O虚拟化、虚拟化架构KVM和Xen介绍、主流虚拟化技术介绍
  • 终端管理系统如何助力企业简化IT管理?
  • stm32wb55rg (2) 阅读资料手册
  • 近地卫星网络 (Low Earth Orbit Satellite Networks)入门学习笔记
  • C++23 std::bind_back:一种调用包装器 (P2387R3)
  • 买新房可申领学位,广州南沙出台购房入学政策
  • 10台核电新机组获核准,上海核电厂商独揽超500亿元订单
  • 外交部:对伊朗拉贾伊港口爆炸事件遇难者表示深切哀悼
  • 外交部回应涉长江和记出售巴拿马运河港口交易:望有关各方审慎行事,充分沟通
  • 广州一人均500元的日料店回收食材给下一桌?市场监管部门介入调查
  • 四川甘孜州白玉县发生4.9级地震,震源深度10千米