在Oracle存储过程中CREATE OR REPLACE PROCEDURE prc_1 
AS   CURSOR c_1
   IS
      SELECT *
      FROM a1;
   v_1 c_1%rowtype;
   v_exec_sql varchar2(3000);
   
BEGIN
   open c_1;
   LOOP
    fetch c_1 into v_1;
     Exit when c_1%NOTFOUND;
v_exec_sql := lv_corp_rqueue.CUSTOMER_SQL; --从a1表中读到一个动态sql

execute immediate v_exec_sql; 执行这个动态sql    END LOOP;    CLOSE c_1;
   COMMIT;END;
/过程执行总是会出错,动态sql中肯定有单引号,譬如inert into xxx(xxx1,xxx2) values('1','2')
我怀疑是单引号出现的问题
请问这个问题该如何处理?
急等!

解决方案 »

  1.   

    v_exec_sql := 'inert into xxx(xxx1,xxx2) values(''1'',''2'')';
    execute immediate v_exec_sql;
    两个单引号转义成一个单引号。
      

  2.   

    如果你是用pl/sql developer 的话,跟踪一下v_exec_sql,
    看看到底是什么不就行了
    或者把dbms_output.put_line(v_exec_sql);看看.....
      

  3.   

    try:
    ...
    fetch c_1 into v_1;
         Exit when c_1%NOTFOUND;
    v_exec_sql := replace(lv_corp_rqueue.CUSTOMER_SQL,'''',''''''); --从a1表中读到一个动态sql
    ...
      

  4.   

    谢谢大家,我用了replace,怎么还是不行呢?运行到execute immediate v_exec_sql,就出错了
    请大家再帮忙看看:)
      

  5.   

    用dbms_output.put_line(v_exec_sql);
    输出看看
    是否是语句的问题
    还有就是加上
    exception when others then
       dbms_output.put_line(sqlerrm);
    把错误信息也输出看看。
      

  6.   

    我认为是这个错误 v_1 c_1%rowtype;
    数据类型应该是 v_1 a1%rowtype;
      

  7.   

    老大,我按照你的办法做了,
    dbms_output.put_line(v_exec_sql);这个语句就出错了,提示ORA-20000: ORU-10028: line length overflow, limit of 255 chars per line
      

  8.   

    语句太长了
    用pl/sql developer单步调试一下看看
      

  9.   

    但是sql语句肯定很长的啊,我就是单步调试的
    有解决办法吗?