项目遇到如下问题:
这个项目中PLSQL写了很多存储过程。
一开始没注意到,现在客户要求数据中可能出现符号。
在PLSQL代码中,有很多的SQL执行语句都是动态地拼起来的
如下
vc_sql VARCHAR(1024) := '';
vc_sql :=' UPDATE TW_HOKAN_KEISANMOTO SET KEIREN_NO = 'AAAAA' WHERE ' IF 情况A then
vc_sql := vc_sql & '字段A= ' '''' & string & ''''
ELSE
..........
END IF;
EXECUTE IMMEDIATE vc_sql;
其中 字符变量 string 中可能含有 单影号之类的特殊字符。如果不对特殊字符进行处理,直接出错。
我网上搜了下资料。 是不是在 执行 EXECUTE IMMEDIATE vc_sql; 语句前执行 SET DEFINE OFF; 就可以解决这问题。有没有什么隐患。
希望各位大大给点建议
这个项目中PLSQL写了很多存储过程。
一开始没注意到,现在客户要求数据中可能出现符号。
在PLSQL代码中,有很多的SQL执行语句都是动态地拼起来的
如下
vc_sql VARCHAR(1024) := '';
vc_sql :=' UPDATE TW_HOKAN_KEISANMOTO SET KEIREN_NO = 'AAAAA' WHERE ' IF 情况A then
vc_sql := vc_sql & '字段A= ' '''' & string & ''''
ELSE
..........
END IF;
EXECUTE IMMEDIATE vc_sql;
其中 字符变量 string 中可能含有 单影号之类的特殊字符。如果不对特殊字符进行处理,直接出错。
我网上搜了下资料。 是不是在 执行 EXECUTE IMMEDIATE vc_sql; 语句前执行 SET DEFINE OFF; 就可以解决这问题。有没有什么隐患。
希望各位大大给点建议
比较好用的方法是用这样的一个方法:q'{}'.比如:
select q'[@#%&&&]' from dual;
得到的结果就是中括号中的内容,原样输出,里面什么字符都可以包括。我这里强调的是q'{}'也是可以的。意思是说这个两个单引号中的的符号是很灵活的,只要成对就行,常用的是{}或者是[],他们中间的内容回原样输出,感兴趣的同志可以试试!
select q'[!@#$%^&*()]' from dual;
得到的结果就是:
!@#$%^&*()
SQL> select q'[adf&d''dffdfs]' from dual;
输入 d 的值: 123
原值 1: select q'[adf&d''dffdfs]' from dual
新值 1: select q'[adf123''dffdfs]' from dualQ'[ADF123''DFFDFS]'
----------------------------
adf123''dffdfs
已解决
方法
用 EXECUTE IMMEDIATE USING 把变量绑上去就没问题了。 以后动态SQL文得不能直接拼了