2016-05-17 101 views
0

我試圖從外部文件解析文本並將其插入到表中。在獲取字符串到變量v我想分裂使用雙重字符串,但不知道如何做到這一點?plsql解析來自文本文件的輸出並插入表

什麼是各種替代品,我可以按照解決這個問題和最好的方式來實現這一點?

下面我試過,但給誤差「錯誤的數量或類型的呼叫‘PUT_LINE’參數」,據我所知,putline無法顯示該行鍵入接下來的問題是什麼,我應該聲明變量聲明捕獲雙重聲明的輸出?

另外我的問題是描述顯示爲varchar2(1)雙重,那麼它應該如何保存到一些varchar?

請解釋一下嗎?

set serveroutput on; 
create or replace directory USER_DIR as 'e:\projects\sql'; 
declare 
    v varchar2(200); 
    f utl_file.file_type; 
    element varchar2(200); 
begin 
    f := utl_file.fopen('USER_DIR','test.txt','R'); 
    if utl_file.is_open(f) then 
    loop 
     begin 
     utl_file.get_line(f,v); 
     dbms_output.put_line(v); 
     for element in (select regexp_substr(v,'[^\t]+',1,level) from dual connect by regexp_substr(v,'[^\t]+',1,level) is not null) 
      loop 
      begin 
       dbms_output.put_line(element); 
      end; 
      end loop; 
     exception when no_data_found then exit; 
     end; 
     end loop; 
    end if; 
    utl_file.fclose(f); 
end; 
/
set serveroutput off; 
+1

這是轉讓嗎?如果不是,你有沒有考慮使用外部表? –

回答

1

你需要給生成的expression列別名,然後參考該名稱作爲記錄字段:

for elements in (select regexp_substr(v,'[^\t]+',1,level) as element 
     from dual connect by regexp_substr(v,'[^\t]+',1,level) is not null) 
     loop 
     begin 
      dbms_output.put_line(elements.element); 
     end; 
     end loop; 

element變量,你明確聲明不使用;循環變量名覆蓋它。

dual表具有一個稱爲dummy的單字符列,並且總是隻有一行。您不使用該列,因此其大小無關緊要。你從單行中選擇一個表達式,這樣就限制了你得到的結果。

此構造可以使用任何單行表,它只是傳統的使用dual,因爲它總是存在已知數量,優化程序也知道它可以專門處理,因此它可以比使用自己的表更有效。

相關問題