繁体   English   中英

Oracle过程从另一个表插入表

[英]Oracle procedure insert into table from another table

我有触发器的这段代码,现在我需要创建过程,因为我不能使用触发器。

CREATE OR REPLACE TRIGGER LIVE_MATCHES_TO_MATCHES 
    instead of insert ON LIVE_MATCHES
   for each row
declare
   p_priority number:= 1;
   p_sport number:=0;
   begin
     insert into matches(sub_list , priority , sport, created) 

     select :new.comp_name , p_priority, p_sport,sysdate
     from dual
      where not exists (      
     select 1 from matches
    where sub_list = :new.comp_name);

   end;

这是过程:

CREATE OR REPLACE PROCEDURE LIVE_MATCHES_SOCCER_T IS 
       p_priority number := 1;
   p_sport number:=0;   
begin
INSERT INTO matches("sub_list","priority","sport","created")
SELECT LIVE_MATCHES.COMP_NAME,p_priority,p_sport, sysdate
FROM  LIVE_MATCHES WHERE LIVE_MATCHES.COMP_NAME <> matches.SUB_LIST;
commit;
end;

但是我遇到了match.sub_list是无效的标识符的错误。 我将如何创建仅当sub_list与comp_name不同时才插入表中的过程。我将设置作业,每5分钟调用一次此过程。

我想你要:

INSERT INTO matches("sub_list","priority","sport","created")
    SELECT lm.COMP_NAME, lm.p_priority, lm.p_sport, sysdate
    FROM LIVE_MATCHES lm 
    WHERE NOT EXISTS (SELECT 1
                      FROM matches m
                      WHERE lm.COMP_NAME <> m.SUB_LIST
                     );

除非您的列名是小写字母(这只能在Oracle中通过创建引号来实现,而且在任何情况下都不是特别好主意),否则您的存储过程将无法正常工作,因为引用其中的小写标识符。 尝试以下方法:

CREATE OR REPLACE PROCEDURE LIVE_MATCHES_SOCCER_T IS 
   p_priority number := 1;
   p_sport number := 0;   
begin
    INSERT INTO matches
      ( sub_list, priority, sport, created )
    SELECT LIVE_MATCHES.COMP_NAME, p_priority, p_sport, sysdate
      FROM live_matches
     WHERE NOT EXISTS ( SELECT 1 FROM matches WHERE LIVE_MATCHES.COMP_NAME = matches.SUB_LIST );
    commit;
  end;

您可以使用MERGE语句

CREATE OR REPLACE
PROCEDURE PR_INSRT_INTO_MATCHES
IS
  P_PRIORITY NUMBER := 1;
  P_SPORT    NUMBER := 0;
BEGIN
  MERGE INTO MATCHES M USING
  (SELECT DISTINCT COMP_NAME AS COMP_NAME FROM LIVE_MATCHES
  ) LM ON (LM.COMP_NAME=M.SUB_LIST)
WHEN NOT MATCHED THEN
  INSERT
    (
      M.SUB_LIST,
      M.PRIORITY,
      M.SPORT,
      M.CREATED
    )
    VALUES
    (
      LM.COMP_NAME,
      P_PRIORITY,
      P_SPORT,
      SYSDATE
    )
    COMMIT;
END;

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM