Oracle SQL中$$(双美元符号)的含义及SQLPlus专属特性咨询
问题描述
这段PL/SQL包创建代码可在SQLPlus命令行无错误执行:
create or replace package PACKAGE2 as $if $$install_ad_zd_sys $then procedure LOG( X_MODULE varchar2, X_LEVEL varchar2, X_MESSAGE varchar2); function LITERAL(X_VALUE varchar2) return varchar2; else procedure LOG_VER; $end end; /
咨询以下问题:
- 代码中的
$$(双美元符号)是什么含义? - 它是否为SQLPlus专属关键字?
另外,使用Java JDBC执行整个代码块时出现「Invalid column index」错误,JDBC执行代码如下:
plSqlstatement = connection.prepareCall(sqlBuffer.toString()); //sqlBuffer contains the whole create package block //like sqlBuffer.append("CREATE OR REPLACE //PACKAGE ....").append("/n").append(..next Line) and so on.
解答
$$的含义$$install_ad_zd_sys里的$$是SQLPlus用来标记用户自定义替换变量的前缀,$$install_ad_zd_sys本身是一个SQLPlus变量。而$if ... $then ... $else ... $end是SQLPlus的条件预编译指令,SQLPlus会根据install_ad_zd_sys变量的取值,决定编译哪一段PL/SQL代码逻辑。是否为SQLPlus专属
是的,这套条件语法($if/$then/$else/$end)以及带$$的变量都是SQLPlus独有的预编译特性,Oracle数据库内核和JDBC驱动都不识别这些语法。JDBC报错原因及解决办法
JDBC执行时会把$符号误识别为绑定变量占位符(JDBC标准用?作为占位符,但部分驱动会错误解析$),进而尝试寻找对应索引的绑定变量,最终抛出「Invalid column index」错误。
解决方式有两种:
- 先通过SQLPlus执行这段代码完成包的创建,之后JDBC直接调用包中的存储过程或函数即可。
- 手动移除SQLPlus的条件逻辑,根据实际需求保留对应的
procedure/function定义,删除所有$if/$then/$else/$end和$$相关内容,再用JDBC执行修改后的纯PL/SQL代码。
内容的提问来源于stack exchange,提问作者pramodshetty001
相关产品推荐
相关产品推荐

