2010-06-04 43 views
12

Chúng tôi có một bảng trong Oracle 11g với một cột varchar2. Chúng tôi sử dụng một ngôn ngữ lập trình độc quyền trong đó cột này được định nghĩa là chuỗi. Tối đa chúng ta có thể lưu trữ 2000 ký tự (4000 byte) trong cột này. Bây giờ các yêu cầu là như vậy mà cột cần lưu trữ nhiều hơn 2000 ký tự (trong thực tế không giới hạn ký tự). Các DBAs không thích BLOB hoặc LONG datatypes vì ​​lý do bảo trì.Làm cách nào để lưu trữ các ký tự không giới hạn trong Oracle 11g?

Giải pháp mà tôi có thể nghĩ là xóa cột này khỏi bảng gốc và có bảng riêng cho cột này và sau đó lưu trữ từng ký tự liên tiếp để có được ký tự không giới hạn. Tble này sẽ được kết hợp với bảng ban đầu cho các truy vấn.

Có giải pháp nào tốt hơn cho vấn đề này không?

CẬP NHẬT: Ngôn ngữ lập trình độc quyền cho phép xác định các biến kiểu chuỗi và blob, không có tùy chọn CLOB. Tôi hiểu các câu trả lời được đưa ra, nhưng tôi không thể đảm nhận các DBA. Tôi hiểu rằng việc lệch từ BLOB hoặc LONG sẽ là cơn ác mộng của các nhà phát triển, nhưng vẫn không thể giúp được.

CẬP NHẬT 2: Nếu tối đa tôi cần là 8000 ký tự, tôi có thể thêm 3 cột nữa để tôi có 4 cột với 2000 ký tự mỗi để nhận được 8000 ký tự. Vì vậy, khi cột đầu tiên đầy, các giá trị sẽ được đổ sang cột tiếp theo, v.v. Thiết kế này có bất kỳ tác dụng phụ xấu nào không? Xin đề nghị.

+15

Điều này chắc chắn giống như một câu chuyện DailyWTF đang diễn ra trước mắt chúng tôi ... –

+1

Vâng, nếu bạn nói với DBA rằng đó là những gì bạn định làm, thì tôi chắc chắn rằng họ sẵn sàng xem xét lại BLOB hoặc LONG. Bất cứ điều gì để tránh điều đó :) –

+1

Là nhà phát triển cơ sở, tôi đã có tình trạng tương tự này và đã buộc phải sử dụng một loạt các hàng nvarchar ánh xạ một sau khi khác. Logic chèn và cập nhật quá phức tạp đến nỗi lớp ứng dụng đã phải chịu đựng một nhức đầu bảo trì tồi tệ hơn nhiều so với những gì mà nhức đầu dba có thể gặp phải. – dkackman

Trả lời

1

BLOB là giải pháp tốt nhất. Bất cứ điều gì khác sẽ ít thuận tiện hơn và phiền toái bảo trì lớn hơn.

2

Bạn đã nói không có BLOB hoặc LONG ... nhưng còn CLOB thì sao? Dữ liệu ký tự 4GB.

12

Nếu một đốm màu là những gì bạn cần thuyết phục dba của bạn đó là những gì bạn cần. Các loại dữ liệu đó có lý do và bất kỳ việc thực hiện cuộn nào của riêng bạn sẽ thực hiện việc triển khai của riêng bạn sẽ tồi tệ hơn loại được tích hợp sẵn.

Bạn cũng có thể muốn xem loại CLOB vì nó sẽ đáp ứng nhu cầu của bạn khá tốt.

1

BFILE có phải là loại dữ liệu thay thế khả thi cho DBA của bạn không?

1

Tôi không hiểu. Một CLOB là kiểu dữ liệu cơ sở dữ liệu thích hợp. Nếu ngôn ngữ lập trình kỳ quặc của bạn sẽ xử lý các chuỗi ký tự 8000 (hoặc bất kỳ ký tự nào), thì nó sẽ dừng những thứ đó vào một CLOB.

Cụ thể hơn, lỗi nào bạn nhận được (từ Oracle hoặc ngôn ngữ lập trình của bạn) khi bạn cố gắng chèn một chuỗi ký tự 8000 vào cột được định nghĩa là CLOB.

7

Bạn có thể làm theo cách Oracle lưu trữ các thủ tục được lưu trữ của họ trong lược đồ thông tin. Xác định bảng được gọi là cột văn bản:

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

Cột định danh là khóa ngoài cho bảng gốc. Dòng là một số nguyên đơn giản (không phải một chuỗi) để giữ cho các trường văn bản theo thứ tự. Điều này cho phép giữ các khối dữ liệu lớn hơn

Có điều này không hiệu quả như blob, clob hoặc LONG (Tôi có thể tránh trường LONG nếu có thể). Có, điều này đòi hỏi phải có nhiều ưu điểm hơn, buf nếu các DBA của bạn đã chết khi chống lại việc quản lý các trường CLOB trong cơ sở dữ liệu, đây là tùy chọn hai.

EDIT:

My_Table dưới đây là nơi mà bạn đang có cột VARCHAR bạn đang tìm kiếm để mở rộng. Tôi sẽ giữ nó trong bảng cho các trường văn bản ngắn.

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

Sau đó viết truy vấn để kéo dữ liệu nối hai bảng, sắp xếp theo LINE trong trường MY_TEXT. Ứng dụng của bạn sẽ cần phải chia chuỗi thành 2000 khối ký tự và chèn chúng theo thứ tự dòng.

Tôi sẽ thực hiện việc này trong quy trình PL/SQL. Cả hai chèn và chọn. Các chuỗi VARCHAR PL/SQL có thể lên tới 32K ký tự. Mà có thể hoặc có thể không đủ lớn cho nhu cầu của bạn.

Nhưng giống như mọi người khác trả lời câu hỏi này, tôi thực sự khuyên bạn nên tạo một trường hợp cho DBA để biến cột thành CLOB. Từ quan điểm chương trình, đây sẽ là BLOB và do đó dễ quản lý.

+0

Tôi nghĩ rằng tôi có được những gì bạn đang nói. Bạn có thể giải thích thêm một chút, có thể với một ví dụ? – user32262

Các vấn đề liên quan