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;
编译成功,但是存储过程调用失败。
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;
结果展示:
4.测试
入参
出参
5.最简单的方式
--结束时间拼接‘ 00:00:00‘ SELECT DECODE(LENGTH(V_END), 10, V_END || ‘ 00:00:00‘, V_END) INTO V_END FROM DUAL;
相关推荐:
- exception PLS-00403: expression ‘V_END‘ cannot be used as an INTO-target of a SELECT/FETCH statement
原文地址:https://www.cnblogs.com/Marydon20170307/p/9486324.html
时间: 2024-11-06 05:49:21