Oracle PL/SQL Funktion aus Java aufrufen

Hi,

ich hatte das gleiche Problem, wie im letzten Eintrag beschrieben. Ich habe mir die Oracle-Fehlermeldungen noch mal angeschaut und dann im Statement bei der Zuweisung des Rückgabewertes einen Doppelpunkt gesetzt, dann funktioniert es:

{call ? := function(?)}

(Oracle macht im PL/SQL die Zuweisungen generell mit := das macht dann auch Sinn)

Tschau
Lutz
Da ich das Beispiel von Thomas gelesen habe, mutmaße ich, dass der verwendete JDBC-Treiber den Unterschied ausmacht. Ich habe mein Beispiel mit ojdbc14.jar erfolgreich getestet.

Tschau Lutz
 
Hallo, ich habe auch dieses Problem wenn ich benannte Parameter benutze:

Nicht unterstütztes SQL92-Token in Position: 1:

ohne geht das ganz gut. Hat jemand einen Tipp?

PHP:
           cs = conn.prepareCall("{? = call .f_insertBenutzerAllgemein(?,?,?,?) }");
            cs.registerOutParameter(1, Types.INTEGER);
	    cs.setString(2, user.getUserid());
	    cs.setNull(3, Types.INTEGER); //PersonID
	    cs.setString(4, user.getName());
            cs.setString(5, user.getVorname());

2. Wenn ein Wert im User-Objekt null ist muss ich das bei jedem Parameter abfragen und ansonsten mit cs.setNull(10, Types.INTEGER); ersetzen.

Gibt es hierfür eine schönere Lösung?

Danke
 
Hallo,

Hallo, ich habe auch dieses Problem wenn ich benannte Parameter benutze:

Nicht unterstütztes SQL92-Token in Position: 1:

ohne geht das ganz gut. Hat jemand einen Tipp?
Wie gibst du denn deine benannten Parameter an? Bei Oracle verwendet man dazu ":" -> :param1 , :param2 etc.

2. Wenn ein Wert im User-Objekt null ist muss ich das bei jedem Parameter abfragen und ansonsten mit cs.setNull(10, Types.INTEGER); ersetzen.

Gibt es hierfür eine schönere Lösung?
AFAIK gibt es da mit normalem JDBC nicht viel Komfort...

Java:
package de.tutorials.oracle;

import java.sql.CallableStatement;
import java.sql.Connection;
import java.sql.Types;

import oracle.jdbc.pool.OracleDataSource;

public class PLSQLProcedureCallExample {
	public static void main(String[] args) throws Exception {
		OracleDataSource ods = new OracleDataSource();
		ods.setServerName("localhost");
		ods.setDatabaseName("orcl112");
		ods.setDriverType("thin");
		ods.setPortNumber(1521);
		ods.setUser("training");
		ods.setPassword("training");

		Obj obj = 
				new Obj()
				//null
		;
		
		try (Connection con = ods.getConnection()) {
			try (CallableStatement call = con.prepareCall("{? = call test.compute_sum(?, ?)}")) {
				call.registerOutParameter(1, Types.INTEGER);
				
				if(obj == null){
					call.setNull(2, Types.INTEGER);
					call.setNull(3, Types.INTEGER);
				}else{
					call.setInt(2, obj.a);
					call.setInt(3, obj.b);	
				}

				call.execute();
				Integer result = call.getInt(1);
				System.out.println("Result: " + result);
			}
		}
	}
	
	static class Obj{
		int a = 2;
		int b = 40;
	}
}

Test Package Spec
SQL:
create or replace package test as 

  function compute_sum(param_1 number, param_2 number) return number;
  
end test;

Test Package Body:
SQL:
create or replace package body test as

  function compute_sum(param_1 number, param_2 number) return number as
  BEGIN
    return param_1+param_2;
  end compute_sum;

end test;

Ausgabe:
Code:
Result: 42



Gruß Tom
 
Zuletzt bearbeitet von einem Moderator:
Hallo Tom,

danke für die Hilfe. Ich hätte den Code jetzt so mit Parametern bestückt. Bekomme aber diesen Fehler: Incorrectly set or registered parameters.

Code:
cs = conn.prepareCall("{:Ret = call f_insertBenutzerTitel(:UserID, :TitleId, :PersonID, :ErrorText, :ErrorPos)}");
           
cs.registerOutParameter("Ret", Types.INTEGER);
cs.setString("UserID", "max");
cs.setInt("TitleID", 42); 
cs.setInt("PersonID", 6324);
cs.registerOutParameter("ErrorText", Types.VARCHAR);
cs.registerOutParameter("ErrorPos", Types.VARCHAR);
cs.execute();

Das mit den NULL werten ist schade und etwas umständlich, weil ja nicht das ganze User-Object Null ist sonder z.b.: user.getTitle(); Also muss ich für jedes Property abfragen.
 
Zurück