2016-01-28 4 views
0

Аполлиции для запутанного заголовка и длинной ветви.Заполнение таблицы B данными из таблицы A, если данные в таблице B отличаются от таблицы A

Я пытаюсь заполнить таблицу SQL (Oracle) данными, чтобы я мог регулярно отслеживать ее и создавать изображение, в котором пользователи используют какие-либо модули приложения.

У меня есть таблица «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 
       ) 
/

Это также не делает то, что я ожидал. Я Выделенное НЕ СУЩЕСТВУЕТ часть запроса я хотел проверить, который:

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 

Теперь, имейте в виду, что эти определенные поля в таблице как А и В являются идентичными (stuman.forms_session_log была заселена из Гв $ сессии), ничего не возвращается.

У меня есть одна строка stuman.forms_session_log, которая соответствует строке в сеансе gv $.

Почему оператор select выше не возвращает результатов?

+0

Является ли это проблемой MS SQL Server или Oracle? Не помещайте теги, которые не задействованы ... – jarlh

+0

К сожалению, я не вижу тег сервера MSSQL в моем списке тегов – Huskie69

+0

К сожалению, он уже был удален другим пользователем ... – jarlh

ответ

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.*) 
+0

Fantasic, это делает именно то, что требовалось. – Huskie69

Смежные вопросы