PDO取Oracle lob大字段,當(dāng)數(shù)據(jù)量太大無法取出的問題的解決辦法
更新時(shí)間:2009年03月26日 11:20:09 作者:
最近,做sns的項(xiàng)目,用PDO連接Oracle數(shù)據(jù)庫,讀取Clob字段,當(dāng)數(shù)據(jù)量非常大的時(shí)候(上萬個(gè)字符),返回空值,從網(wǎng)上也沒有查到相關(guān)的資料。自己刻苦研究加上同事幫助,終于解決了。廢話就不說了,下面把內(nèi)容貼出來。
首先,創(chuàng)建一個(gè)存儲(chǔ)過程 get_clob:
t_name:要查詢的表名;f_name:要查詢的字段名;u_id:表的主鍵,查詢條件;l_pos:截取的開始位置; l_amount :截取長度;
CREATE OR REPLACE PROCEDURE get_clob(t_name in varchar2, f_name in varchar, u_id in integer, l_pos in integer, l_amount in BINARY_INTEGER, ReturnValue out varchar2) is
rule_xml clob;
l_buffer varchar2(3999);
l_amount_ BINARY_INTEGER;
begin
execute immediate 'select ' ||f_name|| ' from ' ||t_name|| ' where id=:1' into rule_xml using u_id;
l_amount_:=l_amount;
DBMS_LOB.read(rule_xml, l_amount_, l_pos, l_buffer);
ReturnValue := l_buffer;
end get_clob;
然后是php的處理程序:
$content = "";
$num = 0;//clob字段長度
$stmt = $oracle->prepare("select length(content) as num from test where id = $id");
if ($stmt->execute()) { //zjh為查詢的條件
$row = $stmt->fetch();
$num = $row['NUM'];
}
$start = 1;//初始化開始位置
$len = 2500;//截取長度
$t_name = 'test';//操作表名
$f_name = 'content';//需要查詢的clob字段名
while ($start <= $num){
$ret='';
$sql = "begin get_clob(?,?,?,?,?,?); end;";
$stmt = $oracle->prepare($sql);
$stmt->bindParam(1, $t_name, PDO::PARAM_STR, 100);
$stmt->bindParam(2, $f_name, PDO::PARAM_STR, 100);
$stmt->bindParam(3, $id, PDO::PARAM_STR, 100);
$stmt->bindParam(4, $start, PDO::PARAM_STR, 100);
$stmt->bindParam(5, $len, PDO::PARAM_STR, 100);
$stmt->bindParam(6, $ret, PDO::PARAM_STR, 5000);
$stmt->execute();
$content .= $ret;
$start=$start+$len;
}
$oracle = null;
以上就是完整的解決辦法,這個(gè)方法不是俺的首創(chuàng),做過pb項(xiàng)目的人大多數(shù)應(yīng)該比較熟悉這種操作。
php操作Oracle的資料網(wǎng)上還是比較少的,能解決問題的就更不多了,發(fā)出來跟大家分享一下,肯定還有其他比較好的解決辦法,歡迎跟大家一起探討。
t_name:要查詢的表名;f_name:要查詢的字段名;u_id:表的主鍵,查詢條件;l_pos:截取的開始位置; l_amount :截取長度;
CREATE OR REPLACE PROCEDURE get_clob(t_name in varchar2, f_name in varchar, u_id in integer, l_pos in integer, l_amount in BINARY_INTEGER, ReturnValue out varchar2) is
rule_xml clob;
l_buffer varchar2(3999);
l_amount_ BINARY_INTEGER;
begin
execute immediate 'select ' ||f_name|| ' from ' ||t_name|| ' where id=:1' into rule_xml using u_id;
l_amount_:=l_amount;
DBMS_LOB.read(rule_xml, l_amount_, l_pos, l_buffer);
ReturnValue := l_buffer;
end get_clob;
然后是php的處理程序:
$content = "";
$num = 0;//clob字段長度
$stmt = $oracle->prepare("select length(content) as num from test where id = $id");
if ($stmt->execute()) { //zjh為查詢的條件
$row = $stmt->fetch();
$num = $row['NUM'];
}
$start = 1;//初始化開始位置
$len = 2500;//截取長度
$t_name = 'test';//操作表名
$f_name = 'content';//需要查詢的clob字段名
while ($start <= $num){
$ret='';
$sql = "begin get_clob(?,?,?,?,?,?); end;";
$stmt = $oracle->prepare($sql);
$stmt->bindParam(1, $t_name, PDO::PARAM_STR, 100);
$stmt->bindParam(2, $f_name, PDO::PARAM_STR, 100);
$stmt->bindParam(3, $id, PDO::PARAM_STR, 100);
$stmt->bindParam(4, $start, PDO::PARAM_STR, 100);
$stmt->bindParam(5, $len, PDO::PARAM_STR, 100);
$stmt->bindParam(6, $ret, PDO::PARAM_STR, 5000);
$stmt->execute();
$content .= $ret;
$start=$start+$len;
}
$oracle = null;
以上就是完整的解決辦法,這個(gè)方法不是俺的首創(chuàng),做過pb項(xiàng)目的人大多數(shù)應(yīng)該比較熟悉這種操作。
php操作Oracle的資料網(wǎng)上還是比較少的,能解決問題的就更不多了,發(fā)出來跟大家分享一下,肯定還有其他比較好的解決辦法,歡迎跟大家一起探討。
您可能感興趣的文章:
- Oracle 12c新特性之如何檢測有用的多列統(tǒng)計(jì)信息詳解
- Oracle 11g收集多列統(tǒng)計(jì)信息詳解
- Oracle Translate 統(tǒng)計(jì)字符出現(xiàn)的次數(shù)示例代碼
- Oracle數(shù)據(jù)庫按時(shí)間進(jìn)行分組統(tǒng)計(jì)數(shù)據(jù)的方法
- oracle表空間中空表統(tǒng)計(jì)方法示例介紹
- oracle數(shù)據(jù)庫下統(tǒng)計(jì)專營店的男女?dāng)?shù)量的語句
- Oracle 統(tǒng)計(jì)用戶下表的數(shù)據(jù)量實(shí)現(xiàn)腳本
相關(guān)文章
oracle中commit之后進(jìn)行數(shù)據(jù)回滾的方法
這篇文章主要介紹了oracle中commit之后如何進(jìn)行數(shù)據(jù)回滾,本文給大家分享兩種方法,每種方法都給大家介紹的比較詳細(xì),需要的朋友可以參考下2021-12-12DBA_Oracle Startup / Shutdown啟動(dòng)和關(guān)閉過程詳解(概念)(對(duì)數(shù)據(jù)庫進(jìn)行各種維護(hù)操作)
對(duì)于大多數(shù)Oracle DBA來說,啟動(dòng)和關(guān)閉Oracle數(shù)據(jù)庫最常用的方式就是在命令行方式下的Server Manager。從Oracle 8i以后,系統(tǒng)將Server Manager的所有功能都集中到了SQL*Plus中,也就是說從8i以后對(duì)于數(shù)據(jù)庫的啟動(dòng)和關(guān)閉可以直接通過SQL*Plus來完成2014-08-08有關(guān)Oracle數(shù)據(jù)庫的備份情況
有關(guān)Oracle數(shù)據(jù)庫的備份情況...2007-03-03Oracle查看表結(jié)構(gòu)的幾種方法示例代碼
本文通過示例代碼給大家介紹了oracle查看表結(jié)構(gòu)的幾種方式,感興趣的朋友參考下吧2017-07-07Oracle查看表操作歷史記錄并恢復(fù)數(shù)據(jù)的方法
Oracle是一種廣泛應(yīng)用于企業(yè)級(jí)數(shù)據(jù)庫系統(tǒng)的軟件,但在操作過程中可能會(huì)發(fā)生誤刪除數(shù)據(jù)的情況,這時(shí)就需要進(jìn)行數(shù)據(jù)恢復(fù)操作,這篇文章主要給大家介紹了關(guān)于Oracle查看表操作歷史記錄并恢復(fù)數(shù)據(jù)的相關(guān)資料,需要的朋友可以參考下2023-08-08