簡體   English   中英

PL / SQL中忽略的SQL語句

[英]SQL statements ignored in PL/SQL

所以我正在為oracle db寫一個函數,但是我收到錯誤消息說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;

完整的錯誤消息:

LINE/COL    ERROR
8/5     PL/SQL: SQL Statement ignored
8/29    PL/SQL: ORA-00936: missing expression
13/9    PL/SQL: SQL Statement ignored
16/20   PL/SQL: ORA-00936: missing expression 

您可能正在尋找的是錯誤處理,而不只是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;

內部的BEGIN / END用於異常處理。 異常只能在BEGIN / END塊內處理,並且由於您需要在異常之后做一些事情,因此您需要一個內部BEGIN / 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;

替代建議:

給變量加上v_或類似的前綴,以免發生此類錯誤。

正確答案如下:

創建或替換函數getQueueNumber(vstudent in VARCHAR,vcourse in CHAR)返回INT是queuePosition INT; date1 TIMESTAMP; 從WaitingCourseStudent那里選擇SELECT WaitingDate到date1那里,學生= vstudent和課程= vcourse; 如果SQL%NOTFOUND THEN queuePosition:= NULL; 其他選擇COUNT(*)進入queuePosition from WaitingCourseStudent WHEREwaitingDate <= date1; 萬一; RETURN queuePosition; 當no_data_found然后返回-1時發生異常; 當其他人返回-1時; 結束;

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM