因项目需要,需要将存储过程中的 dml语句输出到日志表中,
日志表主要列为:过程id,sql序号,sql语句,开始执行时间,执行结束时间。即要求在过程中,有如下的结构日志过程(过程id,sql序号,null,sysdate,null)
insert into **** select *** from ***;
--以下需要取得上边的sql语句,再次调用日志过程
日志过程(过程id,sql序号,上边的sql语句,sysdate,null)既在每条sql语句执行前后分别调用日志过程,将执行过的sql语句保存在日志表中。现在问题的难点在 如何在sql语句执行过之后,得到sql语句。
因为项目是改造项目,原来的过程中 大部分的sql语句都是静态的且夹杂着很多变量条件,所以 把insert into **** select *** from *** 之类的语句赋值给一个变量,然后采用 execute 的方法基本上是被枪毙了(改造量太大,且之所以有这个需求是 客户要分析过程中的sql语句,所以 必须保证日志中的sql是可执行的。)谢谢了1

解决方案 »

  1.   

    根据当前用户的session可以得到执行的sql
    以前记录死锁的时候查询过
    可以看一下v$lock, sys.v_$session
    多百度和google一下
      

  2.   

    把存储过程的静态sql语句赋值给一个变量,然后dbms_output.put_line()把应该变量输出
      

  3.   

    楼上的,我已经说过了,因为是改造项目,原来都是静态sql,改成赋值给变量的方法因为工作量太大已经被否绝了。
    继续求可行方案!
      

  4.   

    select * from USER_RESUMABLE
    列出当前用户执行的可恢复的语句
      

  5.   

    好像上面的方法没有效果,你从这里可以查到吧select * from V$SQL
      

  6.   

    V$SQL V$SQLAREA 就是这些表里面有SQL语句
      

  7.   

    1.保证数据库为归档模式,以便能从日志文件中能够查到相应的各种信息;
    2.分别对每个存贮过程充分进行单元测试无误后,再进行整个数据库(包括存贮过程、函数、触发器等)的集成测试。本人认为:对sql语句进行分析是一种方法,但完整的测试(条件测试、覆盖测试等)更是一种方法。
      

  8.   

    给你一个思路吧,不知道你们是不是使用的Pl/sql
    点击工具->会话
    然后又管你session中所有执行的动作都在其中,你可以先点击下其中的一个看一下,
    你可以看到下面中的sql text域中就是你执行的那些静态sql这个时侯你就可以通过User_Name选出这些符合你自己要求的数据,在进行存储就可以了。。你可以试试看
      

  9.   

    select sid,osuser,username,sql_text,serial# from v$session a, v$sqltext  b 
    where a.sql_address=b.address order by  address
      

  10.   

    select * from V$SQL v where PARSING_USER_ID=uid and v.MODULE = <module> and v.CHILD_LATCH = 1
    order by v.LAST_ACTIVE_TIME desc
    第二行既是 module执行的sql_text(第一行是本句)
      

  11.   

    <MODULE>
    Contains the name of the module that was executing at the time that the SQL statement was first parsed as set by calling DBMS_APPLICATION_INFO.SET_MODULE
    包含调用sql语句的模块名称,可以用DBMS_APPLICATION_INFO.SET_MODULE设定好像是这样