2011-04-24 71 views
3

基本上我想將一個日期值傳遞給一個遊標,然後打印出每個找到的整個行/記錄。我遇到了麻煩,因爲a)我不知道我的日期是否在BEGIN部分中正確轉換,以及b)打印每一行時,我在調用'PUT_LINE'時出現「錯誤的參數數量或類型」。如何將日期值傳遞給plsql中的遊標?

這是我到目前爲止有:

DEFINE B_HIREDATE = 11-OCT-88 

DECLARE 
    cursor DATE_CUR (the_date DATE) is 
    select * from employees 
     where hire_date > to_date(the_date, 'dd-mon-yy') 
     order by hire_date; 

    r_emp DATE_CUR%ROWTYPE; 

BEGIN 
    for r_emp IN DATE_CUR('&B_HIREDATE') LOOP 
    dbms_output.put_line(r_emp); 
    end LOOP; 
END; 
/

我沒有得到任何輸出值,即使我改變我的select語句已知的單場名稱。

回答

3

不幸的是,您不能從單個DBMS_OUTPUT調用中打印出整行;您需要分別打印由光標返回的每列。 PUT_LINEexpects a VARCHAR2 argument或者可以隱式轉換的東西。您可以將多個值連接成一個呼叫。不錯的格式化並不容易。

日期轉換幾乎沒問題,但在遊標調用中您應該有TO_DATE,因爲遊標參數期望爲DATE;並且您應該在日期掩碼中使用RR而不是YY,或者最好使用4位數年份和掩碼YYYY

SET SERVEROUTPUT ON 
DEFINE B_HIREDATE = 11-OCT-1988 

DECLARE 
    cursor DATE_CUR (the_date DATE) is 
    select * from employees 
     where hire_date > the_date 
     order by hire_date;  
BEGIN 
    for r_emp IN DATE_CUR(TO_DATE('&B_HIREDATE','DD-MON-YYYY')) LOOP 
    dbms_output.put_line(r_emp.hire_date); 
    end LOOP; 
END; 

你並不需要顯式聲明r_emp與此遊標語法一個變量(但你與OPEN/FETCH/CLOSE版)。

如果您在SQL * Plus中運行此操作,則需要在開始時添加SET SERVEROUTPUT ON以允許顯示DBMS_OUTPUT調用。您也可以在SQL Developer中執行此操作,或者有一個單獨的窗格用於查看輸出,您需要爲工作表啓用該窗口。

相關問題