Callable Statement mit Variablen

Status
Nicht offen für weitere Antworten.

Mark110

Bekanntes Mitglied
Hallo,

ich möchte gerne eine oracle stored procedure aufrufen.
Es werden dort 61 Felder mit Werten gestezt.

Ich habe dzau ein Beispiel gefunden, wo man die Parameter mit ? aufruft:


Code:
import java.io.FileNotFoundException;
import java.io.FileOutputStream;
import java.io.PrintWriter;
import java.sql.CallableStatement;
import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.ResultSet;
import java.sql.SQLException;


public class TestCallProcedure {
    public static void main(String[] args) {
        System.out.println("Connection/SQL test starting TestCallProcedure.java...");

        String driver = "com.ibm.db2.jcc.DB2Driver";
        String url = "jdbc:db2:inyodb2y";
        String userid = USER_ID;
        String password = PASSWORD;

        String location = "ucbkdb2y.";
        String schema = "stutest.";
        String procName = "acet327";

        Connection con = null;

        try { // load the driver
            Class.forName(driver);
        } catch (Exception e) {
            System.out.println("error loading driver");
            e.printStackTrace();

            return;
        }

        try {
            con = DriverManager.getConnection(url, userid, password);
            System.out.println("Connection successful!");

            CallableStatement cs = con.prepareCall("{call " + location +
                    schema + procName +
                    "(?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?)}",
                    ResultSet.TYPE_SCROLL_INSENSITIVE, ResultSet.CONCUR_READ_ONLY);

            //set inputs
            cs.setString(1, "11006");     //ccn
            cs.setString(2, "11667051");  //sid
            cs.setString(3, "    ");      //term year
            cs.setString(4, " ");         //term cd
            cs.setString(5, " ");         //term sub cd

            //set outputs
            cs.registerOutParameter(6, java.sql.Types.CHAR);
            cs.registerOutParameter(7, java.sql.Types.CHAR);
            cs.registerOutParameter(8, java.sql.Types.CHAR);
            cs.registerOutParameter(9, java.sql.Types.CHAR);
            cs.registerOutParameter(10, java.sql.Types.CHAR);
            cs.registerOutParameter(11, java.sql.Types.CHAR);
            cs.registerOutParameter(12, java.sql.Types.CHAR);
            cs.registerOutParameter(13, java.sql.Types.CHAR);
            cs.registerOutParameter(14, java.sql.Types.CHAR);
            cs.registerOutParameter(15, java.sql.Types.CHAR);
            cs.registerOutParameter(16, java.sql.Types.CHAR);
            cs.registerOutParameter(17, java.sql.Types.CHAR);
            cs.registerOutParameter(18, java.sql.Types.CHAR);
            cs.registerOutParameter(19, java.sql.Types.CHAR);

            // execute
            ResultSet rs = cs.executeQuery();

            // display returned values
            System.out.println("\nreturned parameters...");

            System.out.println("error-cd: "          + cs.getString(6));
            System.out.println("dept-cd: "           + cs.getString(7));
            System.out.println("course-num: "        + cs.getString(8));
            System.out.println("exclude_educ_grp: "  + cs.getString(9));
            System.out.println("section_num: "       + cs.getString(10));
            System.out.println("primary_secondary: " + cs.getString(11));
            System.out.println("format_det: "        + cs.getString(12));
            System.out.println("cancel_flag: "       + cs.getString(13));
            System.out.println("instructor_count: "  + Integer.parseInt(cs.getString(14)));
            System.out.println("open_count: "        + Integer.parseInt(cs.getString(15)));
            System.out.println("reserve_count: "     + Integer.parseInt(cs.getString(16)));
            System.out.println("wait_list_count: "   + Integer.parseInt(cs.getString(17)));
            System.out.println("message_text: "      + cs.getString(18));
            System.out.println("number_of_rows: "    + Integer.parseInt(cs.getString(19)));

            System.out.println("\nresult set...");
            System.out.println(
                "\tccn\tsect_num\tinstr_cnt\topen_cnt\treserve_cnt\twaitlist_cnt");

            int numRows = Integer.parseInt(cs.getString(19));

            boolean b = rs.next();
            for (int i = 0; i < numRows; i++) {
                if (!b) {
                    System.out.println("result set rows does not match output parameter row count");
                    System.exit(3);
                }
                System.out.println("\t"   + rs.getString("ccn") +
                                   "\t"   + rs.getString("sect_num") +
                                   "\t\t" + Integer.parseInt(rs.getString("instr_cnt")) +
                                   "\t\t" + Integer.parseInt(rs.getString("open_cnt")) +
                                   "\t\t" + Integer.parseInt(rs.getString("reserve_cnt")) +
                                   "\t\t" + Integer.parseInt(rs.getString("waitlist_cnt")));
                b = rs.next();
            }

            System.out.println("\nnumber of rows found: " + numRows);
        } catch (SQLException e) {
            System.out.println("Caught SQLException!");
            e.printStackTrace();
        } finally {
            try {
                con.close();
            } catch (SQLException e) {
                e.printStackTrace();
            }
        }
    }
}

