當long欄位在where條件裡的解決方案
當long這個已經過時的欄位在long條件裡時,會發生什麼?
答案:會出現這個錯誤:
SQL> select VIEW_NAME from dba_views where TEXT like '%longtest%';
select VIEW_NAME from dba_views where TEXT like '%longtest%'
*
ERROR at line 1:
ORA-00932: inconsistent datatypes: expected NUMBER got LONG
oracle會推薦你將long欄位換成clob。
但是在一些老資料庫的老表中,仍然需要用到這個討厭的欄位。
今天我在做一個task的時候,也碰到了這個問題,在metalink上找到一個plsql方案,我們自己也想出了一個簡單的plsql的方案。
----方案1----
使用metalink上一個package:long_util
select view_name, text
from dba_views
where
owner = 'HAO'
and (
long_util.likestr(
'select text from dba_views where wner='''||owner||'''', '%testlong%')>0) ;
VIEW_NAME
------------------------------------------------------------------------------------------
TEXT
--------------------------------------------------------------------------------
LONGTEST2
select "ID" from testlong
【long_util包定義見本文最後】
----方案2----
在plsql裡使用instr函式。
set serveroutput on
declare
begin
for r in (select view_name, text from dba_views where wner = 'HAO') loop
if instr(r.text, 'testlong') > 0 then
dbms_output.put_line(r.view_name||','||r.text);
end if;
end loop;
end;
/
LONGTEST2,select "ID" from testlong
PL/SQL procedure successfully completed.
-----------------------------
long_util包定義:
rem
rem since LONG values can't be passed as function arguments, these
rem functions require a SELECT statement yielding the long column as the
rem first select list item.
rem
CREATE OR REPLACE PACKAGE long_util authid current_user IS
FUNCTION substring(insql in varchar2, leng in number, startpos in number)
RETURN varchar2;
FUNCTION likestr(insql in varchar2, pat in varchar2)
RETURN NUMBER;
end long_util;
/
show errors;
CREATE OR REPLACE PACKAGE BODY long_util IS
FUNCTION substring(insql in varchar2, leng in number, startpos in number)
RETURN varchar2
is
sts number;
stringsegment varchar2(4000);
v_CursorID INTEGER;
bytesread number;
begin
v_CursorID := DBMS_SQL.OPEN_CURSOR;
DBMS_SQL.PARSE(v_CursorID, insql, DBMS_SQL.V7);
DBMS_SQL.DEFINE_COLUMN_LONG(v_CursorID, 1);
sts := DBMS_SQL.EXECUTE_AND_FETCH(v_CursorID);
bytesread := leng;
stringsegment := NULL;
DBMS_SQL.COLUMN_VALUE_LONG(v_CursorID, 1, leng, startpos,
stringsegment, bytesread);
DBMS_SQL.CLOSE_CURSOR(v_CursorID);
return stringsegment;
EXCEPTION
WHEN OTHERS THEN
DBMS_SQL.CLOSE_CURSOR(v_CursorID);
RAISE;
end;
FUNCTION likestr(insql in varchar2, pat in varchar2)
RETURN number
is
startpos number;
sts number;
leng number;
patlen number;
chunksize number;
stringsegment varchar2(4000);
v_CursorID INTEGER;
bytesread number;
begin
v_CursorID := DBMS_SQL.OPEN_CURSOR;
DBMS_SQL.PARSE(v_CursorID, insql, DBMS_SQL.V7);
DBMS_SQL.DEFINE_COLUMN_LONG(v_CursorID, 1);
sts := DBMS_SQL.EXECUTE_AND_FETCH(v_CursorID);
patlen := length(pat);
chunksize := 4001 - patlen;
bytesread := 4000;
startpos := 0;
while bytesread = 4000 loop
DBMS_SQL.COLUMN_VALUE_LONG(v_CursorID, 1, 4000, startpos,
stringsegment, bytesread);
startpos := startpos + chunksize;
IF bytesread > 0 THEN
if stringsegment like pat then
DBMS_SQL.CLOSE_CURSOR(v_CursorID);
return 1;
end if;
END IF;
end loop;
DBMS_SQL.CLOSE_CURSOR(v_CursorID);
return 0;
EXCEPTION
WHEN OTHERS THEN
DBMS_SQL.CLOSE_CURSOR(v_CursorID);
RAISE;
end;
END long_util;
/
show errors
來自 “ ITPUB部落格 ” ,連結:http://blog.itpub.net/15415488/viewspace-600679/,如需轉載,請註明出處,否則將追究法律責任。
相關文章
- switch拼接where條件
- Laravel admin grid where 條件加 orWhere filter 不起作用怎麼解決LaravelFilter
- Oracle 條件索引 case when 報錯解決方案Oracle索引
- 關於外連線和where條件
- 儲存過程WHERE條件不生效儲存過程
- MySQL的where條件字串區分大小寫的問題MySql字串
- T-SQL——關於Join on的的連線條件和where的篩選條件的區分SQL
- mysql,where條件查詢等學習筆記MySql筆記
- ORACLE sql merge into update where條件位置與效能消耗OracleSQL
- Chrome 開發者工具 network 標籤頁裡獲取到的 cookie 欄位在 Postman 裡的應用ChromeCookiePostman
- MYSQL學習筆記6: DQL條件查詢(where)MySql筆記
- weex沉浸式導航欄解決方案
- 如何實現與FDA郵件通訊安全,戳這裡看最全郵件安全解決方案
- excel條件格式怎麼設定 excel條件格式在哪裡Excel
- 4.2.2 CDB建立的先決條件
- SAP 銷售條件表增強欄位
- 帶你讀 MySQL 原始碼:where 條件怎麼過濾記錄?MySql原始碼
- Oracle備庫當機啟動解決方案Oracle
- 當下SaaS軟體的技術缺陷以及解決方案
- 生產資料update沒加where條件(從執行到恢復)
- 分詞,難在哪裡?科普+解決方案!分詞
- while迴圈修改條件後無法跳出的疑惑(已解決)While
- Spring條件註解@ConditionalSpring
- MySQL中WHERE後跟著N多個OR條件會是你期望的結果嗎?MySql
- 解決多執行緒競爭條件——臨界區執行緒
- 個性化定製企業郵件域名的解決方案
- 2.2.4 建立資料庫的先決條件資料庫
- 當下OA系統的使用缺陷以及相關解決方案
- File name too long window和linux排查,解決Linux
- ORACLE 表char欄位混合儲存數字和字母類似資料時按數字的where條件查詢報錯ORA-01722Oracle
- SAP MM 自定義條件型別出現在採購資訊記錄的'條件'介面裡 ?型別
- 查詢/刪除重複的資料(單個欄位和多個欄位條件)
- Swift 條件語句講解Swift
- 解決 Specified key was too long ... 767 bytes 的本質問題
- 你想了解的DDS協議解決方案在這裡協議
- mysql 左連結 left join 條件寫在where 後面與 on後面的區別MySql
- 當下資訊管理系統的技術缺陷以及解決方案
- 3.2 多租戶環境的先決條件
- SAP:CX_SY_READ_SRC_LINE_TOO_LONG解決