具有长期运行SQL的Oracle报告

时间:2017-09-28 17:18:14

标签: oracle oraclereports

我使用Oracle Report Builder生成报告。该报告有82个SQL查询。几乎每个查询都执行繁重的计算。我正在做财务报告,其中包含会计双重记录。有时,当我生成报告时,条目不符合。有时这很好。看起来它不是以“事务方式”进行的。因为在生成报告时数据似乎一直在运行。

我很好奇报告如何执行SQL查询?是一个一个还是整个报告?如何调试或查看正在执行的查询?

3 个答案:

答案 0 :(得分:2)

尝试使用以下查询检查正在运行的活动SQl

select S.USERNAME, s.sid, s.osuser, t.sql_id, sql_text
from v$sqltext_with_newlines t,V$SESSION s
where t.address =s.sql_address
and t.hash_value = s.sql_hash_value
and s.status = 'ACTIVE'
and s.username <> 'SYSTEM'
order by s.sid,t.piece

答案 1 :(得分:1)

Oracle Reports将根据需要根据Oracle Reports数据模型中的关系发出82个不同的查询。

默认情况下,在Oracle中,您只能在单个 SQL语句中获得读取一致性 - 这就是您的问题。

例如,假设您有查询Q_ACCOUNTS,其中列出了您的会计科目表,并查询Q_JOURNAL_ENTRIES,它汇总了对给定帐户所做的日记帐分录。在Oracle Reports数据模型中,假设Q_JOURNAL_ENTRIES链接到Q_ACCOUNTS。

在这种情况下,Oracle报告将运行Q_ACCOUNTS,然后为每个帐户运行一次Q_JOURNAL_ENTRIES。以下是关键点:Q_JOURNAL_ENTRIES的多次执行之间没有读取一致性(也没有与Q_ACCOUNTS一致)。

因此,如果对会计科目A和贷方科目B进行会计分录,并且该条目是在Q_JOURNAL_ENTRIES为A运行之后且在运行B之前进行的,则您的报告将仅包括对B的贷记。所以,你的报告不会加起来。

我从来没有这样做过,但你可能会尝试在你的&#34;之前报告&#34;中运行SET TRANSACTION READ ONLY SQL命令。触发。这可以为您提供事务级读取一致性,这是您所需要的,但它带有限制(主要是,您不能执行任何数据库写操作,顾名思义)。

答案 2 :(得分:0)

也许你可以试试“longops”

SELECT s.sid, 
       s.serial#,          
       sl.target,  sl.OPNAME, sl.SQL_PLAN_OPERATION as OPERATION, sl.SQL_PLAN_OPTIONS as options,
       ROUND(sl.elapsed_seconds/60) || ':' || MOD(sl.elapsed_seconds,60) elapsed,
       ROUND(sl.time_remaining/60) || ':' || MOD(sl.time_remaining,60) remaining,
       ROUND(sl.sofar/decode(sl.totalwork,0, decode(sl.sofar, 0,1), sl.totalwork  )*100, 2) progress_pct, s.INST_ID , s.machine
FROM   gv$session s,
       v$session_longops sl
WHERE  s.sid     = sl.sid
AND    s.serial# = sl.serial#(+)
and sl.elapsed_seconds(+) <> 0
ORDER BY   ROUND(sl.sofar/decode(sl.totalwork,0, decode(sl.sofar, 0,1), sl.totalwork  )*100, 2)