Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/sql/85.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 如果值已存在,是否插入Oracle SQL或更新?_C#_Sql_Oracle - Fatal编程技术网

C# 如果值已存在,是否插入Oracle SQL或更新?

C# 如果值已存在,是否插入Oracle SQL或更新?,c#,sql,oracle,C#,Sql,Oracle,我想要的是:If键存在于Oracle SQL表中→ 更新,否则进行插入 昨天玩了一整天之后,我设法得到了插入部分(下面的查询),现在我需要的是更新部分 这就是我需要它的原因:我有一个RadGridView(使用Telerik和WPF)。当用户单击“插入”按钮时,将添加一个新行,在用户单击“回车”后,该值将插入到数据库中。但用户也可以单击RadGridView中的可用行并更新值,因此我也需要更新数据库中的值(而不是执行插入)。这就是为什么我需要一个可以执行Udate或Insert的查询 非常感谢您

我想要的是:
If键存在于Oracle SQL表中→ 更新,否则进行插入

昨天玩了一整天之后,我设法得到了插入部分(下面的查询),现在我需要的是更新部分

这就是我需要它的原因:我有一个RadGridView(使用Telerik和WPF)。当用户单击“插入”按钮时,将添加一个新行,在用户单击“回车”后,该值将插入到数据库中。但用户也可以单击RadGridView中的可用行并更新值,因此我也需要更新数据库中的值(而不是执行插入)。这就是为什么我需要一个可以执行Udate或Insert的查询

非常感谢您的帮助,如果您有更好的方法来实现插入部分,我想知道:)

我正在使用Oracle SQL Developer(Windows 10)

ps.我尝试了在StackOverflow上找到的一些解决方案,但无法将这些解决方案应用于我的问题

表1

+-----------------------------------+------------+--------+
|               ID                  |  ORIGTERM  |  CODE  |
+-----------------------------------+------------+--------+
| 126478                            | Grass      |  TEST  |
| 374628                            | Flower     |  TEST  |
| 128754                            | Tree       |  TEST  |
+-----------------------------------+------------+--------+
表2

+-----------------------------------+------------+---------+
|               ID                  |REPLACETERM |SYSCTLANG|
+-----------------------------------+------------+---------+
| 126478                            | Gras       |     3   |
| 374628                            | Blume      |     3   |
| 128754                            | Baum       |     3   |
+-----------------------------------+------------+---------+

我设法得到了插入查询,它看起来像这样(例如插入单词'Plant'):

我还必须更新表2的ID,使其与表1中的ID相同:

UPDATE Table2 SET Table2.ID = (SELECT Table1.ID FROM Table1 WHERE origterm='Plant') 
              WHERE replaceterm='Pflanze';
现在,我有一张如下所示的桌子:

    +-----------------------------------+------------+--------------+------+
    |               ID                  |  ORIGTERM  |  REPLACETERM | CODE |
    +-----------------------------------+------------+--------------+------+
    | 126478                            | Grass      |  Gras        | TEST |
    | 374628                            | Flower     |  Blume       | TEST |
    | 128754                            | Tree       |  Baum        | TEST |
    | 100000                            | Plant      |  Pflanze     | TEST |
    +-----------------------------------+------------+--------------+------+
从表1 g、表2 ct中选择g.ID、origterm、replaceterm、代码,其中g.ID=ct.ID


可能这太明显了,但如果您拥有“key”值,则此过程可能会起作用:

DECLARE _flag AS INT = 0;

SELECT COUNT() INTO _flag FROM table1 WHERE ID = key;

IF _flag = 0 THEN
   INSERT ...
ELSE
   UPDATE ....
END IF;

根据您自己的代码需要和/或ORACLE SQL方言进行调整。

这可能太明显了,但如果您拥有“key”值,则此过程可能会起作用:

DECLARE _flag AS INT = 0;

SELECT COUNT() INTO _flag FROM table1 WHERE ID = key;

IF _flag = 0 THEN
   INSERT ...
ELSE
   UPDATE ....
END IF;

根据您自己的代码需要和/或ORACLE SQL方言进行调整。

一种可能的解决方案是使用合并关键字,如下所述:


Merge基本上是一个“upsert”命令,这意味着它将更新行(如果存在),或插入行(如果不存在)。

一个可能的解决方案是使用Merge关键字,如下所述:


Merge基本上是一个“upsert”命令,这意味着它将更新行(如果存在),或插入行(如果不存在)。

