execute immediate,存储过程中使用 execute immediate 报无效sql 但sql打印出来可以单独执行?
execute immediate,存储过程中使用 execute immediate 报无效sql 但sql打印出来可以单独执行?详细介绍
本文目录一览: 存储过程中使用execute immediate时,报缺少关键字的错误
v_sql 语句被设定为:
```sql
v_sql := 'SELECT TO_NUMBER(COUNT(*))
FROM tb_web_ticket
WHERE t.fromStationId = ' || iv_fromStation || '
AND t.returnDate BETWEEN TO_DATE(''' || iv_beginDate || ''',''YYYY-MM-DD'')
AND TO_DATE(''' || iv_endDate || ''',''YYYY-MM-DD'')';
```
之后,使用`EXECUTE IMMEDIATE`命令执行这条SQL语句并将结果存入ov_totalRecords变量中。
关于`andt.returndatebetweendate...`这部分的错误语法,正确的拼接方式应该是:
... BETWEEN TO_DATE(v_iv_beginDate, 'YYYY-MM-DD') AND TO_DATE(v_iv_endDate, 'YYYY-MM-DD')
完整的语句应该是这样的:
v_sql := ... [其他部分] ...
AND t.returnDate BETWEEN TO_DATE(v_iv_beginDate, 'yyyy-mm-dd')
AND TO_DATE(v_iv_endDate, 'yyyy-mm-dd');
EXECUTE IMMEDIATE v_sql INTO ov_totalRecords;
在这个修改后的版本中,`v_iv_beginDate` 和 `v_iv_endDate` 这两个变量被直接用于 `TO_DATE` 函数中,这样就能正确地将日期字符串转换为Oracle数据库可以识别的日期格式。同时,所有的SQL关键字和函数都保持了正确的格式和大小写。
存储过程中使用 execute immediate 报无效sql 但sql打印出来可以单独执行?
在执行这条语句 `executeimmediate'DELETE from'||LO_DEL||''` 时,from 关键字后面确实应该加一个空格,以符合 SQL 语句的语法规范。同时,LO_DEL 是用 varchar2 类型定义的变量,确保其值正确无误。
根据你的描述,我推测你可能没有指定数据库的名称。在执行数据库操作时,如果函数没有在对应的数据库下执行,可能会导致执行不正确。你可以尝试使用 `dataname.dbo.tablename` 的形式来指定数据库和表名。
关于你提到的 executeimmediate 语句,从和单引号之间确实需要有一个空格。另外,如果你已经将 SQL 语句赋值给了 LO_SQL 变量,那么直接执行 `executeimmediate LO_SQL` 就可以了。这样就能避免因为空格等小错误而导致的执行问题。
总结一下,为了确保语句的正确执行,你应该注意以下几点:
1. from 关键字后加空格。
2. 确保 LO_DEL 变量的值正确无误。
3. 如果需要指定数据库和表名,使用正确的语法形式。
4. 直接执行已赋值的 LO_SQL 变量,无需再拼接字符串。
希望这些建议能帮助你解决问题。