相关文章推荐
任性的消炎药  ·  JPA ...·  1 月前    · 
豪情万千的铁板烧  ·  Standard error when ...·  1 年前    · 
帅气的葡萄  ·  html - Uncaught ...·  2 年前    · 
闯红灯的八宝粥  ·  basic_ifstream 类 | ...·  2 年前    · 
踏实的洋葱  ·  Assembly.GetType ...·  2 年前    · 
--开始时间拼接' 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;  

结果展示:

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来执行(这是在存储过程调用的)

另外对于单引号的转义,两个紧挨的单引号'',就表示一个转义过的单引号'

哪位大佬如若发现文章存在纰漏之处或需要补充更多内容,欢迎留言!!!

相关推荐:

  • exception PLS-00403: expression 'V_END' cannot be used as an INTO-target of a SELECT/FETCH statement
  • oracle for循环示例(for in loop)
  •