PL/SQL中忽略的SQL语句

PL/SQL中忽略的SQL语句,sql,oracle,plsql,Sql,Oracle,Plsql,所以我正在为oracledb编写一个函数,但是我得到了一个错误,说sql语句被忽略了,所以表达式丢失了 职能: CREATE OR REPLACE FUNCTION getQueueNumber (student IN VARCHAR,course IN CHAR) RETURN INT IS queuePosition INT; date TIMESTAMP; BEGIN SELECT waitingDate INTO date FROM Wai

所以我正在为oracledb编写一个函数,但是我得到了一个错误,说sql语句被忽略了,所以表达式丢失了

职能:

CREATE OR REPLACE FUNCTION getQueueNumber
(student IN VARCHAR,course IN CHAR) 
RETURN INT
IS
   queuePosition INT;
   date TIMESTAMP;
   BEGIN
       SELECT waitingDate INTO date
       FROM WaitingCourseStudent wcs 
       WHERE wcs.student=student AND wcs.course=course;
       IF SQL%NOTFOUND THEN queuePosition := NULL;
       ELSE
           SELECT COUNT(*) as pos
           INTO queuePosition
           FROM WaitingCourseStudent 
           WHERE waitingDate<=date;
      END IF;
      RETURN queuePosition;
END;

您可能正在寻找的是错误处理,而不仅仅是if

CREATE OR REPLACE FUNCTION getQueueNumber
  (p_student IN VARCHAR, p_course IN CHAR) 
RETURN INT
IS
  queuePosition INT;
  v_date TIMESTAMP;
BEGIN
   BEGIN
      SELECT waitingDate INTO v_date
      FROM WaitingCourseStudent wcs 
      WHERE wcs.student = p_student AND wcs.course = p_course;
   EXCEPTION
      WHEN NO_DATA_FOUND THEN RETURN NULL;
   END;

   SELECT COUNT(*) as pos
   INTO queuePosition
   FROM WaitingCourseStudent 
   WHERE waitingDate <= v_date;
   RETURN queuePosition;
END;
创建或替换函数getQueueNumber
(p_学生用瓦查尔语,p_课程用查尔语)
返回整数
是
队列位置INT;
v_日期时间戳;
开始
开始
选择waitingDate进入v_日期
来自WaitingCourseStudent wcs
其中wcs.student=p_学生,wcs.course=p_课程;
例外情况
如果未找到数据,则返回NULL;
结束;
选择计数(*)作为pos
进入队列位置
来自WaitingCourseStudent

其中waitingDate
选择waitingDate INTO date正确答案如下:

创建或替换函数getQueueNumber(vstudent在VARCHAR中,vcourse在CHAR中) 返回整数 是 队列位置INT; 日期1时间戳; 开始 从WaitingCourseStudent中选择waitingDate INTO date1,其中student=vstudent,course=vcourse; 如果找不到SQL%n,则 queuePosition:=NULL; 其他的
从WaitingCourseStudent中选择COUNT(*)进入queuePosition,其中waitingDate请避免使用保留字声明变量。日期是一个保留字。此外,请避免将参数命名为与列完全相同的名称。将参数命名为与列相同的名称,但在SQL中使用函数名对其命名。ie“wcs.student=getQueueNumber.student”出于性能原因,您可能还应该将两个查询合并为一个查询。在第二个查询中,您不需要对课程应用谓词,或者您正在计算所有课程。@Davidardridge啊,忘了课程,当然我也应该检查一下。啊!不知道你能做到,工作很完美:)。不过我有一些问题。变量的重命名是否意味着什么,或者您只是不喜欢这些名称。还有,为什么有两个BEGIN/END?@SiXoS调整了我的答案。如果在SQL语句中使用参数时,使用函数名对参数进行名称命名,则无需重命名这些参数。“wcs.student=getQueueNumber.student”
CREATE OR REPLACE FUNCTION getQueueNumber
  (p_student IN VARCHAR, p_course IN CHAR) 
RETURN INT
IS
  queuePosition INT;
  v_date TIMESTAMP;
BEGIN
   BEGIN
      SELECT waitingDate INTO v_date
      FROM WaitingCourseStudent wcs 
      WHERE wcs.student = p_student AND wcs.course = p_course;
   EXCEPTION
      WHEN NO_DATA_FOUND THEN RETURN NULL;
   END;

   SELECT COUNT(*) as pos
   INTO queuePosition
   FROM WaitingCourseStudent 
   WHERE waitingDate <= v_date;
   RETURN queuePosition;
END;
CREATE OR REPLACE FUNCTION getQueueNumber
  (p_student IN VARCHAR, p_course IN CHAR) 
RETURN INT
IS
  queuePosition INT;
  v_date TIMESTAMP;
BEGIN
   SELECT waitingDate INTO v_date
   FROM WaitingCourseStudent wcs 
   WHERE wcs.student = p_student AND wcs.course = p_course;

   SELECT COUNT(*) as pos
   INTO queuePosition
   FROM WaitingCourseStudent 
   WHERE waitingDate <= v_date;
   RETURN queuePosition;

EXCEPTION
   WHEN NO_DATA_FOUND THEN RETURN NULL;
END;
SELECT waitingDate INTO date <--- (date is reserved keyword for denoting oracle datatype of date)
FROM WaitingCourseStudent wcs 
   WHERE wcs.student=student AND wcs.course=course;
   IF SQL%NOTFOUND THEN queuePosition := NULL;