经常遇到存储过程中需要使用动态sql,进行插入或更新数据操作。
通常数据来源游标,
如果直接用动态sql拼接,含有特殊字符‘&等就会报错。
解决方法:使用参数。
DECLARE TYPE t_rd IS RECORD( id NUMBER, NAME VARCHAR2(20)); TYPE t_tb IS TABLE OF t_rd INDEX BY BINARY_INTEGER; t_x t_tb; CURSOR cur_d IS SELECT 1 id, '''' names FROM dual UNION ALL SELECT 2, '&' FROM dual; i NUMBER := 1; lv_sql VARCHAR2(1000); BEGIN FOR cur IN cur_d LOOP lv_sql := 'insert into dual(dummy) select :p from dual'; dbms_output.put_line(lv_sql); EXECUTE IMMEDIATE lv_sql using cur.names; i := i + 1; END LOOP; END;