Plsql PL/SQL错误无法识别错误是什么,PSL-00103

Plsql PL/SQL错误无法识别错误是什么,PSL-00103,plsql,oracle11g,syntax-error,Plsql,Oracle11g,Syntax Error,我被要求编写一个简单的过程,在一定条件下将新行插入表中。 数据库: 表用户-用户id。。。。 表轨道-轨道id。。。。 表-用户id、跟踪id 该过程必须确保用户在用户中,曲目在曲目中,但二者不会出现在表中的同一条记录中 不知道错误来自哪里,请帮助 错误列表: 错误(72,1):PLS-00103:遇到符号“声明” 错误(77,4):PLS-00103:在预期以下情况之一时遇到符号“文件结束”:(begin case declare end exception exit for goto if

我被要求编写一个简单的过程,在一定条件下将新行插入表中。 数据库: 表用户-用户id。。。。 表轨道-轨道id。。。。 表-用户id、跟踪id

该过程必须确保用户在用户中,曲目在曲目中,但二者不会出现在表中的同一条记录中

不知道错误来自哪里,请帮助

错误列表: 错误(72,1):PLS-00103:遇到符号“声明”
错误(77,4):PLS-00103:在预期以下情况之一时遇到符号“文件结束”:(begin case declare end exception exit for goto if loop mod null pragma raise return select update when with如果您将所有这些作为一个脚本运行,则在过程定义的
end;
和匿名块的
declare
之间需要一个
//code>。您应该在第二个
end之后添加一个
终止并提交匿名块,但看起来您的客户机假设应该有一个匿名块。(我猜这是SQL开发人员?)

一旦启动PL/SQL块,分号就只是PL/SQL语句分隔符。即使在最后一个
end;
之后,分号也不会作为整个块的终止符

您可以,这在很大程度上也适用于SQL开发人员


顺便说一句,当其他人
捕获异常时使用
通常不是一个好主意,即使您通过自己的
raise
报告了实际的错误。您正在丢失堆栈跟踪,这将为您提供更多上下文,并帮助您准确识别错误发生的位置。

另一种方法是使用连接来确保e确保满足要求,而不是打开一堆游标:

CREATE OR REPLACE PROCEDURE PROC_INSERT_LIKED
  (p_userID IN LIKED.USER_ID%TYPE,
   p_trackID IN LIKED.TRACK_ID%TYPE)  AS
BEGIN
  -- The procedure must ensure that a user is in users, the track is in tracks,
  -- but both don't appear in the same record in the table Liked.

  FOR aRow IN (SELECT *
                 FROM (SELECT *
                         FROM USERS
                         WHERE USER_ID = p_userID) u
                 INNER JOIN (SELECT *
                               FROM TRACKS
                               WHERE TRACK_ID = p_trackID) t
                   ON (1 = 1)
                 LEFT OUTER JOIN (SELECT *
                                    FROM LIKED
                                    WHERE USER_ID = p_userID AND
                                          TRACK_ID = p_trackID) l
                   ON (1 = 1)
                 WHERE l.USER_ID IS NULL AND
                       l.TRACK_ID IS NULL)
  LOOP
    INSERT INTO LIKED(USER_ID, TRACK_ID)
      VALUES (p_userID, p_trackID);
    EXIT;
  END LOOP;
END PROC_INSERT_LIKED;
这假设用户ID是用户上的主键(或至少是唯一的);轨迹ID是主轨迹或唯一轨迹;并且(用户ID,轨迹ID)的组合是主轨迹或唯一轨迹

工作方式/原因:需要用户表中的数据,因此我们首先获取它(可以使用同样简单的轨迹优先-没有特别的理由选择其中一个)。还需要轨迹,因此需要内部笛卡尔连接(即无连接条件)它对用户来说-在这种情况下这样做是安全的,因为我们使用主键子查询轨迹,所以在连接行时,我们已经得到了我们关心的单行。like使用主键子查询,然后外部笛卡尔连接到以前的结果-这样,即使没有匹配,我们也会得到结果ng轨道上的行(这毕竟是我们想要的)。我们检查WHERE子句以确保来自LIKED子查询的USER_ID和TRACK_ID为NULL,这意味着在LIKED上找不到给定USER_ID和TRACK_ID的行。因此,如果此查询返回一行,我们知道USERS中有数据匹配
p_userID
,TRACKS中有数据匹配
p_trackID
,并且re中没有与这对
(p\u userID,p\u trackID)
匹配的数据


共享和享受。

另外-建议不要将对象创建和执行包含在同一文件中。
...
EXCEPTION
WHEN OTHERS THEN
   raise_application_error(-20001,'An error was encountered - '||SQLCODE||' -ERROR-      '||SQLERRM);
    END;
/

Declare
  prompt_user_id liked.user_id%Type :=4795;
...
end;
/
CREATE OR REPLACE PROCEDURE PROC_INSERT_LIKED
  (p_userID IN LIKED.USER_ID%TYPE,
   p_trackID IN LIKED.TRACK_ID%TYPE)  AS
BEGIN
  -- The procedure must ensure that a user is in users, the track is in tracks,
  -- but both don't appear in the same record in the table Liked.

  FOR aRow IN (SELECT *
                 FROM (SELECT *
                         FROM USERS
                         WHERE USER_ID = p_userID) u
                 INNER JOIN (SELECT *
                               FROM TRACKS
                               WHERE TRACK_ID = p_trackID) t
                   ON (1 = 1)
                 LEFT OUTER JOIN (SELECT *
                                    FROM LIKED
                                    WHERE USER_ID = p_userID AND
                                          TRACK_ID = p_trackID) l
                   ON (1 = 1)
                 WHERE l.USER_ID IS NULL AND
                       l.TRACK_ID IS NULL)
  LOOP
    INSERT INTO LIKED(USER_ID, TRACK_ID)
      VALUES (p_userID, p_trackID);
    EXIT;
  END LOOP;
END PROC_INSERT_LIKED;