Merge不适用于全部插入。如果要使用merge,则应该从表a和表a中进行合并,然后对视图使用merge。整个逻辑将在触发器内

编辑:合并不适用于此类视图 ORA-38106:将bei连接视图合并为mit视图,而不是触发器nicht unterstützt

您可以创建两个合并语句(每个表一个),或者一个用于insert,另一个用于update反对视图:

CREATE SEQUENCE MYDICT_SEQ START WITH 1 MAXVALUE 9999999999999999999999999999 MINVALUE 0;

CREATE VIEW mydict
AS
   SELECT a.id, a.origterm, a.code, b.replaceterm, b.sysctlang
     FROM table1 a LEFT OUTER JOIN table2 b ON a.id = b.id;   

CREATE OR REPLACE TRIGGER mydict_io
   INSTEAD OF INSERT OR UPDATE OR DELETE
   ON mydict
   FOR EACH ROW
DECLARE
   cnt1   INTEGER := 0;
   cnt2   INTEGER;
   nid    NUMBER;
BEGIN
   IF INSERTING OR UPDATING THEN
      IF :new.id IS NULL AND INSERTING THEN
         nid := mydict_seq.NEXTVAL;
      ELSE
         nid := :new.id;

         IF UPDATING THEN
            nid := :old.id;
         END IF;

         SELECT COUNT (*)
           INTO cnt1
           FROM table1
          WHERE id = nid;
      END IF;

      IF cnt1 = 0 THEN
         INSERT INTO TABLE1 (ID, ORIGTERM, CODE)
              VALUES (nID, :new.ORIGTERM, :new.CODE);
      ELSIF cnt1 > 0 THEN
         UPDATE TABLE1
            SET ORIGTERM = :NEW.ORIGTERM, CODE = :NEW.CODE
          WHERE id = nid;
      END IF;

      SELECT COUNT (*)
        INTO cnt2
        FROM table2
       WHERE id = nid AND SYSCTLANG = :new.SYSCTLANG;

      IF cnt2 = 0 THEN
         INSERT INTO TABLE2 (ID, REPLACETERM, SYSCTLANG)
              VALUES (nID, :new.REPLACETERM, :new.SYSCTLANG);
      ELSE
         UPDATE TABLE2
            SET REPLACETERM = :new.REPLACETERM
          WHERE id = nid AND SYSCTLANG = :new.SYSCTLANG;
      END IF;
   ELSIF DELETING THEN
      DELETE FROM table2
            WHERE id = :old.id AND SYSCTLANG = :old.SYSCTLANG;

      SELECT COUNT (*)
        INTO cnt2
        FROM table2
       WHERE id = nid;

      IF cnt2 = 0 THEN
         DELETE FROM table1
               WHERE id = :old.id;
      END IF;
   END IF;
END;

DECLARE
   nid   NUMBER;
BEGIN
   INSERT INTO mydict (ORIGTERM, CODE, REPLACETERM, SYSCTLANG)
        VALUES ('Plant', 'TEST', 'Pflanze', 3);
    nid := mydict_seq.currval;


   UPDATE mydict
      SET REPLACETERM = 'Fabrik'
    WHERE id = nid;

   UPDATE mydict
      SET REPLACETERM = 'Usine', SYSCTLANG = 4
    WHERE id = nid;
END;

instead of触发器中的逻辑可以做得更好,但我将此留给您;)

合并不适用于全部插入。如果要使用merge,则应该从表a和表a中进行合并,然后对视图使用merge。整个逻辑将在触发器内

编辑:合并不适用于此类视图 ORA-38106:将bei连接视图合并为mit视图,而不是触发器nicht unterstützt

您可以创建两个合并语句(每个表一个),或者一个用于insert,另一个用于update反对视图:

CREATE SEQUENCE MYDICT_SEQ START WITH 1 MAXVALUE 9999999999999999999999999999 MINVALUE 0;

CREATE VIEW mydict
AS
   SELECT a.id, a.origterm, a.code, b.replaceterm, b.sysctlang
     FROM table1 a LEFT OUTER JOIN table2 b ON a.id = b.id;   

CREATE OR REPLACE TRIGGER mydict_io
   INSTEAD OF INSERT OR UPDATE OR DELETE
   ON mydict
   FOR EACH ROW
DECLARE
   cnt1   INTEGER := 0;
   cnt2   INTEGER;
   nid    NUMBER;
