Oracle PL/SQL:ORA-00936:缺少表达式::代码中的错误在哪里?

Oracle PL/SQL:ORA-00936:缺少表达式::代码中的错误在哪里?,oracle,syntax-error,Oracle,Syntax Error,我需要在我的数据库中添加一条新记录,或者更新它(如果它已经存在)。 我使用了IF-else子句。 我有一个针对oracle数据库的SQL查询,如下所示: DECLARE EXISTS number; BEGIN SELECT count(*) INTO EXISTS FROM reports WHERE report_id=27; IF(EXISTS =0) THEN INSERT INTO reports (REPORT_ID,TITLE,CATEGORY,DISPLAY_ORDER,QUE

我需要在我的数据库中添加一条新记录,或者更新它(如果它已经存在)。 我使用了IF-else子句。 我有一个针对oracle数据库的SQL查询,如下所示:

DECLARE EXISTS number;
BEGIN
SELECT count(*) INTO EXISTS
FROM reports
WHERE report_id=27;

IF(EXISTS =0) THEN
INSERT INTO reports (REPORT_ID,TITLE,CATEGORY,DISPLAY_ORDER,QUERY,DESCRIPTION,CONTENT_SEQ,DELD,ADMIN_ID,DATE_UPD)
VALUES (27,
        'Check user entered keywords have valid resource link',
        'zData checks',
        9120,
        'Select Rk.Resource_Id As "Resource IDs", Rp.Display_Title As "Title", St.Title As "Type", 
        Decode(Rp.Deld, Null, ''Missing resource'',''Resource deleted (DELD is '' || Rp.Deld || '')'') As "Reason",
        rk.keyword,L.Email As "Owner" from resource_keywords rk
        Left Join Resources Rp On rk.Resource_Id = Rp.Resource_Id
        Left Join Special_Types St On Rp.Special_Id = St.Special_Id
        Left Join Login L On rk.Admin_Id = L.Login_Id
        Where Rk.Deld = 0 And (Rp.Resource_Id Is Null Or Rp.Deld Is Null Or Rp.Deld <> 0);',
        'Check resource_keywords entries for valid and not deleted resource_id.',
        1,
        0,
        1,
        CURRENT_TIMESTAMP);

ELSE
UPDATE reports
SET TITLE = 'Check user entered keywords have valid resource link',
    CATEGORY = 'zData checks',
    DISPLAY_ORDER= 9120,
    QUERY ='Select Rk.Resource_Id As "Resource IDs", Rp.Display_Title As "Title", St.Title As "Type", 
                Decode(Rp.Deld, Null, ''Missing resource'',''Resource deleted (DELD is '' || Rp.Deld || '')'') As "Reason",
                rk.keyword,L.Email As "Owner" from resource_keywords rk
                Left Join Resources Rp On rk.Resource_Id = Rp.Resource_Id
                Left Join Special_Types St On Rp.Special_Id = St.Special_Id
                Left Join Login L On rk.Admin_Id = L.Login_Id
                Where Rk.Deld = 0 And (Rp.Resource_Id Is Null Or Rp.Deld Is Null Or Rp.Deld <> 0);',
    DESCRIPTION='Check resource_keywords entries for valid and not deleted resource_id.',
    CONTENT_SEQ=1,
    DELD=0,
    ADMIN_ID=1,
    DATE_UPD = CURRENT_TIMESTAMP
WHERE REPORT_ID = 27;
END IF;
END;
我哪里做错了

ORA-06550:第3行第22列: PL/SQL:ORA-00936:缺少表达式

Oracle很清楚地告诉您错误在哪里。您只需要查看错误详细信息,特别是行号

第3行将带您进入
选择count(*)进入EXISTS
第22列将带您进入
存在
。它是保留关键字,因此不能直接使用

如果您真的想使用它,请将它括在双引号内。比如说,

SQL> DECLARE
  2    "EXISTS" NUMBER;
  3  BEGIN
  4    SELECT COUNT(*) INTO "EXISTS" FROM emp;
  5    dbms_output.put_line("EXISTS");
  6  END;
  7  /
14

PL/SQL procedure successfully completed.

SQL>

但是,我坚持不使用保留关键字。请使用其他变量名。

请将关键字EXISTS括在双引号内,或使用其他名称。请看我的答案中的一个例子。非常感谢@lalit:)的详细解释。我将有一个.sql文件,它将包含我上面提到的大约15-16个这样大的查询。这需要在1次运行时没有错误。不幸的是,当我尝试运行此命令时,我遇到一个错误ORA-06550:第97行第1列:PLS-00103:遇到符号“DECLARE”我不能使用DECLARE关键字两次吗(您必须在结束后用斜杠
/
结束每个匿名块的作用域。就像我在上面的答案示例中所做的那样。
SQL> DECLARE
  2    "EXISTS" NUMBER;
  3  BEGIN
  4    SELECT COUNT(*) INTO "EXISTS" FROM emp;
  5    dbms_output.put_line("EXISTS");
  6  END;
  7  /
14

PL/SQL procedure successfully completed.

SQL>