--开始时间拼接' 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;
编译成功,可是存储过程调用失败。html
在oracl数据库中,ddl表示数据库定义语言,即咱们日常使用的sql语句,声明的sql语句能够直接使用拼接字符串进行拼接;sql
dml表示数据操纵语言,声明的sql语句不能再用管道符||来动态拼接变量。 数据库
execute immediate属于dml,dml使用sql的规则以下:express
声明sql语句oracle
字符串拼接变量时,变量要使用占位符来代替,格式为 ":" + "名字",名字随意测试
调用sql语句3d
使用"using"来传递变量,代替占位符,格式为 "using var1,var2,..."code
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;
结果展现:htm
入参blog
出参
--结束时间拼接' 00:00:00' SELECT DECODE(LENGTH(V_END), 10, V_END || ' 00:00:00', V_END) INTO V_END FROM DUAL;
20200612
第一种字符串拼接的方式其实也是能够执行的,只不过须要借助游标来实现,这里张贴部分代码
--业务执行 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来执行(这是在存储过程调用的)
结果以下
另外对于单引号的转义,两个紧挨的单引号'',就表示一个转义过的单引号'