对令人困惑的标题和长篇大论的帖子采取行动。
我正在尝试使用数据填充(Oracle)SQL表,以便我可以定期监视它并构建一个用户使用哪些应用程序模块的图片。
我有一张桌子' forms_sessions_log'其创建如下:
create table stuman.forms_sessions_log as (
select a.sid, a.serial#, a.logon_time, a.client_identifier,
a.module,a.username, a.SCHEMANAME, b.SPRIDEN_LAST_NAME, b.SPRIDEN_FIRST_NAME
from gv$session a, spriden b
where program like 'frmweb%'
and a.username=b.spriden_id)
这会创建一个'快照' '形式'在那个时间点连接到数据库的会话。
从那时起,通过作业调度程序每分钟,我想继续使用任何新的或不同的会话填充此表。
我想出了以下内容:
INSERT INTO stuman.forms_sessions_log
(sid,serial#,logon_time,client_identifier,module,username,SCHEMANAME,SPRIDEN_LAST_NAME,SPRIDEN_FIRST_NAME)
SELECT a.sid,
a.serial#,
a.logon_time,
a.client_identifier,
a.module ,
a.username,
a.SCHEMANAME,
b.SPRIDEN_LAST_NAME,
b.SPRIDEN_FIRST_NAME
FROM gv$session a
spriden b
WHERE a.PROGRAM like 'frmweb%'
AND a.username=b.spriden_id
AND NOT EXISTS(SELECT * FROM stuman.forms_sessions_log)
/
这似乎不起作用。它无法添加任何新会话。如果我截断stuman.forms_sessions_log并再次运行insert语句,它会填充正常,但在连续尝试时无法向表中添加任何新会话。
我查看了代码并决定使用NOT EXISTS子句中的比较来微调语句。
INSERT INTO stuman.forms_sessions_log
(sid,serial#,logon_time,client_identifier,module,username,SCHEMANAME,SPRIDEN_LAST_NAME,SPRIDEN_FIRST_NAME)
SELECT a.sid,
a.serial#,
a.logon_time,
a.client_identifier,
a.module ,
a.username,
a.SCHEMANAME,
b.SPRIDEN_LAST_NAME,
b.SPRIDEN_FIRST_NAME
FROM gv$session a,
spriden b
WHERE a.PROGRAM like 'frmweb%'
AND a.username=b.spriden_id
AND NOT EXISTS(SELECT a.sid,a.serial#,a.logon_time,a.client_identifier,a.module,a.username,a.SCHEMANAME
FROM stuman.forms_sessions_log a,
gv$session b
WHERE a.sid=b.sid
AND a.serial#=b.serial#
AND a.logon_time=b.logon_time
AND a.client_identifier=b.client_identifier
AND a.module=b.module
AND a.username=b.username
AND a.SCHEMANAME=b.SCHEMANAME
)
/
这也不能达到我的预期。我隔离了我想检查的查询的NOT EXISTS部分:
SELECT a.sid,a.serial#,a.logon_time,a.client_identifier,a.module,a.username,a.SCHEMANAME
FROM stuman.forms_sessions_log a,
gv$session b
WHERE a.sid=b.sid
AND a.serial#=b.serial#
AND a.logon_time=b.logon_time
AND a.client_identifier=b.client_identifier
AND a.module=b.module
AND a.username=b.username
AND a.SCHEMANAME=b.SCHEMANAME
现在,请记住,表A和表B中的那些已定义字段是相同的(stuman.forms_session_log是从gv $ session填充的),没有任何返回。
我有一行stuman.forms_session_log,它对应于gv $ session中的一行。
为什么上面的select语句没有返回任何结果?
答案 0 :(得分:1)
您是否尝试过使用MERGE?
MERGE INTO stuman.forms_sessions_log sl
USING (SELECT a.sid,
a.serial#,
a.logon_time,
a.client_identifier,
a.module ,
a.username,
a.SCHEMANAME,
b.SPRIDEN_LAST_NAME,
b.SPRIDEN_FIRST_NAME
FROM gv$session a,
spriden b
WHERE a.PROGRAM like 'frmweb%'
AND a.username=b.spriden_id ) S
ON ( S.sid = SL.sid
AND S.serial# = sl.serial#)
WHEN NOT MATCHED THEN INSERT (sid,serial#,logon_time,client_identifier,module,username,SCHEMANAME,SPRIDEN_LAST_NAME,SPRIDEN_FIRST_NAME)
VALUES (S.*)