Keine ResultSet bei if in StoredProcedure

K-Man

Bekanntes Mitglied
Hallo zusammen
Ich habe ein seltsames Problem. Ich habe auf meinem SQLServer 2005 eine StoredPrecedure. Darin einen if-Block und 2 select-Befehle. Je nachdem, was man als Parameter übergibt (1 oder 2), wird eine der beiden select ausgeführt (Einfaches select *).
Wenn ich die Methode direkt im SQL Server teste, dann bekomm ich eine schöne Tabelle zurück, sowohl mit dem Parameter 1 und 2. Wenn ich die Methode aber über Java aufrufe, dann bekomme ich die Fehlermeldung "java.sql.SQLException: The executeQuery method must return a result set"

Das Seltsame. Sobald ich die if-Blöcke in der StoreProcedure entferne, geht alles ohne Probleme. Aber wenn ich über einen if-Block den Select-Befehl steuere, kommt diese Fehlermeldung. Was muss ich machen, damit ich die Methode über Java aufrufen kann?

Schon mal vielen Dank
Stefan
 
G

Gast2

Gast
Wie wäre es mit etwas Code? Also wie rufst du die StoredProcedure auf und wie sieht diese genau aus?
 

K-Man

Bekanntes Mitglied
Also die StoredProcedure sieht so aus:
Code:
PROCEDURE [dbo].[spCheck]
	@OMS		int,
	@Oligos		xml,
	@ok			int output,
	@message	varchar(100) output
AS
BEGIN
	SET NOCOUNT ON;
begin try
DECLARE @idoc int

EXEC sp_xml_preparedocument @idoc OUTPUT, @Oligos

DECLARE @OligoTable TABLE (Anchor char(5), Volume float) 

insert into @OligoTable
SELECT *
  FROM OPENXML(@idoc, '/Oligos/Oligo',2)
  WITH (Anchor      char(5),
        Volume			float)  
                

if @OMS = 1
begin       
SELECT * FROM OMS1
 INNER JOIN @OligoTable p ON OMS1.Anchor = p.Anchor where OMS1.Volume < p.Volume
 end
else if @OMS = 2
begin
SELECT * FROM OMS2
INNER JOIN @OligoTable p ON OMS2.Anchor = p.Anchor where OMS2.Volume < p.Volume
end
		set @ok = 1
		set @message = 'Oligocheck erfolgreich'
		return
	end try
	begin catch
		set @ok = 0
		set @message = 'Fehler bei Oligocheck.'
		return
	end catch
END

Die Prozedur rufe ich so auf.
Java:
CallableStatement pre = con.prepareCall("{call spCheck(?,?,?,?)}");
pre.setInt(1, 1);
pre.setString(2, "<Oligos><Oligo><Anchor>A0001</Anchor><Volume>151.0</Volume></Oligo><Oligo><Anchor>A1965</Anchor><Volume>101.0</Volume></Oligo></Oligos>");
pre.registerOutParameter(3, java.sql.Types.INTEGER);
pre.registerOutParameter(4, java.sql.Types.CHAR);
ResultSet rs = pre.executeQuery();


Wie gesagt. Da kommt die Fehlermeldung. Wenn ich die IF-Blöcke aus der StoredProcedure rausnehme und nur eine der beiden select aufrufe, dann geht alles Wunderbar. Nur mit den Blöcken nicht mehr.

Vielen Dank
Stefan
 

K-Man

Bekanntes Mitglied
Die Frage ist wohl auch, warum gibt eine StoredProcedure keine ResultSet zurück, wenn der select in einer if-Schleife ist? Kann das das Problem sein? Und wenn ja, wie kann ich es umgehen?
 
S

SlaterB

Gast
if-schleife.de

baue ein finales else ein oder logge als aller erstes, was denn @OMS für einen Wert hat (bestimmt 0), oder schreibe den Wert in deine DB-Tabelle

> Sobald ich die if-Blöcke in der StoreProcedure entferne, geht alles ohne Probleme.

bedeutet also nicht, dass der gesamte Code optional ist, sondern dass du dann immer noch irgendein SELECT drin hast?
immer genau die Details beachten..
 

K-Man

Bekanntes Mitglied
Du hast recht. Ich hab bei der 2. If-Abfrage das If weggelassen und nur ein else geschrieben. Schon klappt es.
Man braucht also immer ein finales else MIT einem select, damit die StoredProcedure eine ResultSet liefert? Die Frage ist dann natürlich, schaffe ich es auch ohne? Ich will halt, dass die select nur bei einer 1 oder 2 durchgeführt werden.

Aber schon vielen Dank, bin schon etwas weiter mit meinem Problem
 
S

SlaterB

