【问题标题】:Need an automatism to insert in a table the missing rows of a select statement需要自动在表中插入 select 语句的缺失行
【发布时间】:2019-06-22 14:21:34
【问题描述】:

我对数据库没有太多经验,所以在这种情况下我在这里寻求帮助:

这里的选择语句是检索不在我用来映射将要集成到其他系统中的文档的表中的所有文档,它是一个映射表 (TP_DOC_MAP)。所以我想在我的数据库中创建某种自动化,X 在 X 时间它会运行这个语句,它会插入到我的映射表(TP_DOC_MAP)中。

现在它是手动制作的。我运行这条语句,我会手动插入每条记录,当然没有意义。

    (
    SELECT DOM_DOCUMENT.DOMAIN_DOC,
            TYPE_DOCS.TYPE_DOC_PK,
            TYPE_DOCS.TIPO_DOCUMENTO,
            TYPE_DOCS.USERCODE,
            TYPE_DOCS.CODE_RESULT
         FROM TYPE_DOCS 
        JOIN DOM_TDOC_SIS 
               ON TYPE_DOCS.TYPE_DOC_PK = DOM_TDOC_SIS.TYPE_DOC_PK
         JOIN DOM_DOCUMENT 
              ON DOM_TDOC_SIS.DOMAIN_DOC_PK = DOM_DOCUMENT.DOMAIN_DOC_PK
         WHERE DOM_DOCUMENT.DOMAIN_DOC_PK IN (2, 10) -- (QLD = | PRD = 2) 
     "motive docs" -- (QLD = 63 | PRD = 10) "Consent. docs"
    AND NOT EXISTS
                 (
                  SELECT 1
                    FROM TP_DOC_MAP
                   WHERE  TP_DOC_MAP.LS_LOCAL_PK = 8 
                         AND TP_DOC_MAP.LS_SYSTEM_PK = 3 -- system type
                         AND TP_DOC_MAP.ACTIVE = 1 -- Mapping all the active 
  documents
                         AND TP_DOC_MAP.CODE = TYPE_DOCS.TYPE_DOC_PK --"not e 
 xists" junction
                ))


    INSERT INTO TP_DOC(CODIGO, NAME, ACTIVE, CREATEDAT, UPDATEDAT) VALUES 
    ('TPDOC_23', 'Report for intrusive function', 1, SYSDATE, NULL);

    INSERT INTO TP_DOC_MAP (TP_DOCUMENT_PK, LS_LOCAL_PK, LS_SYSTEM_PK, CODE, 
    ACTIVE, CREATEDAT, UPDATEDAT) VALUES ((SELECT TP_DOCUMENT_PK FROM TP_DOC 
    WHERE CODE = 'TPDOC_23'), (SELECT LS_LOCAL_PK FROM LS_LOCAL WHERE CODE = 
   'IPE'), (SELECT LS_SYSTEM_PK FROM LS_SYSTEM WHERE CODIGO = 'MDS'), '21', 
    1, SYSDATE, NULL);

所以我不想创建一个数据库例程来自动执行此操作。

【问题讨论】:

  • INSERT INTO SELECT 声明就是你要找的。​​span>
  • 我正在考虑在 Oracle 中创建一个计时器来实现这一点,但在这种情况下如何使这个动态:TP_DOC_MAP.LS_LOCAL_PK = 8 在这种情况下是 8,但我正在映射文档仅限于某些 LS_LOCAL_PK,我该如何设置这个动态?

标签: sql oracle sql-insert


【解决方案1】:

将该代码转换为过程,例如

create or replace procedure p_insert as
begin
  insert into target_table (col1, col2, ...)
    select rows_that_are_missing
    from some_other_table
    where ...;
end;

然后使用DBMS_JOBDBMS_SCHEDULER 包安排它。例如:

declare
  l_job number;
begin
  dbms_job.submit
   (job       => job_insert, 
    what      => 'p_insert;'
    next_date =>  sysdate,
    interval  => 'sysdate + 1');
end;

【讨论】:

  • 感谢它对结构的帮助!但是在那个选择语句中告诉我,我以 TP_DOC_MAP.LS_LOCAL_PK = 8 为例运行查询,但是还有 10 个 TP_DOC_MAP.LS_LOCAL_PK,我是否必须为每个 PK 创建一个过程和一个调度程序?
  • 我猜不是;如果可能,创建一个循环,它将为每个 PK 值插入。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2023-02-02
  • 2016-09-01
  • 1970-01-01
  • 2021-04-17
  • 2018-11-19
相关资源
最近更新 更多