標籤:
SQL> CREATE TABLE T_LONG (ID NUMBER, LONG_COL LONG);
表已建立。
SQL> INSERT INTO T_LONG VALUES (1, LPAD(1, 32767, ’HELLO WORLD!’));
已建立 1 行。
SQL> COMMIT;
提交完成。
SQL> SELECT * FROM T_LONG WHERE LONG_COL LIKE ’%WORLD%’
2 ;
SELECT * FROM T_LONG WHERE LONG_COL LIKE ’%WORLD%’
*第 1 行出現錯誤:
ORA-00932: 資料類型不一致: 應為 NUMBER, 但卻獲得 LONG
根據Oracle的建議,應該避免再使用LONG類型。如果可能應該使用TO_LOB來重建表,將表中的LONG類型轉化為CLOB或BLOB類型。
這裡就不考慮這種方法了,只是討論一下對於不能重建的表如何進行查詢。
如果表中的資料長度不超過32K的話,可以考慮通過類似下面的PL/SQL代碼來實現:
SQL> SET SERVEROUT ON
SQL> BEGIN
2 FOR I IN (SELECT * FROM T_LONG) LOOP
3 IF INSTR(I.LONG_COL, ’WORLD’) > 0 THEN
4 DBMS_OUTPUT.PUT_LINE(I.ID);
5 END IF;
6 END LOOP;
7 END;
8 /
1
PL/SQL 過程已成功完成。
不過PL/SQL代碼只能處理不超過32K的資料,超過這個限制,就無法通過PL/SQL來處理。
好在Oracle的全文索引是支援LONG類型的,建立一個CONTEXT索引,使用全文索引的查詢文法就可以解決這個問題:
SQL> CREATE INDEX IND_T_LONG_COL ON T_LONG(LONG_COL) INDEXTYPE IS CTXSYS.CONTEXT;
索引已建立。
SQL> SELECT ID FROM T_LONG WHERE CONTAINS(LONG_COL, ’WORLD’) > 0;
ID
----------
1
oracle中對LONG列進行查詢