בעיה בPreparedStatement בJAVA

trattnh

New member
בעיה בPreparedStatement בJAVA

אם אני כותב בשאילתא select * from table where my_date in (to_date('20040101','YYYYMMDD')) אז אין בעיה והכל עובד. אבל אם השאלה היא select * from table where my_date in ? ואז אני עושה ps.setString(1,"(to_date('20040101','YYYYMMDD'))") אני מקבל SQLException 01858 a non numeric symbol where a numeric symbol expected. מה הבעיה?
 

vinney

Well-known member
פרמטרים בSQL

היי לא יודע איך זה בJAVA, אבל עקרונית כשאתה מגדיר פרמטר, מוגדר גם הטיפוס שלו (בד"כ אוטוומטית). לכן, כשאתה הגדרת את הפרמטר בSQL שלך, הוא קיבל טיפוס DATE, ואתה מציב לתוכו VARCHAR, לכן אתה מקבל שגיאה.
 

voguemaster

New member
לא ככה עובדים עם PreparedStatement

דוגמא לעבודה נכונה תהיה:
String stmt = new String("SELECT * FROM table WHERE my_date IN (to_date('?', 'YYYYMMDD'))"; try { // create a statement PreparedStatement pst = dbObject.prepareStatement(stmt); pst.setString(1, "20040101"); // execute pst.executeUpdate(); // do whatever // close pst.close(); } catch(SQLException e) { e.printStackTrace(); }​
כשעובדים עם PreparedStatement, כל ערך שאתה רוצה להזין, בין אם מספר או מחרוזת או מה שלא יהיה, חייב להיות מצוין ע"י סימן שאלה במחרוזת המקורית של השאילתא. אחרי שיצרת מהמחרוזת הזו אובייקט PreparedStatement אתה יכול להשתמש ב-setXXX כדי להחליף את הסימן שאלה (במקרה הזה הראשון) במשתנה שלך. בדוגמא שהבאתי החלפתי אותו ב-20040101 שפשוט הכנסתי בתור מחרוזת אבל אפשר גם לעבוד עם אובייקט מסוג Date ולבצע את ההמרה באופן אוטומטי.
 

trattnh

New member
הבעיה שלי היא שאני רוצה

שאילתא כזאת: myDate in ? כאשר אני עושה setString למחרוזת שאני מקבל כפרמטר עם מספר שנקבע בזמן ריצה של תאריכים. לדוגמא: (to_date('20001010','YYYYMMDD'),to_date('20000909','YYYYMMDD'), to_date('20000404','YYYYMMDD')) הוא לא מצליח להריץ את הפונקציה הזאת. אמרת שאפשר גם לעבוד עם אובייקט מסוג Date. אבל אני רוצה לעבוד עם מערך בגודל שנקבע בזמן ריצה של תאריכים. מה אפשר לעשות?
 

trattnh

New member
אחרי עיון בפורום באתר של JAVA מסתבר

שאי אפשר. צריך לבנות דינמית את השאילתה.
 

voguemaster

New member
אחת משתי אופציות

1. תשתמש ב-setDate של PreparedStatement. 2. יש לך גם ככה אובייקטים של תאריך, תמיר אותם למחרוזות בעזרת DateFormat. הסימני שאלה הם ממלאי מקום. כשאתה עושה להם set הפלטפורמה ממירה את הטיפוס לטיפוס המתאים ששרת ה-SQL יכול לקבל.
 
למעלה