亚洲在线久爱草,狠狠天天香蕉网,天天搞日日干久草,伊人亚洲日本欧美

為了賬號安全,請及時綁定郵箱和手機立即綁定
已解決430363個問題,去搜搜看,總會有你想問的

使用JDBC從存儲過程中獲取Oracle表類型

使用JDBC從存儲過程中獲取Oracle表類型

汪汪一只貓 2019-12-04 10:55:39
我試圖了解使用JDBC從Oracle存儲過程/函數獲取表數據的不同方法。六種方式如下:過程返回模式級表類型作為OUT參數程序返回包級表類型作為OUT參數程序返回包級游標類型作為OUT參數返回模式級表類型的函數返回包級表類型的函數返回包級游標類型的函數以下是PL / SQL中的一些示例:-- schema-level table typeCREATE TYPE t_type AS OBJECT (val VARCHAR(4));CREATE TYPE t_table AS TABLE OF t_type;CREATE OR REPLACE PACKAGE t_package AS  -- package level table type  TYPE t_table IS TABLE OF some_table%rowtype;  -- package level cursor type  TYPE t_cursor IS REF CURSOR;END library_types;-- and example procedures:CREATE PROCEDURE p_1 (result OUT t_table);CREATE PROCEDURE p_2 (result OUT t_package.t_table);CREATE PROCEDURE p_3 (result OUT t_package.t_cursor);CREATE FUNCTION f_4 RETURN t_table;CREATE FUNCTION f_5 RETURN t_package.t_table;CREATE FUNCTION f_6 RETURN t_package.t_cursor;我已經成功使用JDBC調用了3、4和6:// Not OK: p_1 and p_2CallableStatement call = connection.prepareCall("{ call p_1(?) }");call.registerOutParameter(1, OracleTypes.CURSOR);call.execute(); // Raises PLS-00306. Obviously CURSOR is the wrong type// OK: p_3CallableStatement call = connection.prepareCall("{ call p_3(?) }");call.registerOutParameter(1, OracleTypes.CURSOR);call.execute();ResultSet rs = (ResultSet) call.getObject(1); // Cursor results// OK: f_4PreparedStatement stmt = connection.prepareStatement("select * from table(f_4)");ResultSet rs = stmt.executeQuery();// Not OK: f_5PreparedStatement stmt = connection.prepareStatement("select * from table(f_5)");stmt.executeQuery(); // Raises ORA-00902: Invalid data type// OK: f_6CallableStatement call = connection.prepareCall("{ ? = call f_6 }");call.registerOutParameter(1, OracleTypes.CURSOR);call.execute();ResultSet rs = (ResultSet) call.getObject(1); // Cursor results所以很明顯,我很難理解如何從存儲過程中的OUT參數中檢索模式級和包級表類型如何從存儲的函數中檢索包級表類型我似乎找不到任何文檔,因為每個人都總是使用游標而不是表類型。也許是因為不可能?不過,我更喜歡表類型,因為它們是形式上定義的,并且可以使用字典視圖(至少是架構級別的表類型)發現。注意:很明顯,我可以編寫一個包裝函數,返回OUT參數和包級表類型。但是我更喜歡干凈的解決方案。
查看完整描述

3 回答

?
慕哥6287543

TA貢獻1831條經驗 獲得超10個贊

您也可以使用以下之一


public List<EmployeeBean> fetchDataFromSPForRM(String sInputDate) {


         List<EmployeeBean> employeeList = new ArrayList<EmployeeBean>();


         Connection dbCon = null;

         ResultSet data = null;

         CallableStatement cstmt = null;



         try {

                dbCon = DBUtil.getDBConnection();

                String sqlQuery = "{? = call PKG_HOLD_RELEASE.FN_RM_PDD_LIST()}";


                cstmt = dbCon.prepareCall(sqlQuery);


                cstmt.registerOutParameter(1, OracleTypes.CURSOR);


                cstmt.execute();


                data = (ResultSet) cstmt.getObject(1);              


                    while(data.next()){

                        EmployeeBean employee = new EmployeeBean();


                        employee.setEmpID(data.getString(1));

                        employee.setSubBusinessUnitId((Integer)data.getObject(2));

                        employee.setMonthOfIncentive((Integer)data.getObject(3));

                        employee.setPIPStatus(data.getString(5));

                        employee.setInvestigationStatus(data.getString(6));

                        employee.setEmpStatus(data.getString(7));

                        employee.setPortfolioPercentage((Integer)data.getObject(8));

                        employee.setIncentive((Double)data.getObject(9));

                        employee.setTotalSysemHoldAmt((Double)data.getObject(10));

                        employee.setTotalManualHoldAmt((Double)data.getObject(11));


                        employeeList.add(employee);

                    }


            } catch (SQLException e) {

                e.printStackTrace();

            }finally{

                try {


                    if(data != null){


                            data.close();               

                            data = null;

                    }

                    if(cstmt != null){


                        cstmt.close();

                        cstmt = null;

                    }

                    if(dbCon != null){


                            dbCon.close();              

                            dbCon = null;

                    }


                } catch (SQLException e) {

                    e.printStackTrace();

                }

            }



        return employeeList;                

     }


查看完整回答
反對 回復 2019-12-04
  • 3 回答
  • 0 關注
  • 998 瀏覽
慕課專欄
更多

添加回答

舉報

0/150
提交
取消
微信客服

購課補貼
聯系客服咨詢優惠詳情

幫助反饋 APP下載

慕課網APP
您的移動學習伙伴

公眾號

掃描二維碼
關注慕課網微信公眾號