Ich finde das ganze nur leider zu unübersichtlich bei 61 Feldern..


kann ich Stattdessen auch Variablen benutzen?


Code:
	        CallableStatement cs = verbindung.prepareCall("{call " + location +
	        schema + procName +
	        "("+ vorlagenname+ ", ?, ?, ?, ?)}",
	        ResultSet.TYPE_SCROLL_INSENSITIVE, ResultSet.CONCUR_READ_ONLY);
	        
	        //set input (61 Felder)
	        cs.setString(1, vorlagenname);     //Möglichkeit mit Variable
	        cs.setString(2, "11667051");  //sid
	        cs.setString(3, "    ");      //term year
	        cs.setString(4, " ");         //term cd
	        cs.setString(5, " ");         //term sub cd

Kann man das mit der beispiel variable vorlagenname so machen?
 

The_S

Top Contributor
Was verstehst du unter "variablen" also inwiefern genau? Generell solltest du das so wie in dem Beispiel machen, da z. B. ein CallableStatement#setString gleich den String in das entsprechende Format bringt (z. B. Sonderzeichen escaped ...).
 
S

SlaterB

Gast
überleg doch mal?
du übergibst einer ganz normal beliebigen Java-Operation einen String,
wer sollte den Unterschied feststellen, ob das ein direkt angegebener String oder eine Variable ist?

das ist nix anderes als der Unterschied zwischen
System.out.println("x");
und
String y = "x";
System.out.println(y);

selbstverständlich geht das,
überall in Java


edit: ok, wenn der Variablenname das ? ersetzen und später zugeordnet werden soll, dann wirds aufwändiger..

edit2: beim PreparedStatement in Java sehe ich die Möglichkeit nicht
 

Mark110

Bekanntes Mitglied
mir geht es um die übersichtlichkeit


wofür steht das fragezeichen ?

Kann java statt dem fragezeichen dann auch dne variablennamen zuweisen?
 

The_S

Top Contributor
ich verstehs immer noch nicht. Das Fragezeichen steht für einen Parameter, der über eine set-Methode des Callable/PreparedStatements zugewiesen wird.
 
S

SlaterB

Gast
> wofür steht das fragezeichen ?

für einen Platzhalter

> Kann java statt dem fragezeichen dann auch dne variablennamen zuweisen?

ich denke nicht, jedenfalls nicht JDBC,
höhere Libaries wie Hibernate dagegen schon, falls wir das gleiche meinen:

String queryString = "Select .. :test ...";
query.setString("test",irgendwas);


---------

falls du das nachbauen willst:
angenommen es ginge, dann müsstest du ja im Query-String die Platzhalternamen in der richtigen Reihenfolge aufführen:
call ... a, b, c, ..

lege diese nun stattdessen in der richtigen Reihenfolge in ein String-Array:
String[] platzhalter = new String[] {"a","b","c"};

