在存储过程中动态sql拼接的两种写法
- 单引号
IN_PROTOCOL_VERSION:= '1';
OPEN p_cur FOR
SELECT * FROM ACS_CMS_TRANSACTION WHERE 1=1
AND (PROTOCOL_VERSION like '%'||IN_PROTOCOL_VERSION||'%');
- 三引号
IN_PROTOCOL_VERSION:= '1';
sqls:='SELECT * FROM ACS_CMS_TRANSACTION WHERE 1=1
AND (PROTOCOL_VERSION like ''%'||IN_PROTOCOL_VERSION||'%'')';
OPEN p_cur FOR sqls;
最后结果:运行中的sql
SELECT * FROM ACS_CMS_TRANSACTION WHERE 1=1
AND (PROTOCOL_VERSION like '%1%')
在 ORACLE 中,单引号有两个作用,一是字符串是由单引号引用,二是转义。
这样就导致在存储过程中有一个三个单引号字符串拼接的写法会让人不是很理解。
我们可以用java的语法来写这个三引号
String str = "SELECT * FROM ACS_CMS_TRANSACTION WHERE 1=1 AND " +
"(PROTOCOL_VERSION like \"%"+IN_PROTOCOL_VERSION+"%\" ) ";
从java代码中,我们去理解oracle三引号拼接sql的写法,第一个和第五个单引号为转义符,第二个和第六个为被保留为普通字符的单引号,剩下的第三个和第四个用来连接变量的普通引用,这样就是一目了然了