當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條件
- SQL中on條件與where條件的區別[轉]SQL
- mybatis多條件的模糊查詢解決方案MyBatis
- Oracle 條件索引 case when 報錯解決方案Oracle索引
- MySQL核心技術之“WHERE條件”MySql
- oracle 安裝時先決條件檢查失敗的解決方案Oracle
- Laravel admin grid where 條件加 orWhere filter 不起作用怎麼解決LaravelFilter
- 儲存過程WHERE條件不生效儲存過程
- 關於外連線和where條件
- LINQ系列:LINQ to SQL Where條件SQL
- where語句中多條件查詢欄位NULL與NOT NULL不確定性查詢Null
- Chrome 開發者工具 network 標籤頁裡獲取到的 cookie 欄位在 Postman 裡的應用ChromeCookiePostman
- Percona MySQL 5.6 WHERE 條件中 OR 的索引測試MySql索引
- mysql where條件中 字串右邊的空格會忽略MySql字串
- LOB欄位在Oracle中的存放方式。Oracle
- lisp 裡的條件判斷Lisp
- mysql,where條件查詢等學習筆記MySql筆記
- MongoDB之資料查詢(where條件過濾)MongoDB
- 替代SQL語句WHERE條件中OR關鍵詞SQL
- 【Oracle】where條件執行順序(上篇的問題延伸)Oracle
- 資料泵過濾匯出資料的where條件
- Oracle中where子句中條件的物理執行順序Oracle
- oracle裡long型別詳解Oracle型別
- iframe錨點定位在firefox火狐瀏覽器下失效解決方案Firefox瀏覽器
- where條件中使用case when來實現不同列的join
- ORACLE sql merge into update where條件位置與效能消耗OracleSQL
- connect by與where條件執行順序問題
- MYSQL學習筆記6: DQL條件查詢(where)MySql筆記
- left join,right join,inner join的條件on和where的區別
- 動態條件的繫結變數的解決變數
- excel條件格式怎麼設定 excel條件格式在哪裡Excel
- 如何實現與FDA郵件通訊安全,戳這裡看最全郵件安全解決方案
- oracle只有當where子句中所有條件都使用"=:"才認為是使用繫結變數麼?Oracle變數
- 關於在SQL語句中ON和WHERE中條件使用的差異SQL
- weex沉浸式導航欄解決方案
- 多欄位登入通用解決方案
- 輸出判斷條件是或的解決方法
- 微服務的先決條件微服務