我使用Oracle Report Builder生成报告。该报告有82个SQL查询。几乎每个查询都执行繁重的计算。我正在做财务报告,其中包含会计双重记录。有时,当我生成报告时,条目不符合。有时这很好。看起来它不是以“事务方式”进行的。因为在生成报告时数据似乎一直在运行。
我很好奇报告如何执行SQL查询?是一个一个还是整个报告?如何调试或查看正在执行的查询?
答案 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)