2016-04-12 11 views
2

Ich muss eine Oracle-Prozedur mit einem IN-Parameter mit VARCHAR2 und OUT-Parameter als BOOLEAN-Datentyp aufrufen.JDBC - Retrieve boolesche Ausgabe von Oracle Prozedur

Unten ist mein Code SimpleJdbcCall

SimpleJdbcCall jdbcCall = new SimpleJdbcCall(getTemplate()) 
      .withCatalogName("package_name") 
      .withProcedureName("proc_name") 
      .withoutProcedureColumnMetaDataAccess() 
      .declareParameters(
       new SqlParameter ("userName", Types.VARCHAR), 
       new SqlOutParameter("status", Types.BOOLEAN) 
      );     
Map<String, Object> inParams = new HashMap<String, Object>(); 
inParams .put("userName", userInput); 
Map<String, Object> outputValue= jdbcCall.execute(inParams); 

Ausnahme: CallableStatementCallback; nicht kategorisierte SQLException für SQL [{Aufruf PACKAGE_NAME.PROC_NAME (?,?)}]; SQL-Status [99999]; Fehlercode [17004]; Ungültiger Spaltentyp: 16; verschachtelte Ausnahme ist java.sql.SQLException: Ungültige Spaltentyp: 16

Nach einem Recherchen fand ich, dass „JDBC-Treiber die Weitergabe von Booleschen Parameter PL/SQL gespeicherte Prozeduren nicht unterstützen

Es wurde vorgeschlagen, die PL/SQL-Prozedur mit einer zweiten PL/SQL-Prozedur zu umbrechen. Das Hauptproblem ist, dass ich für den Schreibzugriff in der Datenbank eingeschränkt bin, da dies Client-Daten sind. Bitte helfen Sie mir, dieses Problem zu beheben.

Einige der Links verwiesen i

  1. https://docs.oracle.com/cd/F49540_01/DOC/java.815/a64685/tips3.htm
  2. https://community.oracle.com/thread/2139408?tstart=0
  3. https://community.oracle.com/thread/887712?tstart=0
  4. https://community.oracle.com/thread/975159?tstart=0
  5. Stored Function - Sending/Receiving Boolean - BD
  6. http://docs.oracle.com/cd/B28359_01/java.111/b31224/apxtblsh.htm#i1005380

Antwort

2

Ich habe das Problem behoben, indem ich eine Wrapper-Prozedur geschrieben habe, um das Ergebnis der eigentlichen Prozedur zu verarbeiten und das Ergebnis als Varchar-Datentyp zurückzusenden. Wenn einer von Ihnen es als falschen Ansatz findet oder wenn Sie einen einfachen Weg haben, dies zu beheben, teilen Sie uns bitte Ihre Kommentare mit.

Im Folgenden ist das Verfahren:

DECLARE 
userName VARCHAR2(13); 
status BOOLEAN; 
result VARCHAR2(13); 

BEGIN 
userName := ?; 
status := NULL; 
package_name.proc_name (userName, status); 
BEGIN 
IF status THEN result := 'Yes'; 
ELSIF NOT status THEN result := 'No'; 
ELSE result := 'NULL'; 
END IF; 
END; 
COMMIT; 
? := result; 
END ; 

auch statt simpleJdbcCall, verwenden i Callablestatement dies für die Verarbeitung. Siehe unten:

try{ 
    String wrapperProc= "DECLARE userName VARCHAR2(13); status BOOLEAN; result VARCHAR2(13); BEGIN userName := ?; status := NULL; "+ 
     "package_name.proc_name (userName, status); BEGIN IF status THEN result := 'Yes'; ELSIF NOT status THEN " + 
      "result := 'No'; ELSE result := 'NULL'; END IF; END; COMMIT; ? := result;END ;"; 
    CallableStatement proc_stmt= null; 
    proc_stmt = getTemplate().getDataSource().getConnection().prepareCall(wrapperProc); 
    proc_stmt.setString(1, "userName"); 
    proc_stmt.registerOutParameter(2, Types.VARCHAR); 
    proc_stmt.execute(); 
    System.out.println("Final Result : "+proc_stmt.getString(2)); 
} catch(SQLException e){ 
    System.out.println("SQL Exception : "+e.getMessage()); 
    e.printStackTrace(); 
} catch (Exception e) { 
    System.out.println("Exception : "+e.getMessage()); 
    e.printStackTrace(); 
} 

~~ Suriya

0

Von der offiziellen Oracle JDBC documentation:

es nicht möglich ist für Treiber Oracle JDBC Argumente oder Rückgabewerte der PL/SQL zu unterstützen Aufruf RECORD, BOOLEAN oder Tabelle mit nicht skalaren Elementtypen. [...] Zur Umgehung von PL/SQL RECORD, BOOLEAN- oder nicht-skalaren Tabellentypen, erstellen Sie Containerprozeduren, die die Daten als von JDBC unterstützte Typen behandeln .Um beispielsweise eine gespeicherte Prozedur mit PL/SQL-Boolean zu umbrechen, erstellen Sie eine gespeicherte Prozedur , die ein Zeichen oder eine Nummer aus JDBC übernimmt und an die ursprüngliche Prozedur als BOOLEAN oder für einen Ausgabeparameter als Boolean annimmt Argument aus der ursprünglichen Prozedur und übergibt es als CHAR oder NUMBER an JDBC. Um eine gespeicherte Prozedur mit PL/SQL-Datensätzen zu umbrechen, erstellen Sie ähnlich eine gespeicherte Prozedur, die einen Datensatz in seinen einzelnen Komponenten wie CHAR und NUMBER oder in einem strukturierten -Objekttyp verarbeitet.

Dies ist genau das, was Sie in Ihrer Antwort getan haben, aber ich wollte die Dokumentation als Referenz hinzufügen.

+0

Danke für Ihren Hinweis auf Dokumentation :-) –