"ORA-01008: nicht allen Variablen gebunden" Fehler
Verwende ich folgende Methode für die Berechnung der Personalabrechnung mithilfe von jdbc-aber "ORA-01008: nicht allen Variablen gebunden" Fehler ist nicht zu entfernen.
Jede Idee bitte?
Ich bin mit dem folgenden code
public double getPayroll(){
ResultSet rs = null;
ResultSet rs1 = null;
ResultSet rs2 = null;
Connection conn = null;
PreparedStatement pstmt = null;
try {
conn = getDBConnection();
double dailyPay=0,basicPay=0,payroll2=0;
int houseRent=0,convAllow=0,noOfPresents=0,empId=0;
String q = "select e_id from employee";
pstmt = conn.prepareStatement(q);
rs = pstmt.executeQuery();
while (rs.next()) {
empId=rs.getInt(1);
String q1 = "select count(att_status) from attendance where att_status='p'";
pstmt = conn.prepareStatement(q1);
rs1 = pstmt.executeQuery(q1);
while(rs1.next()){
noOfPresents=rs1.getInt(1);
String q2 = "select e_salary,e_house_rent,e_conv_allow from employee where e_id=?";
pstmt = conn.prepareStatement(q2);
pstmt.setInt(1,empId);
rs2 = pstmt.executeQuery(q2);
while(rs2.next()){
dailyPay=rs2.getInt(1)/22;
houseRent=rs2.getInt(2);
convAllow=rs2.getInt(3);
basicPay=dailyPay*noOfPresents;
payroll2+=basicPay+houseRent+convAllow;
}
}
}
return payroll2;
}catch (Exception e) {
e.printStackTrace();
return 0.0;
} finally {
try {
rs.close();
pstmt.close();
conn.close();
} catch (Exception e) {
e.printStackTrace();
}
}
}
An welchem Punkt sind Sie immer diese exception?
Ist die Teilnahme irgendwie in Verbindung zu Mitarbeiter? Ansonsten ist die
Ist die Teilnahme irgendwie in Verbindung zu Mitarbeiter? Ansonsten ist die
select count(att_status)
für jeden e_id nicht sinnvoll ist (es wird sich nie ändern)InformationsquelleAutor Adnan | 2011-06-24
Du musst angemeldet sein, um einen Kommentar abzugeben.
Dein problem ist hier:
Du erzählst die
PreparedStatement
zum ausführen des SQL -q2
, anstatt die Ausführung der SQL-zuvor vorbereitet. Dies sollte nur sein:Dies ist ein ziemlich häufiger Fehler, vor allem verursacht durch die schlechte Klasse design
java.sql.Statement
und Ihre Subtypen.Als @RMT Punkte heraus, Sie machen den gleichen Fehler hier:
Dieser nicht so eine große Rolle, da es keine Platzhalter in
q1
, so der SQL ausgeführt wird. Es ist immer noch falsch, obwohl.Schließlich sollten Sie erwägen den Aufruf
close()
auf den erstenPreparedStatement
vor dem erneuten zuweisen derpstmt
variable auf eine andere. Riskieren Sie ein Leck, wenn Sie das nicht tun.Problem gelöst haben.Vielen Dank für Ihre Zeit.Aber ich bin verwirrt, warum bin ich nicht die erste Ausnahme in dieser Codezeile rs1 = pstmt.executeQuery(q1);
rs1 nicht werfen Ausnahmen, da q1 keine bind-Variablen
Dank
+1, guter Fang. Abrufen
select count(att_status)
innerhalb der Schleife ist auch nicht nötig, denn es hängt nicht von der e_id (zumindest nicht in dem Beispiel.InformationsquelleAutor skaffman
Haben Sie bereits erstellt, die vorbereitete Anweisung mit dem query q2 gebunden und die variable empId. wenn Sie jetzt rufen pstmt.executeQuery(q2), die variable Bindung ist verloren. Der JDBC-Treiber wohl analysiert die ungebundenen sql q2, wenn Sie ausführen pstmt.executeQuery(q2).
InformationsquelleAutor Basanth Roy
Ein Grund könnte sein, dass Sie nicht re-verwenden Sie die Instanz von pstmt so. Sie haben eine separate PreparedStatement-Instanz in jedem level der Schleife.
Sind Sie sich bewusst, dass dies geschehen kann mit nur einer einzigen Anweisung, wie gut?
Bearbeiten:
Unter der Annahme, es ist eine relation zwischen Mitarbeiter-und Besucherzahlen, so etwas würde zurückgeben, die Summe in einer einzigen Anforderung:
Wenn in der Tat die Teilnahme ist nicht gebunden an Mitarbeiter, lassen Sie einfach die where-Klausel in der geschachtelte select.
InformationsquelleAutor a_horse_with_no_name
UPDATE TESTCP SET CP_KEY2 =?, CP_DESC =?, CP_MAKER =?, CP_MAKER_DT =DATEPART, CP_STATUS ='M' WHERE CP_LANGUAGE = ? UND CP_ENG_CODE = ? UND CP_KEY1 =? UND CP_LANGUAGE =?
In der obigen Abfrage haben wir 7 parameter aber, wenn es in Ihrem java-code PreparedStatement-Sie haben nur 6-parameter-Werte .
Dieser Zeit auch dieser Fehler auftreten wird.
InformationsquelleAutor Amit Agarwal