[英]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.