außerdem noch eine Map in der du ohne bestimmte Reihenfolge deine Parameter setzt
map.put("c",irgendwas);
map.put("a",irgendwas);
map.put("b",irgendwas);
(statt cs.setString("a", irgendwas); )

der Rest ist dann noch reine Arbeit:
den QueryString mit so vielen ? füllen wie Elemente im String-Array

und
cs.setString(index, irgendwas);
auch für alle Platzhalter im String-Array aufrufen:

for-Schleife:
cs.setString(i, map.get(platzhalter));
 

Mark110

Bekanntes Mitglied
es hat sich gerade herausgestellt, dass doch nicht mehr so viele platzhalter benötigt werden.


ich erhalte aber eine fehlermeldung:

Verbindung erfolgreich
java.sql.SQLException: ORA-06550: Zeile 1, Spalte 7:
PLS-00221: 'DELFILT' ist keine Prozedur oder ist nicht definiert
ORA-06550: Zeile 1, Spalte 7:
PL/SQL: Statement ignored
Code:
import java.sql.Connection; 
import java.sql.DriverManager; 
import java.sql.CallableStatement;
import java.util.*;
import java.sql.ResultSet; 
import java.sql.Statement; 
import java.sql.SQLException;

public class Default {

	String url;
	String user;
	String pass;
	Statement befehl;
	Connection verbindung;
	ResultSet datenmenge;
	String vorlagenname;
		
		
	public Default (){
			
		url  = "**";
		user = "**";
		pass = "****";
			
		String location = "";
	    String schema = "all";
	    String procName = "delFilt";

			
		try {
			Class.forName("oracle.jdbc.driver.OracleDriver");
		} catch (Exception e) {
			System.err.println("Fehler beim Laden des Oracle Treibers!");
			return;
		}	
		try {
			verbindung = DriverManager.getConnection(url,user,pass);
			System.out.println("Verbindung erfolgreich");
		} catch (Exception e) {
			System.err.println("Verbindung zu " + url + " fehlgeschlagen!");
		}
		try {
	        CallableStatement cs = verbindung.prepareCall("{call " + location +
	        schema + procName +
	        "(?, ?, ?)}",
	        ResultSet.TYPE_SCROLL_INSENSITIVE, ResultSet.CONCUR_UPDATABLE);
	        
	        //set input (61 Felder)
	        cs.setString(1, "000051");     //Kunde
	        cs.setString(2, "105622");  //Benutzer
	        cs.setString(3, "1");      //VID
	        

	        
	        
	        // execute
            ResultSet rs = cs.executeQuery();

            verbindung.close();
		}catch (Exception e) {
			System.err.println(e);
		}
			
		
	}//Ende des Konstruktors

	
	public static void main(String[] args) {
		Default test = new Default();
		
	}

	
	
//Ende der Klasse
}

kann jemand etwa smit der fhelermledung anfangen?
 

The_S

Top Contributor
Vermutlich findet er das Programm des CallableStatements (DELFILT) nicht. Ist die Prozedur richtig angelegt?
 

Mark110

Bekanntes Mitglied
nein es lag daran, dass in oracle das ganze nicht mit call anfangen darf sondenr mit begin und end;

jetzt kalppt es.

trozdem danke
 
Status
Nicht offen für weitere Antworten.
Ähnliche Java Themen
  Titel Forum Antworten Datum
