我使用Oracle report Builder生成了一个报告。该报告有82个SQL查询。几乎每个查询都会执行繁重的计算。我在做财务报告,有两个会计分录。有时,当我生成报告时,条目并不一致。有时候它是好的。看起来它不是以“事务性的方式”来做这件事。因为在生成报告的同时,数据似乎一直在运行。
我很好奇报表是如何执行SQL查询的?是一个接一个,还是整份报告?如何调试或查看正在执行的查询?
发布于 2017-09-29 02:03:25
尝试使用以下查询检查正在运行的active 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发布于 2017-09-29 21:22:16
Oracle Reports将根据您的Oracle Reports数据模型中查询之间的关系,根据需要发出82个不同的查询。
默认情况下,在Oracle中,您只能在单个SQL语句中获得读取一致性--这就是您的问题所在。
例如,假设您有query Q_ACCOUNTS和query Q_JOURNAL_ENTRIES,前者列出了您的科目表,后者汇总了对给定帐户的日记帐分录。在Oracle Reports数据模型中,假设Q_JOURNAL_ENTRIES链接到Q_ACCOUNTS。
在这种情况下,Oracle report将运行Q_ACCOUNTS,然后为每个帐户运行一次Q_JOURNAL_ENTRIES。这里是关键点:在Q_JOURNAL_ENTRIES的多次执行之间没有读取一致性(就这一点而言,也不存在与Q_ACCOUNTS的一致性)。
我从来没有这样做过,但是您可以尝试在"Before Report“触发器中运行一个SET TRANSACTION READ ONLY SQL命令。这可以为您提供事务级别的读取一致性,这是您所需要的,但它也有局限性(顾名思义,主要是不能执行任何数据库写入)。
发布于 2017-09-29 21:29:55
也许你可以试试"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) https://stackoverflow.com/questions/46474920
复制相似问题