項目中遇到一個問題,對方公司把打印好的報表數據存到數據庫中,實際上就是把html存在Oracle中,然后需要我們在社保系統里進行查詢。
但是他們把數據存放在B數據庫,而我們的社保系統用的數據庫是B。A和B都是Oracle數據庫
這樣就遇到一下幾個問題:
1.讀取B數據的Clob對象,但是會報錯:
ORA-22992:無法使用從遠程表選擇的LOB定位符 ,解決方法如:http://www.cnblogs.com/Sunnor/p/5368530.html
2 怎么把Clob對象讀取出來,然后寫到jsp里。
這個也簡單:
具體轉換辦法如:
1 public String ClobToString(Clob clob) throws SQLException, IOException { 2 3 String reString = ""; 4 Reader is = clob.getCharacterStream();// 得到流 5 BufferedReader br = new BufferedReader(is); 6 String s = br.readLine(); 7 StringBuffer sb = new StringBuffer(); 8 while (s != null) {// 執行循環將字符串全部取出付值給 StringBuffer由StringBuffer轉成STRING 9 sb.append(s); 10 s = br.readLine(); 11 } 12 reString = sb.toString(); 13 return reString; 14 } 15 16 }
項目代碼:
點擊一個查詢結果,然后雙擊調用某一個function(){},在這個function里使用window對象的showModelessDialog方法,
1 /** 2 * 報表 非模態窗口 3 */ 4 function history(paramName) { 5 var title = encodeURIComponent('報表查詢'); 6 //彈出非模態對話框,並加上時間戳以防止緩存 7 var url = "cmpbb.do?title="+title+"¶mName=" + paramName+"&_t="+new Date().getTime(); 8 var strFeatures = "resizable:yes;status:no;help:no;scroll:yes;center:yes;"; 9 strFeatures = strFeatures+"dialogWidth:"+1300+"px;"+"dialogHeight:"+800+"px"; 10 window.showModelessDialog(url,"",strFeatures); 11 //window.showModalDialog(url,"",strFeatures); 12 }
然后會跳轉到cmpbb.jsp,
cmpbb.jsp代碼:
<%@page import="cn.sinobest.example.service.cbzlzx.CbzlzxService"%> <%@ page contentType="text/html; charset=UTF-8" %> <%@ page import="java.io.*"%> <%@ page import="java.sql.*, javax.sql.*" %> <%@ page import="java.util.*"%> <%@ page import="java.math.*"%> <%@ page import="cn.sinobest.framework.util.DTOUtil"%> <%@ page import="cn.sinobest.framework.util.Util"%> <% //獲取查詢條件 String para1 = (String) request.getParameter("paramName");// 01 if(para1 == null){ para1 = "XXXXXXX"; } String bianhao = (String) request.getParameter("bianhao");// 01 if(bianhao == null){ bianhao = "YYYYY"; } //獲取模態窗口傳過來的值, String SERIALNUM = DTOUtil.getValue("paramName"); //建連接 Connection con = Util.getConnection(); //設置不自動提交,因為往全局臨時表插入數據不能夠提交,一旦提交全局臨時表里就沒數據了。 con.setAutoCommit(false); Statement stmt = null; ResultSet rs = null; String idcard = null; String strclob = ""; CbzlzxService serv = new CbzlzxService(); try{ // 准備語句執行對象 stmt = con.createStatement(); //if(SERIALNUM.length()==0||"".equals(SERIALNUM)){ // SERIALNUM = "20160408101621331200002"; //} //String sql = " SELECT * FROM gtemp_printserialnum_2 where SERIALNUM = '"+SERIALNUM+"'"; //gtemp_printserialnum_,全局臨時表,只有當前連接有效,要是重新開另外開一個鏈接就沒法在這個表里查數據 //String sql_ = "insert into gtemp_printserialnum_ select * from printserialnum@dbl_to_ytj "; //stmt.execute(sql_);//執行插入語句 //String sql = " SELECT * FROM gtemp_printserialnum_ where SERIALNUM = '"+SERIALNUM+"'"; String sql = " SELECT * FROM printserialnum where SERIALNUM = '"+SERIALNUM+"'"; rs = stmt.executeQuery(sql); System.out.println("讀取CLOB對象:AAC001 1= "+sql); if (rs.next()) { System.out.println("讀取CLOB對象:AAC001 2= "); //1 獲取結果集中的Clob字段值 Clob b = rs.getClob("PRINTTABLE"); //2 調用寫好的工具方法吧Clob對象轉換為字符串 strclob = serv.ClobToString(b); /* 3 這一步很重要,觸屏打印傳過來的Clob字段里的html信息沒有加上<html></html>標記, 使用模態窗口打開的時候可能顯示為空 */ strclob = "<HTML>"+strclob+"</HTML>"; //4 用jsp內置對象把轉換后的html字符串打印到網頁上 out.print(strclob); System.out.println("-----:"+strclob); //response.reset(); //這個設置很重要,否則客戶端瀏覽器不能識別輸出內容,導致彈出下載的對話框。 //response.setContentType("image/jpeg"); //response.setContentType("text/html"); //ServletOutputStream sos = response.getOutputStream(); //sos.write(bs,0,bs.length); //sos.flush(); }else { System.out.println("讀取CLOB對象:AAC001 3= "); //response.sendRedirect(request.getContextPath()+"/images/NonePhoto.JPG"); } }catch(Exception e){ System.out.println("讀取CLOB對象:AAC001 4= "); e.printStackTrace(); }finally{ //rs.last(); //len = rs.getRow(); System.out.println("讀取CLOB對象:AAC001 5= "+idcard+",len:"); rs.close(); stmt.close(); con.close(); } %> <script type="text/javascript"> alert('---'+kkk); var para1="<%=para1%>"; var bianhao="<%=bianhao%>"; //alert('para1:'+para1); //alert('bianhao:'+bianhao); </script>