T Callable ohne Blockierung des aufrufenden Threads? Java Basics - Anfänger-Themen 2
N Compiler-Fehler Not a statement Error Java Basics - Anfänger-Themen 7
J Rekursive Funktion und return statement Java Basics - Anfänger-Themen 3
A switch statement Java Basics - Anfänger-Themen 4
javapingu Variablenwerte ändern ohne return Statement? Java Basics - Anfänger-Themen 7
A Compiler Fehler - not a statement Java Basics - Anfänger-Themen 2
C java.sql Statement kann nicht geschlossen werden Java Basics - Anfänger-Themen 9
freudianslip if-Statement mit mehreren Zahlenwerten Java Basics - Anfänger-Themen 4
B Methoden if-statement error, FX, Fehlermeldung Java Basics - Anfänger-Themen 6
J Missing Return Statement Java Basics - Anfänger-Themen 11
J if or statement? Java Basics - Anfänger-Themen 2
P if - Statement erkennt variable nicht. Java Basics - Anfänger-Themen 12
T Not a Statement/Illegal Start of expression bei for Anweisung Java Basics - Anfänger-Themen 6
L Variable in If-Statement initialisieren Java Basics - Anfänger-Themen 4
B Problem bei switch statement Java Basics - Anfänger-Themen 4
M Return statement Java Basics - Anfänger-Themen 4
C Warum funktioniert mein If Statement nicht richtig? Java Basics - Anfänger-Themen 18
H Compiler-Fehler error not a statement Java Basics - Anfänger-Themen 2
K Input/Output If-Statement wird übersprugen Java Basics - Anfänger-Themen 5
W Return statement in Methode nur bei if-clause Java Basics - Anfänger-Themen 3
C Return statement Java Basics - Anfänger-Themen 10
T Boolean Missing return Statement?! Java Basics - Anfänger-Themen 2
B Not a statement error Java Basics - Anfänger-Themen 2
P fibonacci - do while Statement Logik Fehler Java Basics - Anfänger-Themen 5
T Problem im If-Else-Statement Java Basics - Anfänger-Themen 4
SexyPenny90 Why "Empty Statement"?!? Java Basics - Anfänger-Themen 2
O IF-Statement wird nicht ausgeführt Java Basics - Anfänger-Themen 7
P Compiler-Fehler Boolean: Missing Return Statement Java Basics - Anfänger-Themen 4
M SQL Statement Problem Java Basics - Anfänger-Themen 22
I Methoden Missing return statement; Intervallschachtellung Java Basics - Anfänger-Themen 12
I Problem mit H2-DB Insert-Statement Java Basics - Anfänger-Themen 3
A Assert statement Java Basics - Anfänger-Themen 3
M missing return statement?! Java Basics - Anfänger-Themen 4
J Prepared Statement Out of BondsException Java Basics - Anfänger-Themen 4
P Compiler-Fehler unreachable statement Java Basics - Anfänger-Themen 4
A Missing return-Statement Java Basics - Anfänger-Themen 9
T missing return statement Java Basics - Anfänger-Themen 36
P OOP unreachable statement - Fehler? Java Basics - Anfänger-Themen 3
E missing return statement Java Basics - Anfänger-Themen 6
H not a statement meldungen Java Basics - Anfänger-Themen 12
B Error:not a statement FEHLER bei * Java Basics - Anfänger-Themen 3
F import Statement für Klassen die dem default Package zugeordnet sind? Java Basics - Anfänger-Themen 2
B Not a Statement Problem Java Basics - Anfänger-Themen 8
S Not a Statement? Java Basics - Anfänger-Themen 10
C missing return statement Java Basics - Anfänger-Themen 5
K SQL Statement formatieren + Swingzeug auslagern Java Basics - Anfänger-Themen 18
dognose missing Return Statement Java Basics - Anfänger-Themen 4
H Funktion erkennt das return-statement nicht Java Basics - Anfänger-Themen 12
G [Hibernate] Aus SQL-Statement Entities erzeugen Java Basics - Anfänger-Themen 2
A SQL Create Table Statement Java Basics - Anfänger-Themen 19
T if-then statement soll nur Zahlen zulassen Java Basics - Anfänger-Themen 12
G Missing return Statement Java Basics - Anfänger-Themen 2
S prepared statement delete Java Basics - Anfänger-Themen 5
J Statement an MySQL Datenbank schicken Java Basics - Anfänger-Themen 4
L INSERT Statement geht nicht HILFE! Java Basics - Anfänger-Themen 2
I call to super must be first statement in constructor Java Basics - Anfänger-Themen 3
L IF Bedingung in SELECT Statement? Java Basics - Anfänger-Themen 3
R "missing return statement"? Java Basics - Anfänger-Themen 2
S prepared statement Java Basics - Anfänger-Themen 10
G SQL Statement Java Basics - Anfänger-Themen 4
J Variable Werte in einem SQL Statement? Java Basics - Anfänger-Themen 8
G Inhalt Textfield in SQL Statement klappt nicht. Java Basics - Anfänger-Themen 2
F Missung Return Statement Java Basics - Anfänger-Themen 10
G Button und SQL-Statement ausführen Java Basics - Anfänger-Themen 6
H Variable zuweisung in einem If-Statement Java Basics - Anfänger-Themen 3
J return- Statement Java Basics - Anfänger-Themen 3
G missing return statement Java Basics - Anfänger-Themen 5
S Problem mit if-Statement Java Basics - Anfänger-Themen 5
G Array und switch-Statement Java Basics - Anfänger-Themen 4
R kurzes if-then-else statement Java Basics - Anfänger-Themen 8
M missing return statement Java Basics - Anfänger-Themen 4
O Welcher Object-Lock-Pool bei static Variablen? Java Basics - Anfänger-Themen 3
T variablen klassen übergreifend Java Basics - Anfänger-Themen 12
T Variablen Java Basics - Anfänger-Themen 1
N Verständnis Frage zu Variablen Java Basics - Anfänger-Themen 3
M Aufsummieren von variablen Wertegrößen Java Basics - Anfänger-Themen 17
M Mehrere Daten/ Variablen Speichern Java Basics - Anfänger-Themen 9
J Speichern von zwei Variablen durch Auslesen aus einem Numberfield Java Basics - Anfänger-Themen 2
ashi Variablen aufrufen Java Basics - Anfänger-Themen 17
U Warum kann ich, auf private Variablen zugreifen, wenn ich ein Objekt in der Klasse, die private Variablen hat erstelle und dort drauf zugreifen will? Java Basics - Anfänger-Themen 7
B Konkatenieren eines Strings und inkremtierenden Zahl zu einer INT Variablen Java Basics - Anfänger-Themen 7
A 2 Strings vergleichen in einer methode wenn man mit Globalen variablen arbeitet Java Basics - Anfänger-Themen 12
C Konstruktoren und Variablen Java Basics - Anfänger-Themen 42
F Auf Variablen eines Konstruktors zugreifen Java Basics - Anfänger-Themen 4
N Variable aus anderen Variablen in statischer Klasse berechnen/abspeichern? Java Basics - Anfänger-Themen 4
M Wie kann ich bei int-Variablen im exception handler auf bestimmte Strings reagieren? Java Basics - Anfänger-Themen 5
M Warum dürfen Objekte einer Klasse auf statische Variablen dieser Klasse referenzieren? Java Basics - Anfänger-Themen 10
B Variablen Variablen übertragen ohne Klassen Java Basics - Anfänger-Themen 5
B Methoden Methoden haben kein Zugriff auf variablen Java Basics - Anfänger-Themen 4
T Java Swing - Dreieck zeichnen mit verschiedenen Variablen Java Basics - Anfänger-Themen 8
Arif Vererbung Methodenvererbung mit finalen Variablen Java Basics - Anfänger-Themen 1
M Wie kann ich ein Objekt erstellen, wenn sich der Klassenname in einer Variablen befindet? Java Basics - Anfänger-Themen 10
S Variablen Variablen in einer Schleife erstellen lassen Java Basics - Anfänger-Themen 11
J Ich brauche Hilfe bei einem Code (Variablen speichern) Java Basics - Anfänger-Themen 29
F Variablen Werte einer Klasse überschreiben Java Basics - Anfänger-Themen 4
N Speichern von Werten in Variablen nach Schließen des Programms Java Basics - Anfänger-Themen 3
J Frage dazu Variablen klassenübergreifend zu verändern Java Basics - Anfänger-Themen 22
M Java Instanz-Variablen ? Java Basics - Anfänger-Themen 3
B Variablen von Methoden übertragen Java Basics - Anfänger-Themen 2
M Variablen umbenennen Java Basics - Anfänger-Themen 1

Ähnliche Java Themen

Neue Themen


Oben