Gast
ich weiß wenig von StoredPrecedures, nur mit dem else ist es kaum getan, es sei denn die Unterscheidung 1/2 funktioniert jetzt?
die ersten Probleme klangen ja eher danach als wenn der Parameter 1 gar nicht ankam, deswegen keines der ifs durchlaufen wurde,

Java selber kann die Prozedure kaum analysieren, das Problem muss ja in der DB gewesen sein, dass wirklich kein ResultSet zurück kam, eben weil anscheinend der Parameter falsch war,

vielleicht läßt sich die Fehlermeldung an sich umgehen, wenn du aus Java executeUpdate() statt executeQuery() aufrufst,
dann ist es für Java ok, dass kein ResultSet zurückkommt,
aber das löst ja das Problem nicht, dass die Stored Precedure was anderes macht als du willst weil der Parameter vielleicht nicht stimmt
 

K-Man

Bekanntes Mitglied
Ich wollte es jetzt so regeln, dass ich ein zusätzliches else einbaue, falls weder 1 noch 2 gewählt wurden.
Code:
if @OMS=1
begin       
SELECT * FROM OMS1
 INNER JOIN @OligoTable p ON OMS1.Anchor = p.Anchor where OMS1.Volume < p.Volume
 		set @ok = 1
		set @message = 'Oligocheck successful'
		return
 end
else if @OMS=2
begin
SELECT * FROM OMS2
INNER JOIN @OligoTable p ON OMS2.Anchor = p.Anchor where OMS2.Volume < p.Volume
		set @ok = 1
		set @message = 'Oligocheck successful'
		return
end
else
begin
		set @ok = 0
		set @message = 'Incorrect database OMS'+char(@OMS)
end
Das komische ist. Er geht immer in den finalen else-Block. Obwohl @OMS = 1 ist. Ist an dem IF-Block was falsch? Wenn ich den letzten else-Block weglasse und dafür beim 1. else das if @OMS=2 weglasse. Also eine ganz normale if-else. Dann geht es.
 
S

SlaterB

Gast
-->
logge als aller erstes, was denn @OMS für einen Wert hat (bestimmt 0), oder schreibe den Wert in deine DB-Tabelle
<--

was der Grund dafür ist kann ich nicht sagen, werden andere Parameter von Java korrekt übertragen?
Index-Zählung beginnend bei 0/1 sollte eigentlich kein Problem sein, dennnoch großflächig testen:

10 Input-Parameter, 5x int, 5x String,
Übergabe 1, 2, 3, 4, 5, "a", "b", "c", "d", "e",
alle 10 Werte loggen/ in eine DB-Tabelle schreiben

was kommt an auf welcher Position, was fehlt? wenn nur String oder XML oder was auch immer funktioniert und anderes nicht, dann eben vorerst nur String verwenden,
genaues kann ich dazu aber nicht sagen,

aus der allgemeinen-Weisheiten-Kiste:
bei allem was man (strukturell neues) tut erst funktionierende Beispiele im Internet (StoredProcedute + Java-Aufruf + int-Parameter) suchen,
wenn diese nicht gehen dann hat man einen sinnvollen Vergleich für andere (Forum),
wenn man keine Beispiele hat kann man nur raten wie es richtig funktionieren könnte, sich aber nie sicher sein, ob das überhaupt möglich ist
 
Zuletzt bearbeitet von einem Moderator:

K-Man

Bekanntes Mitglied
Die Parameter werden richtig übergeben. Wenn ich mit @OMS ausgeben lasse, dann sagt mir auch SQL, dass es 1 ist. Trotzdem geht er in meinem Block nicht in das if mit @OMS=1, sondern in den finalen else-Block
 
S

SlaterB

Gast
da bist du dir sicher?
> char(@OMS)
wie ich jetzt sehe, ist nicht irgendwas komisches was aus ASCII-Code 49 den Char '1' macht oder ähnlich schräges?
ASCII-Tabelle

ein if auf 49 bzw. alle Zahlen von 0-1000 wäre ein kleiner Strohhalm, um das festzustellen
(den SQL-Code dazu mit Copy/Paste oder Java-Schleife erstellen),
oder zielführender: mit größer/kleiner-Vergleichen den Wertebereich einschränken, so vielleicht den tatsächlich interpretierten Wert finden
 

K-Man

Bekanntes Mitglied
Du hattest recht. Der Fehler lag wirklich an der Übergabe. Java hat 49 und nicht 1 übergeben. Vielen Dank.
Jetzt muss ich nur noch schauen, dass ich die Blöcke so hinbekomme, dass es wie anfangs gedacht funktioniert.

Danke aber schon mal.
 

K-Man

Bekanntes Mitglied
Das war ganz komisch. Ich hab nämlich aus einem String den int auslesen lassen. Hab ich den String bei Java ausgegeben, dann hat er mir 1 ausgegeben. Aber beim Casten in int hat er mir aber aus 1 die 49 gemacht.
char b = charAt(x) => 1
Sysout auch 1
Integer.parseInt(b) => 49
 
