2016-08-21 44 views
1
DECLARE 

A_NAME STUDENTS_1.NAME%TYPE; 
B_NAME STUDENTS_1.NAME%TYPE; 
C_NAME STUDENTS_1.NAME%TYPE; 
GRADE_ST STUDENTS_1.GRADE%TYPE; 


CURSOR A IS SELECT NAME FROM STUDENTS_1 WHERE REGEXP_LIKE(GRADE,'(A)','i'); 
CURSOR B IS SELECT NAME FROM STUDENTS_1 WHERE REGEXP_LIKE(GRADE,'(B)','i'); 
CURSOR C IS SELECT NAME FROM STUDENTS_1 WHERE REGEXP_LIKE(GRADE,'(C)','i'); 


BEGIN 
GRADE_ST:= &CHOICE; 


IF (GRADE_ST='A') THEN 

OPEN A; 
LOOP 

FETCH A INTO A_NAME; 

EXIT WHEN A%NOTFOUND; 

INSERT INTO SCHOLARSHIP_A VALUES(A_NAME); 

END LOOP; 
CLOSE A; 


ELSIF (GRADE_ST='B') THEN 

OPEN B; 
LOOP 

FETCH B INTO B_NAME; 

EXIT WHEN B%NOTFOUND; 

INSERT INTO SCHOLARSHIP_B VALUES(B_NAME); 

END LOOP; 
CLOSE B; 


ELSE 

OPEN C; 
LOOP 

FETCH C INTO C_NAME; 

EXIT WHEN C%NOTFOUND; 

INSERT INTO SCHOLARSHIP_C VALUES(C_NAME); 

END LOOP; 

CLOSE C; 



END IF; 

END; 

/

我正在三個不同的學術表與等級A,B,C,如果我的用戶輸入值,而不是等級我發現瞭解決方案,但我不t要給值作爲用戶輸入我想用戶輸入應該是等級 就像我輸入A我應該從表 得到所有等級A的名字,但我結束了這個錯誤PLS-00382:表達式是錯誤的類型的在光標

+0

btw'for r in(從y選擇x,其中z)loop'構造可以節省大量代碼,並且通常更加高效和可靠。或者你可以在純SQL中用'insert when ...'(多表插入)來完成整個事情。 –

回答

2

您正在使用替代變量(&choice)傳入參數。這是一個SQL * Plus功能;您需要在編譯代碼之前傳入值,然後在代碼塊中進行硬編碼。相反,你需要的是一個綁定變量(:choice),或者將其寫爲一個採用in參數的過程。

4

在分析PL/SQL塊之前,SQL * Plus或SQL Developer正在替換choice變量值,並且@mathguy建議可能最終並不是您想要的。但是,如果您有set verify on,您將能夠看到實際正在編譯的代碼,並且會看到導致此錯誤的代碼;這一部分:

BEGIN 
GRADE_ST:= &CHOICE; 

結束實際上正在,如果用戶提供值A

BEGIN 
GRADE_ST:= A; 

和在此範圍內是A遊標名。所以這是一個無效的賦值,一個遊標到一個字符串;因此你得到的錯誤。

因爲你choice是char /串,你需要放在引號,所以你應該做的:

BEGIN 
GRADE_ST:= '&CHOICE'; 

你可以大大簡化你在做什麼,而實際上並不需要PL/SQL,但這超出了你的問題的範圍。

+0

非常感謝你現在的工作 –

+0

哈!好 - 我甚至沒有看光標名稱。只有在閱讀完本文後,我才意識到事實上我沒有回答OP的問題。 – mathguy

相關問題