2011-03-17 26 views
0
Create or replace package body file as 

procedure filehandler as 
declare 

V_PERSON PERSON%ROWTYPE; 

FID UTL_FILE.FILE_TYPE; 
FOLDER_NAME VARCHAR(50) := 'GID_FILE'; 
FILE_NAME VARCHAR(50) :='bhanu.txt'; 

cusor test_persondetails is 

select personid, personnum,fullnm from person where rownum<=10; 

begin 

open test_persondetails; 

FID := UTL_FILE.FOPEN (FOLDER_NAME, FILE_NAME, 'A'); 

fetch test_persondetails into V_person; 

DBMS_OUTPUT.PUT_LINE(V_PERSON); 

UTL_FILE.PUT_LINE (FID,V_PERSON); 

UTL_FILE.FCLOSE (FID); 

close test_persondetails; 

end test_filehandler; 

end test_file; 

我收到有關取聲明瞭一些錯誤,可以請你建議我可以做的是代碼的變化......ROWTYPE並獲取命令錯誤

+0

不需要大寫所有字母!還有一個錯字(CUSOR而不是CURSOR)。 – Benoit 2011-03-17 10:35:33

+2

「有些錯誤」並不完整。這些錯誤有數字和文字,可能有助於我們理解它們是什麼... – 2011-03-17 11:18:35

回答

0

我的猜測是,表包含多於3個列的選擇,因此試圖將這3列讀取到一個記錄中,其結構中包含表的所有列都將失敗。將記錄定義更改爲:

V_PERSON test_persondetails%rowtype; 

並移至光標定義後面。

1

你需要告訴我們哪些錯誤你得到,因爲看你的來源有潛在的很多。

例如,您的光標最多可以選擇10行。但是,您並未執行循環,因此如果PERSON表中有多行,您的讀取操作將拋出TOO_MANY_ROWS。

另外,您需要顯式引用遊標的各個元素,而不是%ROWTYPE變量。

此外,查詢的投影必須與您獲取的變量(列數,列數據類型等)匹配。使用CURSOR FOR語法更容易,讓Oracle爲我們處理它。這也解決了TOO_MANY_ROWS問題。

所以我會重寫你的代碼看起來像這樣:

procedure filehandler as 


    FID UTL_FILE.FILE_TYPE; 
    FOLDER_NAME VARCHAR(50) := 'GID_FILE'; 
    FILE_NAME VARCHAR(50) :='bhanu.txt'; 

begin 

    FID := UTL_FILE.FOPEN (FOLDER_NAME, FILE_NAME, 'A'); 

    for V_PERSON in (select personid, personnum,fullnm 
         from person where rownum<=10) 
    loop 

     DBMS_OUTPUT.PUT_LINE(V_PERSON.personid); 

     UTL_FILE.PUT_LINE (FID,V_PERSON.personid 
       ||' '||V_PERSON.personnum 
       ||' '||V_PERSON.fullnm); 

    end loop; 

    UTL_FILE.FCLOSE (FID); 

end test_filehandler; 

打開和關閉文件的每一行是沒有錯的,只是慢於需要的話。