S

SlaterB

Gast
nun, das ist weniger verrückt, charAt() aus einem String ist was ganz anderes als
> CallableStatement pre = con.prepareCall("{call spCheck(?,?,?,?)}");
> pre.setInt(1, 1);
wie am Anfang geschrieben

ein String enthält den char '1', ein Zahlwert 49, ob System.out.println den nun als Zahl oder char ausgibt..

char c = ..;
System.out.println((int) c);
 

K-Man

Bekanntes Mitglied
Irgendwie hat bei mir aber pre.setInt(1, 1); auch nicht wirklich geklappt und er ist nicht in den if-block rein. Ich weiß jetzt auch nicht warum, oder was falsch war. Jedenfalls hab ich es Dank deiner Hilfe lösen können und bin dir sehr dankbar :)
 
Ähnliche Java Themen
  Titel Forum Antworten Datum
S ResultSet enthält keine Daten Datenbankprogrammierung 2
I Kann keine Daten aus ResultSet holen ? Datenbankprogrammierung 11
I H2 - GUI Tool.... sehe aber keine Tabellen Datenbankprogrammierung 2
raptorrs Plötzlich keine Verbindung zur Datenbank mehr möglich Datenbankprogrammierung 14
Z Ein haufen Fehlermeldungen aber keine Ahnung warum... Datenbankprogrammierung 9
Z Ein Haufen Fehlermeldungen und keine Ahnung... (H2 DB mit Intellij und Scene Builder ) Datenbankprogrammierung 16
V keine Verbindung möglich (Access-DB) Datenbankprogrammierung 3
OnDemand Select * from bringt keine Rückgabe Datenbankprogrammierung 49
Kirby.exe Es werden keine Einträge in der Datenbank gemacht Datenbankprogrammierung 23
J Jar-Datei stellt keine Datenbankverbindung her Datenbankprogrammierung 3
J keine Werte vom PHP Datenbankprogrammierung 3
H MySQL MySQL - Keine Verbindung zur Datenbank?! Datenbankprogrammierung 4
H MySQL Datenbank auf Xampp nimmt keine Mediumblob an. Datenbankprogrammierung 0
S DB2 Express C - keine Verbindung zur Datenbank Datenbankprogrammierung 2
I Es kann keine Verbindung zum Server aufgebaut werden Datenbankprogrammierung 12
D Keine Datenbankverbindung Datenbankprogrammierung 4
M Keine Antwort der Datenbank bei updateQUery(); Datenbankprogrammierung 2
J SQL-Statement Trigger zeigt keine Wikrung PL/SQL Datenbankprogrammierung 2
W Keine ODBC-Verbindung zur MSAccess-Datenbank Datenbankprogrammierung 2
E Warum kann ich keine Datenbank mit DB2 erstellen? Datenbankprogrammierung 2
J Keine Verbindung zu MSSQL DB mit JDBC Datenbankprogrammierung 3
L Probleme mit DriverManager.getConnection(..) - Endlosschleife, Java Absturz, Keine Exception Datenbankprogrammierung 4
T JAR keine H2 driver? Datenbankprogrammierung 3
B Mysql speichert keine 0 alls String Datenbankprogrammierung 11
D Keine Einträge in die Datenbank Datenbankprogrammierung 5
E Derby/JavaDB Keine Reaktion von "insert into" im ActionListener Datenbankprogrammierung 22
Kenan89 Keine Datenbankverbindung möglich Datenbankprogrammierung 52
E JDO -> keine Maps Datenbankprogrammierung 2
D SQLite Statement nimmt keine Namen aus getter-Methoden Datenbankprogrammierung 11
F ORA 17410 Keine weiteren Daten aus Socket zu lesen Datenbankprogrammierung 2
C Derby/JavaDB JavaDB: Keine Connection Datenbankprogrammierung 7
G MySQL Bekomme keine Daten. Datenbankprogrammierung 7
C MySQL Keine Datenbankverbindung Datenbankprogrammierung 6
André Uhres SQL Abfrage erkennt keine Buchstaben mit Akzenten (z. B. é, è) Datenbankprogrammierung 3
P Hibernate -> SQL verwenden und keine Entity Datenbankprogrammierung 19
B Es werden keine Tupel in Tabellen abgelegt Datenbankprogrammierung 2
F Kann keine Verbindung mit HSQLDB aufbauen Datenbankprogrammierung 2
M Keine doppelten Datensätze einfügen Datenbankprogrammierung 24
C keine Verbindung zur MS-SQL-Datenbank mehr Datenbankprogrammierung 4
Y Keine verbindung mit der Datenbank Datenbankprogrammierung 2
D Keine Ausgabe der Daten Datenbankprogrammierung 3
C Keine Verbindung Datenbankprogrammierung 12
B JDBC txt File keine Row ID Datenbankprogrammierung 4
J JDBC - setAutoCommit(false) hat keine wirkung? Datenbankprogrammierung 2
A SELECT-Anweisung liefert keine Datensätze zurück Datenbankprogrammierung 9
P Es werden keine Daten mehr in die Tabelle eingefügt Datenbankprogrammierung 4
A Fehlermeldung: Keine Daten verfügbar Datenbankprogrammierung 2
M Hilfe - keine Connection zur DB Datenbankprogrammierung 4
C Keine Verbindung zu HSQLDB möglich Datenbankprogrammierung 22
G Keine Aussicht mit Prepared Statement Datenbankprogrammierung 10
I Nach export zur .jar keine verbindung mehr Datenbankprogrammierung 7
J Keine Connection zur MySQL Db Datenbankprogrammierung 6
I Keine Treiber-Klasse! Datenbankprogrammierung 9
K keine Verbindung zu mysql Datenbank Datenbankprogrammierung 11
W Keine leeren Felder bei Access Datenbankprogrammierung 15
M Bekomme keine Daten in die DB! Datenbankprogrammierung 11
H Kann keine Verbindung zur DB herstellen Datenbankprogrammierung 7
G linux mysql keine verbindung Datenbankprogrammierung 8
S ResultSet als Parameter an andere Klasse übergeben Datenbankprogrammierung 3
Z ResultSet ist null warum? Datenbankprogrammierung 12
R HSQLDB ResultSet update aktualisiert DB, aber nicht das ResultSet Datenbankprogrammierung 2
Dimax Erstellen ResultSet und Statement Datenbankprogrammierung 30
C PostgreSQL ResultSet.TYPE_SCROLL_SENSITIVE setzen Datenbankprogrammierung 2
L MySQL Bekomme einen Fehler beim ResultSet Datenbankprogrammierung 12
L Zugriff auf ein Resultset Datenbankprogrammierung 7
L MySQL ResultSet vollständig auslesen Datenbankprogrammierung 20
D Resultset schließen ?? Datenbankprogrammierung 5
T Oracle Resultset to Array sehr langsam. Datenbankprogrammierung 8
B Probleme mit java.sql.SQLException: ResultSet closed Datenbankprogrammierung 21
J SQLite ResultSet closed -- Wiederholende DB-Abfragen Datenbankprogrammierung 6
Z MySQL Probleme mit resultSet executQuery Datenbankprogrammierung 3
L ResultSet Datenbankprogrammierung 1
J wie mit resultset.next() über Datensätze iterieren? Datenbankprogrammierung 15
R MySQL Umgang mit ResultSet/Fremdschlüssel ausgeben Datenbankprogrammierung 2
D MySQL ResultSet als Stream weiter geben Datenbankprogrammierung 9
M ResultSet Cachen Datenbankprogrammierung 3
R ResultSet mit "Untertabellen" Datenbankprogrammierung 4
N SQL-Statement Auslesen des Resultset wird immer langsamer Datenbankprogrammierung 6
R Resultset.last() Problem Datenbankprogrammierung 12
PaulG Leeres ResultSet initialisieren Datenbankprogrammierung 6
J Frage zu ResultSet Datenbankprogrammierung 3
J SQL ResultSet Previous Datenbankprogrammierung 10
S MySQL ResultSet in ein Array übertragen Datenbankprogrammierung 7
H PostgreSQL Objekte aus ResultSet Datenbankprogrammierung 5
H ResultSet is closed tritt bei JSF aber nicht bei einer Java-Applikation auf Datenbankprogrammierung 10
O Oracle Resultset greift auf Spaltenüberschriften zu Datenbankprogrammierung 2
Kenan89 Wieso klappt das ResultSet nicht? Datenbankprogrammierung 3
C ResultSet enthält nicht alle Daten Datenbankprogrammierung 4
F Derby/JavaDB Resultset in JTablemodel Datenbankprogrammierung 2
F Oracle ResultSet zu einer HashMap<Integer, String[]> Datenbankprogrammierung 6
B SQLite ResultSet is TYPE_FORWARD_ONLY Datenbankprogrammierung 5
T Exception ResultSet Datenbankprogrammierung 7
0 ResultSet in JTable Datenbankprogrammierung 14
S [SQL] ResultSet Datenbankprogrammierung 4
R ResultSet Datenbankprogrammierung 4
I Sonderbehandlung wenn ResultSet leer ist Datenbankprogrammierung 9
I Problem mit ResultSet Datenbankprogrammierung 2
I SQL_Abfrage-Ergebnis (ResultSet) in String[] speichern Datenbankprogrammierung 29
B ResultSet wirft komische NullPointerException. Datenbankprogrammierung 3
R Detached ResultSet Datenbankprogrammierung 3

Ähnliche Java Themen

Neue Themen


Oben