基于条件的PL / SQL插入

用户3782821

我将不胜感激。我正在学习PL / SQL,但偶然发现了一个问题,因此请帮助我找到处理这种情况的适当方法:)我正在运行Oracle 11gR2

我的架构:

CREATE TABLE "ENTRY" 
(
 "TYPE" VARCHAR2(5 CHAR) ,
 "TRANSACTION" VARCHAR2(5 CHAR),
 "OWNER" VARCHAR2(5 CHAR)
);

CREATE TABLE "VIEW" 
(
 "TYPE" VARCHAR2(5 CHAR) ,
 "TRANSACTION" VARCHAR2(5 CHAR),
 "OWNER" VARCHAR2(5 CHAR)
);

CREATE TABLE "REJECTED" 
(
 "TYPE" VARCHAR2(5 CHAR) ,
 "TRANSACTION" VARCHAR2(5 CHAR),
 "OWNER" VARCHAR2(5 CHAR)
);

我的样本数据:

insert into entry (type, transaction, owner) values (11111, 11111, 11111);
insert into entry (type, transaction, owner) values (22222, 22222, 22222);

现在,对于令人费解的部分,我编写了此过程,该过程应该在特定(事务和所有者)组合的记录不存在的情况下,将值从ENTRY表复制到VIEW表。如果VIEW表中存在这样的组合,则该记录应转到REJECTED表。此过程可以执行此操作,但是在该过程的多次运行中,我在REJECTED表中获得了越来越多的条目,因此我的问题是如何限制REJECTED表中的插入-如果REJECTED表中已存在记录,则什么也不做。

create or replace PROCEDURE COPY AS         

v_owner_entry ENTRY.owner%TYPE;
v_transaction_entry ENTRY.transaction%TYPE;

v_owner VIEW.owner%TYPE;
v_transaction VIEW.transaction%TYPE;

begin 

begin 

select e.owner, e.transaction, v.owner, v.transaction 
into v_owner_entry, v_transaction_entry, v_owner, v_transaction
from entry e, view v
where e.owner = v.owner
and e.transaction = v.transaction;

EXCEPTION
when too_many_rows
then
  insert into REJECTED
  (
    TYPE,
TRANSACTION,
OWNER
  )
  SELECT
    s1.TYPE,
    s1.TRANSACTION,
    s1.OWNER
    FROM ENTRY s1;


when no_data_found
THEN

insert into VIEW
    (
      TYPE,
  TRANSACTION,
  OWNER
    )
    SELECT
      s.TYPE,
  s.TRANSACTION,
  s.OWNER
      FROM ENTRY s;

 end;
 end;

有什么建议吗?:)

干杯!

更新抱歉,如果原始帖子不够清楚-该过程(每天)应将数据从DB1复制到DB2,并根据条件插入到VIEW或REJECTED中。这是一张照片,也许会更清晰:在此处输入图片说明

炖2

我认为Dmitry试图建议异常处理程序的too_many_rows情况下使用MERGE 因此,您已经完成了SELECT并确定Entry行出现在View表中,因此引发了too_many_rows异常。

问题是您不知道哪些记录引发了异常(假设您的Entry表在调用此过程时很容易出现多行)。因此,我认为使用异常部分确定行太多的想法很优雅,但不足以满足您的需求。

作为一名熟练的程序员,我不会尝试提出极其优雅的东西,而是会使用更多的蛮力。

更像是:

BEGIN
    FOR entry_cur IN
        (select e.owner, e.transaction, SUM(NVL2(v.owner, 1, 0)) rec_count
           from entry e, view v
          where e.owner = v.owner(+)
            and e.transaction = v.transaction(+)
         GROUP BY e.owner, e.transaction)
    LOOP
        CASE WHEN rec_count > 0
             THEN INSERT INTO view
             ELSE MERGE INTO rejected r
                     ON (r.transaction = entry_cur.transaction
                    AND r.owner = entry_cur.owner)
                   WHEN NOT MATCHED THEN INSERT blah blah blah
        ;
    END LOOP;
END;

HAVING COUNT(*)> 1将不会引发任何异常。该循环为您提供了您不想插入View的正确记录。顺便说一句,我无法克服的是您使用对象名称的关键字-视图,事务等。您在CREATE TABLE“ VIEW”语句中引用了表名,这绕开了这些是关键字的事实,但是您没有这样做。 t当您以后引用它们时,令我惊讶的是编译器没有拒绝代码。我认为这是灾难的根源,因为它会使调试变得更加困难。我只是希望您在此处的示例中做到了这一点,而不是在PL / SQL中。

就个人而言,我在使用MERGE语句时似乎遇到不一致的地方时遇到了麻烦,但是那是很早以前的Oracle版本,可能是我自己对如何工作不了解。

本文收集自互联网,转载请注明来源。

如有侵权,请联系[email protected] 删除。

编辑于
0

我来说两句

0条评论
登录后参与评论

相关文章

来自分类Dev

如果条件为pl sql,则在插入嵌套后触发

来自分类Dev

更新并插入Oracle PL / SQL以及if else条件

来自分类Dev

SQL Server:基于条件的条件

来自分类Dev

基于复杂条件的SQL

来自分类Dev

基于条件的 SQL INSERT

来自分类Dev

pl sql触发序列中的插入值

来自分类Dev

PL / SQL可以插入(选择GROUP BY)吗?

来自分类Dev

存储过程-PL / SQL-插入错误

来自分类Dev

PL-SQL操作列并插入

来自分类Dev

PL / SQL插入新记录异常处理

来自分类Dev

Oracle PL/SQL 中的批量插入

来自分类Dev

PL/SQL 触发器防止插入

来自分类Dev

Oracle PL / SQL条件声明?

来自分类Dev

PL / SQL记录属性条件

来自分类Dev

使用SQL插入基于QUERY的记录数

来自分类Dev

SQL - 基于选择行插入循环

来自分类Dev

基于 2 列组合条件在表中插入缺失值的 T-SQL 查询

来自分类Dev

SQL Server XML修改插入方法条件插入

来自分类Dev

在聚合的SQL语句中插入where条件

来自分类Dev

SQL-在视图中插入条件值

来自分类Dev

SQL - 如何根据条件插入表?

来自分类Dev

基于条件的Oracle SQL计数

来自分类Dev

基于多个条件的SQL查询

来自分类Dev

基于多个条件的SQL查询

来自分类Dev

基于动态where条件的sql

来自分类Dev

向PL / SQL游标添加条件

来自分类Dev

PL / SQL存储过程-IF THEN ELSE条件

来自分类Dev

PL / SQL,功能/过程开始处的条件

来自分类Dev

多个条件在哪里(PL / SQL)