Sql Oracle PLS-00103错误。如何检查现有记录并根据该条件进行更新或插入?

Sql Oracle PLS-00103错误。如何检查现有记录并根据该条件进行更新或插入?,sql,oracle,plsql,upsert,ora-00900,Sql,Oracle,Plsql,Upsert,Ora 00900,我需要检查表中是否存在SELECT语句中的记录。如果记录存在,则执行更新,否则在表上创建记录。我正在尝试,但我得到了PLS-00103错误 以下是在DBVisaulzier中运行代码时遇到的错误: 18:00:09 [DECLARE - 0 row(s), 0.000 secs] [Error Code: 6550, SQL State: 65000] ORA-06550: line 2, column 12: PLS-00103: Encountered the symbol "end-

我需要检查表中是否存在SELECT语句中的记录。如果记录存在,则执行更新,否则在表上创建记录。我正在尝试,但我得到了
PLS-00103
错误

以下是在DBVisaulzier中运行代码时遇到的错误:

18:00:09  [DECLARE - 0 row(s), 0.000 secs]  [Error Code: 6550, SQL State: 65000]  ORA-06550: line 2, column 12:
PLS-00103: Encountered the symbol "end-of-file" when expecting one of the following:

:= . ( @ % ; not null range default character
18:00:09  [BEGIN - 0 row(s), 0.000 secs]  [Error Code: 6550, SQL State: 65000]  
ORA-06550: line 2, column 97:
PLS-00103: Encountered the symbol "end-of-file" when expecting one of the following:

;
18:00:09  [IF - 0 row(s), 0.000 secs]  [Error Code: 900, SQL State: 42000]  ORA-00900: invalid SQL statement
18:00:09  [ELSE - 0 row(s), 0.000 secs]  [Error Code: 900, SQL State: 42000]   
ORA-00900: invalid SQL statement
18:00:09  [END - 0 row(s), 0.000 secs]  [Error Code: 900, SQL State: 42000]  ORA-00900: invalid SQL statement
18:00:09  [END - 0 row(s), 0.000 secs]  [Error Code: 900, SQL State: 42000]  ORA-00900: invalid SQL statement
... 6 statement(s) executed, 0 row(s) affected, exec/fetch time: 0.000/0.000 sec  [0 successful, 0 warnings, 6 errors]
以下是我的代码:

DECLARE a NUMBER;

BEGIN

  SELECT 1 
    INTO a 
    FROM FREC_EMAIL t
   WHERE t.FranchiseNo = '208254846' 
     AND t.ReportID = 1 
     AND t.id = 165;

  IF a=1 THEN

       UPDATE FREC_EMAIL
          SET email = 'blah@foo.com'
        WHERE FranchiseNo = '208254846' 
          AND ReportID = 1 
          AND ID = 165;

    ELSE

        INSERT INTO FREC_EMAIL
          (FranchiseNo, Email, ReportID)
         VALUES
           ('208254846', 'blah@foo.com', 1);

    END IF;
END;

在pl/sql块中,可以执行以下操作:

更新表集合列=。。。。 在哪里

如果SQL%ROWCOUNT=0,则 插入。。。。。。 如果结束


K

使用MERGE命令(有些人也称为upsert)。Oracle的参考(带示例)。

我们应该尽可能始终使用SQL,除非绝对必要,否则应避免使用Pl/SQL。SQL语句执行速度更快,它们通常需要更少的键入,而且更容易获得正确的结果

因为9i Oracle提供了MERGE,一条执行“upsert”语句的SQL语句

MERGE INTO frec_email t
USING (SELECT  'blah@foo.com' as email
                ,  '208254846' as FranchiseNo
                , 1 as ReportID
                , 165 as ID 
       FROM dual ) s
ON (s.ID = t.ID)
WHEN MATCHED THEN
     UPDATE SET t.email = s.email
WHEN NOT MATCHED THEN
    INSERT (t.FranchiseNo, t.Email, t.ReportID)
    VALUES  (s.FranchiseNo, s.Email, s.ReportID)
/

另一方面,如果你是甲骨文的新手,那么花点时间与官员打交道是值得的。虽然从哪里开始可能看起来很困难,但汤姆·凯特的书店是一个获取必读书目的好地方


祝你好运

我通常使用以下概念,我认为这比合并更具可读性:

BEGIN

  UPDATE FREC_EMAIL
     SET email = 'blah@foo.com'
   WHERE FranchiseNo = '208254846' 
     AND ReportID = 1 
     AND ID = 165;

  IF SQL%NOTFOUND THEN
    INSERT INTO FREC_EMAIL
          (FranchiseNo, Email, ReportID, ID)
      VALUES
          ('208254846', 'blah@foo.com', 1, 165);
  END IF;

END;

考虑使用合并语句。你能给我举个例子吗?很抱歉这么问,但对于PL/SQL,我是个新手。看起来编译器在抱怨一些事情。是否可以尝试将SELECT 1更改为,将SELECT ID更改为?ORA错误表明有人试图运行无效的SQL语句。“选择1进入…”没有什么错-我认为问题是由于Jack试图将此作为匿名存储过程运行。可能是SQLPlus结尾缺少“/”的问题…您好,谢谢您的帮助。我认为我不理解SQL%ROWCOUNT=0部分。你能给我举个简单的例子吗?请原谅一个sql新手。@Jack:sql%ROWCOUNT表示有多少行受到上一条语句的影响。本例中的上一条语句是update语句。这里的逻辑是,如果零记录受到记录更新的影响,则记录本身必须不存在。在这种情况下,插入记录是安全的。感谢您提供的示例,但当我在DbVisualizer中执行上述操作时。它给了我10:14:13[合并-0行,0.000秒][错误代码:905,SQL状态:42000]ORA-00905:缺少关键字。。。执行1条语句,影响0行,执行/获取时间:0.000/0.000秒[0成功,0警告,1错误]我认为该语句是正确的。你知道为什么在缺少关键字时出错吗?Jack-这是一个语法错误:它不匹配,而不是UMATCHED。我没有创建一个表来测试代码,这对我来说真是太好了。抱歉。APC,你如何在ID之外的其他条件下进行测试?ID是电子邮件表ID,但我还想测试ReportID,它与另一个名为Reports的表相关联。update工作正常,但是如果ID为空,那么创建记录的notmatched子句似乎不工作。我正在Oracle Apex中使用此sql块来更新或插入记录。感谢您提供了一个示例,我不知道它是9i feature.APC,不用担心。我知道了。如果没有电子邮件ID,我将为ID传入0。