मैं डेटाबेस में CLOB
एस डालने की कोशिश कर रहा हूं (related question देखें)। मैं समझ नहीं पा रहा हूं कि क्या गलत है। मेरे पास लगभग 85 क्लॉब्स की एक सूची है जो मैं एक टेबल में डालना चाहता हूं। यहां तक कि केवल पहली क्लॉब डालने पर मुझे ORA-00911: invalid character
मिलता है। मैं इसे निष्पादित करने से पहले PreparedStatement
से बयान प्राप्त करने का तरीका नहीं समझ सकता, इसलिए मैं 100% निश्चित नहीं हो सकता कि यह सही है, लेकिन अगर मुझे यह सही लगता है, तो यह बिल्कुल इस तरह दिखना चाहिए:मेरा अमान्य चरित्र कहां है (ORA-00911)
insert all
into domo_queries values ('select
substr(to_char(max_data),1,4) as year,
substr(to_char(max_data),5,6) as month,
max_data
from dss_fin_user.acq_dashboard_src_load_success
where source = ''CHQ PeopleSoft FS''')
select * from dual;
आखिरकार, यह insert all
कथन में into
है, इसलिए मैं नियमित रूप से नियमित insert
कथन नहीं करता हूं। मुझे वहां एक अमान्य चरित्र नहीं दिख रहा है, है ना? (ओह, और से ऊपर वाला कोड ठीक है जब मैं इसे अपने एसक्यूएल डेवलपर टूल में चलाता हूं।) और यदि मैं PreparedStatement
में सेमी-कोलन को हटा देता हूं, तो यह ORA-00933: SQL command not properly ended
त्रुटि फेंकता है।
किसी भी मामले में, क्वेरी निष्पादित करने के लिए मेरा कोड यहां है (और ऊपर दिए गए उदाहरण के लिए चर के मान)।
public ResultSet executeQuery(String connection, String query, QueryParameter... params) throws DataException, SQLException {
// query at this point = "insert all
//into domo_queries values (?)
//select * from dual;"
Connection conn = ConnectionPool.getInstance().get(connection);
PreparedStatement pstmt = conn.prepareStatement(query);
for (int i = 1; i <= params.length; i++) {
QueryParameter param = params[i - 1];
switch (param.getType()) { //The type in the example is QueryParameter.CLOB
case QueryParameter.CLOB:
Clob clob = CLOB.createTemporary(conn, false, oracle.sql.CLOB.DURATION_SESSION);
clob.setString(i, "'" + param.getValue() + "'");
//the value of param.getValue() at this point is:
/*
* select
* substr(to_char(max_data),1,4) as year,
* substr(to_char(max_data),5,6) as month,
* max_data
* from dss_fin_user.acq_dashboard_src_load_success
* where source = ''CHQ PeopleSoft FS''
*/
pstmt.setClob(i, clob);
break;
case QueryParameter.STRING:
pstmt.setString(i, "'" + param.getValue() + "'");
break;
}
}
ResultSet rs = pstmt.executeQuery(); //Obviously, this is where the error is thrown
conn.commit();
ConnectionPool.getInstance().release(conn);
return rs;
}
क्या कुछ भी है जो मुझे अभी बड़ा समय याद आ रहा है?
क्या आप इसे तैयार करने के लिए तैयार स्ट्रेटमेंट को एक स्ट्रिंग के रूप में देख सकते हैं? –
मैंने उस पोस्ट में उल्लेख किया है। मैं यह नहीं समझ सकता कि यह कैसे करें। इंटरनेट पर जो कुछ भी मैं देखता हूं वह यह है कि यह किसी कारण से बहुत जटिल है ... – kentcdodds
कुछ जेडीबीसी ड्राइवर आपको स्ट्रिंग() को तैयार किए गए स्टेटमेंट से क्वेरी दिखाने की अनुमति देते हैं और कुछ नहीं करते हैं। ओरेकल के बारे में निश्चित नहीं है। –