2015-09-27 185 views
0

我想從sql server上的varchar2(8000)文本字段插入數據。我在oracle數據庫上創建了一個類似的列,但是clob數據類型。你能幫我解決不一致的數據類型問題並提高查詢的性能嗎? 請讓我知道是否有其他更好的方法來插入多行的大文本文件。當我在sql server和oracle db上運行相同的查詢(即從TBL_NOTES @ PPRLEG選擇「註釋」)時,結果會很快被檢索到。當我嘗試插入數據時,需要花費很多時間並且不會結束。我應該只在這裏給出包含clobs的列,並且它應該處理剩下的部分。通過數據庫鏈接在Oracle數據庫中插入CLOB數據類型

CREATE OR REPLACE FUNCTION get_clob_data 
(id in TBL_NOTES.id%TYPE, 
REPORT_ID in TBL_NOTES.REPORT_ID%type, 
UNIQUE_ID in TBL_NOTES.UNIQUE_ID%type, 
USER_ID in TBL_NOTES.USER_ID%type, 
DTS in TBL_NOTES.USERROLE%type, 
USEREIN in TBL_NOTES.USERROLE%type 
) 
RETURN varchar2 
    IS 
    l_text varchar2(4000); 
    Type t_note_txt IS TABLE OF TBL_NOTES.NOTE%type; 
    v_notes t_note_txt; 
BEGIN 
SELECT ltrim(rtrim("NOTE"))NOTE 
bulk collect into v_notes 
FROM [email protected]; 
    for indx in 1..v_notes.count 
    loop 
    l_text := l_text || ' ' ||v_notes(indx); 
    end loop; 

RETURN l_text; 
END; 

/

+0

afaik sql server沒有varchar2數據類型。你爲什麼在這裏使用一個函數?這個功能如何工作,你將輸出限制爲4000個字符,但選擇整個遠程表?如果你想提供更多的細節,幫助會更容易。遠程表的定義,行數,你試圖完成什麼。 –

+0

我們正在嘗試將sql server數據2008 R2遷移到Oracle 11 g數據庫。我們試圖使用dblink插入行(count-379012),但是在sql server上有大文本的字段,它有一個性能問題。我們爲一個這樣的表創建了CLOB數據類型(TBL_NOTES),並且我們試圖執行批量收集這裏的操作.SQL服務器上的字段「Note」是文本數據類型,Oracle端的字段是CLOB數據類型。我對這種遷移非常陌生,因此尋找對此的修復。請注意,我們有非常大的文本文件和多個clob數據類型。 – user3296391

+0

TBL_NOTES - 注 - sql服務器上的文本數據類型。 TBL_NOTES-注意 - Oracle379012上的CLOB數據類型是sql server中的行數。定義遠程表 - ID-int,REPORT_ID- int,UNIQUE_ID- varchar,user_id -int,NOTE-text,DTS-datetime, SalesNote-text,userrole-varchar,userein-varchar – user3296391

回答

0

因爲沒有其他人已經回答了這個問題呢,我要開始對話。

但請記住,我今天沒有帶有文本字段的遠程SQL Server進行測試。

我注意到你的原始答案,你是否去了一個函數內部的遠程數據庫 - 這一點與我有關,因爲在一個函數內重複檢索整個表格會花費很多時間。

我的首選是在一次調用中從遠程SQL Server數據庫中取回數據。

CREATE GLOBAL TEMPORARY TABLE NOTES_STG (
ID int, 
REPORT_ID int, 
USER_ID int, 
NOTE clob, 
DTS date, 
SalesNote clob, 
userrole varchar2(50), 
userin varchar2(50) 
); 

然後:

INSERT INTO NOTES_STG SELECT ID, REPORT_ID, USER_ID, NOTE, DETS, SAlesNote, USERROLE, USERIN FROM [email protected]; 

這些都是例子,你可能需要調整的定義,我不知道

所以,你可以在Oracle一端創建一個表例如,userin varchar列的大小。

在這種情況下,我只是試圖推動對話。

但我想看看,正在整個表與一個選擇語句將工作足夠快?或者它仍然太慢?

另外請注意,我在這個例子中使用了一個全局臨時表,顯然,如果它耗盡了您的PGA和TEMP表空間,它將無法工作,所以根據您可用的內容,您可以選擇不使用GTT。

我過去一直不太滿意與SQL Server的ODBC連接的性能,並且做了更復雜的解決方法,但我不能說我有任何特定的解決方法,我將其用作一般規則。

+0

謝謝你的回覆。我創建了全局臨時表,並且當我運行插入語句時,它會拋出以下錯誤:SQL錯誤:ORA-00997:非法使用LONG數據類型00997. 00000 - 「非法使用LONG數據類型」 意思是我會檢查插入到NOTES_STG(id,note,dts,report_id,unique_id,userin)的查詢 – user3296391

0

謝謝您的回覆。我創建了全局臨時表,當我跑的INSERT語句,它拋出下面的錯誤: SQL錯誤:ORA-00997:非法使用LONG數據類型的 00997. 00000 - 「非法使用LONG數據類型的」

平均而我將檢查查詢的性能

+0

的性能從tbl_notes中選擇「ID」,(「NOTE」),「DTS」,「REPORT_ID」,「UNIQUE_ID」,「UserEIN」 @pprleg;這是插入語句。我們可以使用sql加載器加載數據嗎?如果是這樣,我們該怎麼做? – user3296391