2017-08-17 88 views
0

問題描述: 我想通過java代碼調用存儲在我的數據庫中的過程。我想調用的過程有一個類型爲'MAP_VARCHAR'的參數(我已經將它定義爲下面的包中的類型)。java.sql.SQLException:從jdbc執行程序包級別類型時無效的列類型

現在,我試圖從我的java代碼執行此過程,但傳遞參數是給java.sql.SQLException。

SQL包來告訴你怎麼創建我的SQL程序,並輸入

-------------------------------------------------------- 
-- Package Body TEST_PACKAGET 
-------------------------------------------------------- 

    CREATE OR REPLACE EDITIONABLE PACKAGE BODY "TEST_PACKAGE" AS 

    PROCEDURE PerformersRole(P_Performer_Map MAP_VARCHAR) AS 
    BEGIN 

     DBMS_OUTPUT.PUT_LINE('Hello ' || P_Performer_Map('Engineer')); 

    END PerformersRole; 

END TEST_PACKAGE; 

/
-------------------------------------------------------- 
-- Package TEST_PACKAGE 
-------------------------------------------------------- 

    CREATE OR REPLACE EDITIONABLE PACKAGE "TEST_PACKAGE" AS 

    /* TODO enter package declarations (types, exceptions, methods etc) here */ 
    TYPE MAP_VARCHAR IS TABLE OF VARCHAR(100) INDEX BY VARCHAR(100); 

    PROCEDURE PerformersRole(P_Performer_Map MAP_VARCHAR); 
END TEST_PACKAGE; 

/

我的Java代碼

public void executeProcedure(){ 

     CallableStatement statement = null; 
     try { 

/// Oracle Connection code should be here 
      Connection connection = connectionManager.createConnection(); 


      Hashtable newMap = new Hashtable(); 

      newMap.put("Engineer", "Hanson"); 
      newMap.put("Assistant", "Alice Kim"); 
      newMap.put("Supervisor", "James MaCoy"); 


      StringBuffer procedure = new StringBuffer("{call TEST_PACKAGE.PerformersRole(?) }"); 
      statement = connection.prepareCall(procedure.toString()); 
      statement.setInt(1, newMap); 

      statement.execute(); 
     } catch (Exception ex) { 


     } 

} 

當我執行我收到錯誤我的java代碼是

java.sql.SQLException: Invalid column type 
    at oracle.jdbc.driver.OraclePreparedStatement.setObjectCritical(OraclePreparedStatement.java:8761) 
    at oracle.jdbc.driver.OraclePreparedStatement.setObjectInternal(OraclePreparedStatement.java:8259) 
    at oracle.jdbc.driver.OraclePreparedStatement.setObjectInternal(OraclePreparedStatement.java:9012) 
    at oracle.jdbc.driver.OracleCallableStatement.setObject(OracleCallableStatement.java:4983) 
    at oracle.jdbc.driver.OraclePreparedStatementWrapper.setObject(OraclePreparedStatementWrapper.java:230) 

我缺少什麼?!

感謝您的幫助,提前

+0

SQL包類型麻煩你的程序似乎並沒有接受一個整數作爲輸入值,必須有一些比'setInt'更相關的方法。 – Berger

+0

什麼是MAP_VARCHAR類型? – user7294900

+0

MAP_VARCHAR是自定義類型,它將保存VARCHAR表並由VARCHAR建立索引。即項目('馬德里'):='皇家馬德里' – Hanson

回答

0

OK,我已經花時間試圖找出我怎麼能解決這個問題的Arkadiusz盧卡西維奇評論後,因爲他沒有提供任何正式文件提的是,我做了快速研究,似乎他的要求是合法的。

有克服從Java訪問SQL包級別類型的問題,方法2:

方法#1
通過Panser在以下網址提供
[https://stackoverflow.com/a/25989632/8477836][1]

所有答案你需要的是構建SQL DECLARE ... BEGIN ... END塊,然後從你的java中執行它。

方法2
我插入水平型(MAP_VARCHAR)值我想在程序通過在單獨的表中,然後我的SQL封裝內,我創建函數使用光標從表中檢索這些值我創建並返回的值存儲到一具有(MAP_VARCHAR)

功能的類型,這將是負責存儲MAP_VARCHAR

FUNCTION GET_MAP_VARCHAR(P_PROCESS_ID NUMBER) 
    RETURN MAP_VARCHAR IS 
     LV_MAP_VARCHAR MAP_VARCHAR; 
     LV_MAP_VARCHAR_TABLE_ROW EPAD_WF_RESD_PRFM_RLE%ROWTYPE; 

     CURSOR C_GET_MAP_VARCHAR_ROWIS 
      SELECT * FROM TEST T 
      WHERE T.TEST = P_PROCESS_ID; 

    BEGIN 

     FOR R_GET_MAP_VARCHAR_ROWIN C_GET_MAP_VARCHAR_ROWLOOP 
     LV_MAP_VARCHAR(R_GET_MAP_VARCHAR_ROW .ROLE):= R_GET_MAP_VARCHAR_ROW.NAME; 
     END LOOP; 

    RETURN LV_MAP_VARCHAR; 

    END GET_MAP_VARCHAR 
我的本地變量3210

我的新的SQL程序應該是這樣的:

CREATE OR REPLACE EDITIONABLE PACKAGE BODY "TEST_PACKAGE" AS 

    PROCEDURE PerformersRole(P_ID Number) AS 

    LV_Performer_Map MAP_VARCHAR 
    BEGIN 
    LV_Performer_Map MAP_VARCHAR= GET_MAP_VARCHAR(P_PROCESS_ID NUMBER); 

     DBMS_OUTPUT.PUT_LINE('Hello ' || LV_Performer_Map('Engineer')); 

    END PerformersRole; 

希望這將幫助任何人面臨着訪問從Java

0

在Oracle 11.2不可能使用包級別類型的JDBC。並且不可能在sql級別上創建關聯數組。

此代碼將失敗。

create TYPE MAP_VARCHAR IS TABLE OF VARCHAR(100) INDEX BY VARCHAR(100); 

一個例外是binary_integer的varchar或number索引的關聯數組。 Accessing PL/SQL Associative Arrays

+0

感謝您對我有用的評論@ArkadiuszŁukasiewicz我希望我可以投它爲有用的,但我剛剛創建了我的賬戶,我無法投票,因爲我的聲望<15 – Hanson

相關問題