首页 运维知识 关于oracle 存储过程 调用动态sql

关于oracle 存储过程 调用动态sql

oracle 存储过程 调用动态sql CreationTime–2018年8月16日11点25分 Author:Marydon 1.错误实现方式 –开始时间拼接\’…

oracle 存储过程 调用动态sql

CreationTime–2018年8月16日11点25分

Author:Marydon

1.错误实现方式

--开始时间拼接\' 00:00:00\'
  V_SQL := \'select decode(length(\' || V_END || \'),10,\' || \'concat(\' || V_END || \', 00:00:00),\' || V_END || \') from dual\';
  EXECUTE IMMEDIATE V_SQL;

编译成功,但是存储过程调用失败。
关于oracle 存储过程 调用动态sql插图

2.原因分析

在oracl数据库中,ddl表示数据库定义语言,即我们平常使用的sql语句,声明的sql语句可以直接使用拼接字符串进行拼接;

dml表示数据操纵语言,声明的sql语句不能再用管道符||来动态拼接变量。

3.正确实现方式

execute immediate属于dml,dml使用sql的规则如下:

声明sql语句

字符串拼接变量时,变量要使用占位符来代替,格式为 “:” + “名字”,名字随意

调用sql语句

使用”using”来传递变量,代替占位符,格式为 “using var1,var2,…”

V_SQL := \'select decode(length(:v1),10,:v2,:v3) from dual\';
EXECUTE IMMEDIATE V_SQL INTO V_START USING V_START,V_START || \' 00:00:00\',V_START;

结果展示:
关于oracle 存储过程 调用动态sql插图1

4.测试

入参
关于oracle 存储过程 调用动态sql插图2
出参
关于oracle 存储过程 调用动态sql插图3

5.最简单的方式

--结束时间拼接\' 00:00:00\'
SELECT DECODE(LENGTH(V_END), 10, V_END || \' 00:00:00\', V_END) INTO V_END FROM DUAL;

20200612

6.另外一种方式

第一种字符串拼接的方式其实也是可以执行的,只不过需要借助游标来实现,这里张贴部分代码

  --业务执行
  OPEN OUT_CURSOR FOR \'SELECT TO_CHAR(TO_DATE(\' || STARTTIME || \', \'\'YYYY-MM-DD\'\') + ROWNUM - 1,
                            \'\'YYYY-MM-DD\'\') AS REGDATE
               FROM DUAL
             CONNECT BY ROWNUM <=
                        TRUNC(TO_DATE(\' || ENDTIME || \', \'\'YYYY-MM-DD\'\') -
                              TO_DATE(\' || STARTTIME || \', \'\'YYYY-MM-DD\'\')) + 1\';

游标后面可以直接拼接SQL字符串,并将其当做SQL来执行(这是在存储过程调用的)
关于oracle 存储过程 调用动态sql插图4
结果如下
关于oracle 存储过程 调用动态sql插图5
另外对于单引号的转义,两个紧挨的单引号\’\’,就表示一个转义过的单引号\’

免责声明:文章内容不代表本站立场,本站不对其内容的真实性、完整性、准确性给予任何担保、暗示和承诺,仅供读者参考,文章版权归原作者所有。如本文内容影响到您的合法权益(内容、图片等),请及时联系本站,我们会及时删除处理。

作者: 小小编

为您推荐

dell R710 更换raid卡后,raid卡信息没有了,处理方案

dell R710 更换raid卡后,raid卡信息没有了,处理方案

1.将一台服务器(A)的硬盘依次拔出,按相同顺序插入另一台同样配置的服务器(B) 2.启动服务器(B) 3.按提示键盘按...
PL SQL Developer 13连接Oracle数据库并导出数据详细操作教程方法

PL SQL Developer 13连接Oracle数据库并导出数据详细操作教程方法

下载 并安装 PL SQL Developer 13,默认支持中文语言 ========================...
关于一条sql语句在mysql中是如何执行的

关于一条sql语句在mysql中是如何执行的

最近开始在学习mysql相关知识,自己根据学到的知识点,根据自己的理解整理分享出来,本篇文章会分析下一个sql语句在my...
关于sql注入姿势总结(mysql)

关于sql注入姿势总结(mysql)

前言 学习了sql注入很长时间,但是仍然没有系统的了解过,这次总结一波,用作学习的资料。 从注入方法分:基于报错、基于布...
关于Oracle SQL外连接

关于Oracle SQL外连接

SQL提供了多种类型的连接方式,它们之间的区别在于:从相互交叠的不同数据集合中选择用于连接的行时所采用的方法不同。 连接...

发表回复

返回顶部