Oracle存储过程实现执行动态SQL

news/2024/7/5 1:47:57

Oracle存储过程中执行动态SQL

最近在工作中使用到了存储过程,要用存储过程执行动态的SQL,于是便有了这篇文章。

思考

既然是动态的SQL,最好有个table用来存储这些动态SQL,Oracle中这么多数据类型该选择哪种呢?首先想到的肯定是 varchar2 ,但其实这个数据类型有4000字节的最大长度限制,当动态SQL超过这个字节时是没法存储的,这里推荐使用 clob ,这个数据类型可以存储最大4G的数据,另外其实还有一个原因,这里留个悬念。OK,动手。

建表

动态SQL的数据类型选择好了,字段也很简单:表名、动态SQL、是否使用标记,SQL如下:

create table t_dim_dynamic_sql_st(
    table_name     varchar2(100),
    dynamic_sql    clob,
    use_flag       integer
);
comment on table t_dim_dynamic_sql_st is '维表_动态SQL存储_静态表';
comment on column t_dim_dynamic_sql_st.table_name is '表名';
comment on column t_dim_dynamic_sql_st.dynamic_sql is '动态SQL';
comment on column t_dim_dynamic_sql_st.use_flag is '是否使用标记';

然后建个测试表,并在动态SQL存储维表中写入一条数据。

create table t_test(
    test_column   varchar2(50)
);
comment on table t_test is '表_测试表';
comment on column t_test.test_column is '测试字段';

--动态SQL维表写入数据
insert into t_dim_dynamic_sql_st
select 
't_test' as table_name,
'insert into t_test select ''test_data'' from dual' as dynamic_sql,
1 from dual;

动态SQL执行存储过程

准备工作结束,开始写存储过程。这边已经构建了动态SQL存储维表,那么存储过程最好是可以输入表名,所以得有表名参数。然后这里说明一下,之前将动态SQL的数据类型选择为 clob 是因为存储过程中执行动态SQL得用到关键字 execute ,这个对数据类型是有限制的,比如同样可以存储4G的 long 就无法被执行。存储过程如下:

create or replace procedure p_exec_dynamic_sql(in_table_name varchar2,
                                              in_data varchar2)
is
v_sql clob;
begin

--查询动态SQL
select dynamic_sql into v_sql
from t_dim_dynamic_sql_st
where upper(table_name)=upper(in_table_name) and use_flag=1;

--替换数据
v_sql:=replace(v_sql,'test_data',in_data);

--执行,这里使用exception做了异常捕获,避免SQL执行报错,在维表中添加SQL,最好先自测下动态SQL是否可以正常运行。
begin
    execute immediate v_sql;
    commit;
exception
    when others then null;
end;

end;

测试

调用存储过程测试

call p_exec_dynamic_sql(‘t_test’,‘just for test1.’);

之后成功在测试表中找到这条数据。完结。

最后

但是其实,这里还有遗漏一个问题,那就是存储过程中使用了 replace 函数,这个函数对字符长度也有限制,具体限制请自行百度,应该可以找到相关方法。


http://lihuaxi.xjx100.cn/news/1463747.html

相关文章

Android11 中 LED 使用-RK3568

文章目录 前言原理图设备树驱动前言 现在我们来学习点亮LED 原理图 然后对应在核心板原理图上查找 Working_LEDEN_H_GPIO0_B7,如下图所示: 那么我们只要控制 GPIO0_B7 即可控制 led 的亮灭。 设备树 leds: leds {compatible = "gpio-leds";work_led: work {gpi…

【Linux系统编程项目】实现部分FTP功能

项目功能 服务器相关 1.获取服务器文件,get xxx 2.展示服务器有哪些文件 ,ls 3.进入服务器文件夹 cd 4.上传文件到服务器 客户端相关 lls查看客户端本地文件 lcd 进入客户端xx文件夹 lpwd 查看客户端当前目录 项目代码 客户端代码(代码…

Android内存泄露

在Android中,内存泄漏的现象十分常见;而内存泄漏导致的后果会使得应用crash 定义:Memory Leak 指程序在申请内存后,当该内存不需要再使用但却无法被释放&归还给程序得现象。 内存回收策略 步骤1:Application Fram…

如何在window下cmd窗口执行linux指令?

1.Git:https://git-scm.com/downloads(官网地址) 2.根据自己的实际路径,添加两个环境变量 3.重启电脑

【python基本数据类型的时间复杂度】

时间复杂度 python基本数据类型的时间复杂度 python基本数据类型的时间复杂度 参考网站https://wiki.python.org/moin/TimeComplexity

LeetCode 88. Merge Sorted Array【数组,双指针】简单

本文属于「征服LeetCode」系列文章之一,这一系列正式开始于2021/08/12。由于LeetCode上部分题目有锁,本系列将至少持续到刷完所有无锁题之日为止;由于LeetCode还在不断地创建新题,本系列的终止日期可能是永远。在这一系列刷题文章…

【LLM评估篇】Ceval | rouge | MMLU等指标

note 一些大模型的评估模型:多轮:MTBench关注评估:agent bench长文本评估:longbench,longeval工具调用评估:toolbench安全评估:cvalue,safetyprompt等 文章目录 note常见评测benchm…

【排序】选择排序

文章目录 选择排序时间复杂度空间复杂度稳定性 代码 选择排序 以从小到大为例进行说明。 选择排序就是定义出一个最小值下标,然后遍历整个剩下的数组选择出最小的放进最小值下标的位置。 时间复杂度 O(N) 遍历一次即可 空间复杂度 O(1) 稳定性 不稳定 代码 p…