BEGIN
   IF INSERTING OR UPDATING THEN
      IF :new.id IS NULL AND INSERTING THEN
         nid := mydict_seq.NEXTVAL;
      ELSE
         nid := :new.id;

         IF UPDATING THEN
            nid := :old.id;
         END IF;

         SELECT COUNT (*)
           INTO cnt1
           FROM table1
          WHERE id = nid;
      END IF;

      IF cnt1 = 0 THEN
         INSERT INTO TABLE1 (ID, ORIGTERM, CODE)
              VALUES (nID, :new.ORIGTERM, :new.CODE);
      ELSIF cnt1 > 0 THEN
         UPDATE TABLE1
            SET ORIGTERM = :NEW.ORIGTERM, CODE = :NEW.CODE
          WHERE id = nid;
      END IF;

      SELECT COUNT (*)
        INTO cnt2
        FROM table2
       WHERE id = nid AND SYSCTLANG = :new.SYSCTLANG;

      IF cnt2 = 0 THEN
         INSERT INTO TABLE2 (ID, REPLACETERM, SYSCTLANG)
              VALUES (nID, :new.REPLACETERM, :new.SYSCTLANG);
      ELSE
         UPDATE TABLE2
            SET REPLACETERM = :new.REPLACETERM
          WHERE id = nid AND SYSCTLANG = :new.SYSCTLANG;
      END IF;
   ELSIF DELETING THEN
      DELETE FROM table2
            WHERE id = :old.id AND SYSCTLANG = :old.SYSCTLANG;

      SELECT COUNT (*)
        INTO cnt2
        FROM table2
       WHERE id = nid;

      IF cnt2 = 0 THEN
         DELETE FROM table1
               WHERE id = :old.id;
      END IF;
   END IF;
END;

DECLARE
   nid   NUMBER;
BEGIN
   INSERT INTO mydict (ORIGTERM, CODE, REPLACETERM, SYSCTLANG)
        VALUES ('Plant', 'TEST', 'Pflanze', 3);
    nid := mydict_seq.currval;


   UPDATE mydict
      SET REPLACETERM = 'Fabrik'
    WHERE id = nid;

   UPDATE mydict
      SET REPLACETERM = 'Usine', SYSCTLANG = 4
    WHERE id = nid;
END;

instead of触发器中的逻辑可以做得更好,但我将此留给您;)

使用
MERGE
语句怎么样?@psur您能告诉我怎么做吗?如何将其应用于我的问题?为什么这两个表:表1和表2被分开?
ID
列是这两个表之一的主键吗?为什么要使用这样的数据模型?第三个表是什么?如何获得
id
=100000的值?它是来自一个序列还是其他序列?请解释您需要更新哪个表,以及新数据来自何处,因为我迷路了。@kordirko表1包含未翻译的术语,表2包含已翻译的术语。这样的数据模型是给我的。第三个表是表1和表2的组合(查看最后隐藏的SQL查询)。ID是主键。当我在表1中插入ORIGTERM值时,ID将自动为我设置,换句话说,我不需要添加ID。我需要更新第三个表,但这是通过表1和表2完成的。如何使用
MERGE
语句?@psur您能告诉我如何操作吗?如何将其应用于我的问题?为什么这两个表:表1和表2被分开?
ID
列是这两个表之一的主键吗?为什么要使用这样的数据模型?第三个表是什么?如何获得
id
=100000的值?它是来自一个序列还是其他序列?请解释您需要更新哪个表,以及新数据来自何处,因为我迷路了。@kordirko表1包含未翻译的术语,表2包含已翻译的术语。这样的数据模型是给我的。第三个表是表1和表2的组合(查看最后隐藏的SQL查询)。ID是主键。当我在表1中插入ORIGTERM值时,ID将自动为我设置,换句话说,我不需要添加ID。我需要更新第三个表,但这是通过表1和表2完成的。我的SQL没有那么先进,请您解释一下您的代码好吗?什么将_标志声明为INT=0;do?声明一个INT类型的变量_标志,默认值为0。。。正确的语法可能会在SQL方言之间发生变化,但我很确定它会起作用。。如果你愿意,你可以把它分成两行。。。。将_标志声明为INT;设置_标志=0;在某些SQL方言中,您可以省略“AS”,因为我对SQL不是很在行,请您解释一下您的代码好吗?什么将_标志声明为INT=0;do?声明一个INT类型的变量_标志,默认值为0。。。正确的语法可能会在SQL方言之间发生变化,但我很确定它会起作用。。如果你愿意,你可以把它一分为二