2015-04-19 66 views
0

我試圖創建一個塊,它接受來自提示的輸入並使用該輸入來過濾遊標的結果集。請記住,我是新手,所以我可能會犯一個常規錯誤,並感謝您的幫助。我目前的代碼如下。試圖在遊標創建(PL/SQL)中使用where語句

Set serveroutput on 

DECLARE 
    ACCEPT a PROMPT 「Please Enter a Date, eg. Format - 01 or 30" 

    datev char 
    datev := &a; 

    CURSOR cur_day_cursor IS 
    SELECT Arrival_Date Adate 
     FROM FLIGHT 
     WHERE TO_CHAR(Arrival_Date, ‘DD’) = datev; 

    cur_day_cursor_var cur_day_cursor%ROWTYPE; 
BEGIN 
    OPEN Cur_day_cursor; 

    LOOP 
    Fetch Cur_day_cursor 
     INTO cur_day_cursor_var; 
    EXIT WHEN cur_day_cursor%NOTFOUND; 

    DBMS_OUTPUT.PUT_LINE (cur_day_cursor_var.Adate); 
    END LOOP; 

    IF cur_day_cursor%ISOPEN THEN 
    CLOSE cur_day_cursor; 
    END IF; 
END; 

的where語句引起我的錯誤,所以我在想,我可能不得不讓光標收集的所有數據並顯示,當然後過濾,但我不知道如果我甚至可以這樣做。

我一直在線路接收ERROR 9錯誤: - ORA-06550:第9行,第1列: PLS-00103:出現符號 「WHERE」 在需要下列之一時: 開始功能編譯程序亞型鍵入 當前光標刪除 之前存在

回答

0

我不確切地知道Oracle爲什麼會報告WHERE的錯誤。有時解析器會因語法錯誤而感到困惑,並且不會指出真正的問題。在遊標定義之前你有幾個語法錯誤。

ACCEPT是一個SQLPlus命令,而不是PL/SQL語句。將您的ACCEPT行移動到DECLARE以上。

此外,您的變量聲明和初始化不正確。該任務應該是宣言行的一部分;您需要提供CHAR數據類型的長度;並且替代值應該在引號中被視爲字符串。你行的有效版本是:

datev char(2) := '&a'; 
+0

對不起,「接受提示」請輸入日期,例如格式 - 01或30「部分代碼,放在我的初始代碼的聲明部分之前。爲了讓代碼運行,我只是搞了一些東西。 我已經嘗試了建議的解決方案,但我運行到哪裏腳本輸入提示的變量(DATEV) 截圖之後掛一個問題 - http://i.imgur.com/kFCsV5Z.jpg –

+0

您發佈代碼在PL/SQL塊之後沒有斜線,這是實際執行它所需的。所以可能只是SQLPlus正在等待更多的輸入。在最後的'END;'後面自行添加'/'。另一種可能性就是查詢驅動循環需要很長時間才能執行,但我認爲在這種情況下這是值得懷疑的。 –

0

看來,問題是,圍繞‘DD’單引號不是單引號。它看起來像代碼是在一個編輯器中創建的,它將撇號轉變爲那些特殊的「看起來像單引號但不是真正的」字符。將原始版本的WHERE子句替換爲以下內容:

WHERE TO_CHAR(Arrival_Date, 'DD') = datev; 

我懷疑你會沒事的。

並讓自己一個很好的代碼編輯器。 :-)

分享和享受。

0

我跑了與上面相同的查詢,並得到了很好的結果。 你有幾個語法以及我在你的查詢中糾正的邏輯錯誤。語法錯誤是 -

datev char 
datev := &a; 

你不能在PL/SQL中做這樣的初始化。你可能要完成它在一個單行像下面 -

datev char := &a; 

邏輯錯誤(S)是 -

  1. 爲什麼使用CHAR變量來存儲數據,當您知道返回的值是NUMBER。
  2. 你期望1-31的數字;那你爲什麼選擇char的默認大小爲1。如果你提供一個2位數的數字,它會失敗
  3. 即使你將CHAR的大小增加到CHAR(2),當用戶輸入一個數字如1或01時,你也不會得到結果,因爲爲了明智的比較, '1'!='1'(由於char(2),最後標出額外的空格);也'1'!='01'。 上面的唯一解決方案是使用NUMBER數據類型。

現在,我發佈與查詢類似的查詢,並更改列名和表名。請用您的必需名稱替換,並嘗試使用PL/SQL塊 - (注意不要執行ACCEPT ....)。它應該先在SQL提示符下完成,然後運行另一個DECLARE部分。

--ACCEPT a NUMBER PROMPT 'Please Enter a Date, eg. Format - 01 or 30 :' 
--Run the above line first in SQL Prompt and then execute the rest as whole 
DECLARE 
    datev NUMBER(2) := &a; 
    CURSOR cur_day_cursor IS 
    SELECT Ename, HireDate Adate 
     FROM Emp 
     WHERE TO_CHAR(HireDate, 'D') = datev; 
    cur_day_cursor_var cur_day_cursor%ROWTYPE; 
BEGIN 
    OPEN Cur_day_cursor; 
    LOOP 
    Fetch Cur_day_cursor 
     INTO cur_day_cursor_var; 
    EXIT WHEN cur_day_cursor%NOTFOUND; 
    DBMS_OUTPUT.PUT_LINE (cur_day_cursor_var.Adate); 
    END LOOP; 
    IF cur_day_cursor%ISOPEN THEN 
    CLOSE cur_day_cursor; 
    END IF; 
END; 
/