2010-06-04 26 views
12

我們在Oracle 11g中有一個帶有varchar2列的表。我們使用專有編程語言,其中此列被定義爲字符串。我們最多可以在此列中存儲2000個字符(4000字節)。現在需求是這樣的,列需要存儲超過2000個字符(實際上是無限制的字符)。由於維護原因,DBA不喜歡BLOB或LONG數據類型。如何在Oracle 11g中存儲無限制字符?

我能想到的解決方案是從原始表中刪除此列,併爲此列創建一個單獨的表,然後將每個字符存儲在一行中以獲取無限制字符。這個tble將與原始表連接以進行查詢。

有沒有更好的解決方案來解決這個問題?

更新:專有的編程語言允許定義類型爲字符串和blob的變量,沒有CLOB的選項。我瞭解給出的答案,但我不能接受DBA。我明白,偏離BLOB或LONG將成爲開發者的噩夢,但仍然無法提供幫助。

更新2:如果我需要的最大數量是8000個字符,我可以只添加3個列,這樣我將有4列2000字符每個獲得8000個字符。所以當第一列填滿時,數值會溢出到下一列等等。這個設計會有什麼不好的副作用嗎?請建議。

+15

這聽起來像是DailyWTF的故事正在我們眼前展開... – 2010-06-04 16:55:33

+1

好吧,如果你告訴你的DBA這就是你要做的事情,那麼我相信他們會願意重新考慮BLOB或長。任何事情要避免:) – 2010-06-04 16:57:19

+1

作爲初級開發人員,我有這種情況,並被迫使用一系列nvarchar行映射一個接一個。插入和更新邏輯非常複雜,以至於應用程序層出現比dba頭疼更糟糕的維護性頭痛。 – dkackman 2010-06-04 17:01:01

回答

1

BLOB是最好的解決方案。其他任何東西都不太方便,並且會造成更大的維修煩惱。

2

你說沒有BLOB或LONG ...但CLOB怎麼樣? 4GB字符數據。

12

如果一個blob是你需要說服你的dba這就是你需要的。那些數據類型是有原因的,任何滾動你自己的實現將比內置類型更差。

你也可以看看CLOB類型,因爲它會很好地滿足你的需求。

1

BFILE是您數據庫管理員可行的替代數據類型嗎?

1

我不明白。 CLOB是適當的數據庫數據類型。如果你奇怪的編程語言將處理8000(或其他)字符的字符串,那麼停止將它們寫入CLOB就會停止。

更具體地說,當您嘗試將8000字符的字符串插入定義爲CLOB的列時,會得到什麼錯誤(來自Oracle或您的編程語言)。

7

您可以按照Oracle在信息架構中存儲其存儲過程的方式。定義稱爲文本列的表格:

CREATE TABLE MY_TEXT (
IDENTIFIER INT, 
LINE  INT, 
TEXT  VARCHAR2 (4000), 
PRIMARY KEY (INDENTIFIER, LINE)); 

標識符列是原始表的外鍵。該行是一個簡單的整數(而不是一個序列),以保持文本字段的順序。這可以保留更大的數據塊

是的,這不像blob,clob或LONG那樣高效(如果可能的話,我會避免使用LONG字段)。是的,如果你的數據庫管理員在數據庫中管理CLOB字段時遇到了麻煩,那麼這需要更多的工作量,這是選項二。

編輯:

下面MY_TABLE是您目前擁有的VARCHAR列,你正在尋求擴大。我會保留在短文本字段的表格中。

CREATE TABLE MY_TABLE (
INDENTIFER INT, 
OTHER_FIELD VARCHAR2(10), 
REQUIRED_TEXT VARCHAR(4000), 
PRIMERY KEY (IDENTFIER)); 

然後編寫查詢拉由MY_TEXT場線數據連接兩個表,訂貨。您的應用程序需要將字符串拆分爲2000個字符塊並按行順序插入。

我會在PL/SQL過程中做到這一點。插入和選擇。 PL/SQL VARCHAR字符串最多可以有32K個字符。這可能或可能不足以滿足您的需求。

但是和其他人一樣,在回答這個問題時,我強烈建議向DBA提供一個使該列成爲CLOB的例子。從程序角度來看,這將是一個BLOB,因此易於管理。

+0

我想我得到你在說什麼。你能解釋一下更多,也許有一個例子嗎? – user32262 2010-06-05 07:52:40

相關問題