项目遇到如下问题:
    这个项目中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; 就可以解决这问题。有没有什么隐患。
  
    希望各位大大给点建议

解决方案 »

  1.   

    set define off应该只能处理 & 而不能处理'估计单引号只能再处理下参数,如果包含单引号,就替换成两个''
      

  2.   

    是这样的,在Oracle中特殊字符是可以通过转义实现的,在Oracle10g中可以这样实现,
    比较好用的方法是用这样的一个方法:q'{}'.比如:
    select q'[@#%&&&]' from dual;
    得到的结果就是中括号中的内容,原样输出,里面什么字符都可以包括。我这里强调的是q'{}'也是可以的。意思是说这个两个单引号中的的符号是很灵活的,只要成对就行,常用的是{}或者是[],他们中间的内容回原样输出,感兴趣的同志可以试试!
     select q'[!@#$%^&*()]' from dual;
    得到的结果就是:
      !@#$%^&*()
      

  3.   

    如果是q'[!@#$%^]'&*()]' 呢?
      

  4.   

    试了一下,还是不可以有&啊
      

  5.   


    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
      

  6.   

     感谢各位:
      已解决
     方法
     用 EXECUTE IMMEDIATE  USING 把变量绑上去就没问题了。 以后动态SQL文得不能直接拼了