Procedure p_sql_valid(In_sql varchar2, out_返回值 out number) is
    ----------------------------------------------------------------
    --功能:综合查询平台-SQL合法性验证
    --参数:
    --编制:wsy, 2011.07.12
    --修改:
    ---------------------------------------------------------------
    v_开始时间 date := sysdate;
    v_结束时间 date := sysdate;
    v_机构信息 varchar2(50) := '';
    v_医生信息 varchar2(50) := '';
    v_cursor   number; --定义光标
    v_result   number; --结果
    v_sqlerrm  varchar2(2000);
  
  begin
    Execute Immediate 'ALTER session SET nls_date_format=''yyyy-mm-dd hh24:mi:ss''';
    Execute Immediate 'ALTER session SET NLS_TIMESTAMP_FORMAT=''yyyy-mm-dd hh24:mi:ss''';
    v_cursor := dbms_sql.open_cursor(2); --为处理打开光标
    dbms_sql.parse(v_cursor, In_sql, dbms_sql.native); --分析语句
    if instr(In_sql, ':开始时间') > 0 then
      dbms_sql.bind_variable(v_cursor, ':开始时间', v_开始时间); --绑定变量--开始时间
    end if;
    if instr(In_sql, ':结束时间') > 0 then
      dbms_sql.bind_variable(v_cursor, ':结束时间', v_结束时间); --绑定变量--结束时间
    end if;
    if instr(In_sql, ':机构信息') > 0 then
      dbms_sql.bind_variable(v_cursor, ':机构信息', v_机构信息); --绑定变量--机构信息
    end if;
    if instr(In_sql, ':医生信息') > 0 then
      dbms_sql.bind_variable(v_cursor, ':医生信息', v_医生信息); --绑定变量--医生信息
    end if;
    dbms_sql.define_column(v_cursor, 1, v_result); --指定结果列
    v_result := dbms_sql.execute(v_cursor);
  
    LOOP
      EXIT WHEN dbms_sql.fetch_rows(v_cursor) <= 0; --fetch_rows在结果集中移动游标,如果未抵达末尾,返回1。
      dbms_sql.column_value(v_cursor, 1, v_result); --将当前行的查询结果写入上面定义的列中。
    END LOOP;
  
    dbms_sql.close_cursor(v_cursor); --关闭光标
    /*Execute Immediate In_SQL into v_result using v_开始时间,v_结束时间,v_机构信息,v_机构信息,v_医生信息,v_医生信息;
    out_返回值 := 0;*/
  exception
    when others then
      v_sqlerrm := sqlcode || sqlerrm;
      insert into 查询平台日志(id,ipaddress,host,c_sqlerrm,c_objectname,text,rec_time) values(newid,sys_context('userenv', 'ip_address'),sys_context('userenv', 'HOST'),v_sqlerrm,'PKG_指标操作.p_sql_valid',DBMS_UTILITY.format_error_backtrace || 'SQL语句为:' || In_sql,sysdate);
      commit;
      if dbms_sql.is_open(v_cursor) then
         dbms_sql.close_cursor(v_cursor); --关闭光标
      end if;
      dbms_output.put_line(sqlcode || sqlerrm);
      RAISE_APPLICATION_ERROR(-20169, DBMS_UTILITY.format_error_backtrace);
      out_返回值 := -1;
  end p_sql_valid; 
一不小心就报 ora-29471 ,编译通过了。但是偶发性的报错,一旦报错后必须重启数据库,否则这个存储过程就一直报这个错误。