2012-03-16 16 views
5

के साथ तालिका पंक्तियों को अपडेट करने के लिए कैसे करें मेरे पास ओरेकल डेटाबेस में एप्लिकेशन सेटिंग्स को संग्रहीत करने के लिए 2 कॉलम वाली एक तालिका है।एसक्यूएल एक एसक्यूएल कथन

enter image description here

मैं एक जावा तरीका है जिसके तैयार बयान के साथ मूल्यों को अद्यतन करता बनाना चाहते हैं: यह एक सिर्फ बुनियादी उदाहरण है।

उदाहरण कोड:

अपडेट किए गए कोड

public void updateDBSettings() throws SQLException { 


      String SQL_Statement = null; 

      if (ds == null) throw new SQLException();  
     Connection conn = ds.getConnection(); 
      if (conn == null) throw new SQLException();  

     try { 
      conn.setAutoCommit(false); 
      boolean committed = false; 
       try { 
         SQL_Statement = "UPDATE GLOBALSETTINGS SET (SettingName = ?, SettingValue = ?)"; 

         PreparedStatement updateQuery = conn.prepareStatement(SQL_Statement); 
         updateQuery.setString(1, "20"); 
         updateQuery.setString(2, "40"); 

         updateQuery.executeQuery(); 

         conn.commit(); 
         committed = true; 
       } finally { 
         if (!committed) conn.rollback(); 
         } 
      } 
       finally {    
       conn.close(); 

       } 

     }  

मुझे पता है कि यह SQL विवरण गलत है। एसक्यूएल कथन लिखने का सही तरीका क्या है?

बेस्ट पीटर

P.S चाहती कोड मैं यह त्रुटि ढेर मिल अद्यतन करने के बाद:

javax.faces.el.EvaluationException: java.sql.SQLSyntaxErrorException: ORA-00907: दायां कोष्ठक लापता

at javax.faces.component.MethodBindingMethodExpressionAdapter.invoke(MethodBindingMethodExpressionAdapter.java:102) 
at com.sun.faces.application.ActionListenerImpl.processAction(ActionListenerImpl.java:102) 
at javax.faces.component.UICommand.broadcast(UICommand.java:315) 
at javax.faces.component.UIViewRoot.broadcastEvents(UIViewRoot.java:794) 
at javax.faces.component.UIViewRoot.processApplication(UIViewRoot.java:1259) 
at com.sun.faces.lifecycle.InvokeApplicationPhase.execute(InvokeApplicationPhase.java:81) 
at com.sun.faces.lifecycle.Phase.doPhase(Phase.java:101) 
at com.sun.faces.lifecycle.LifecycleImpl.execute(LifecycleImpl.java:118) 
at javax.faces.webapp.FacesServlet.service(FacesServlet.java:593) 
at org.apache.catalina.core.StandardWrapper.service(StandardWrapper.java:1542) 
at org.apache.catalina.core.StandardWrapperValve.invoke(StandardWrapperValve.java:281) 
at org.apache.catalina.core.StandardContextValve.invoke(StandardContextValve.java:175) 
at org.apache.catalina.core.StandardPipeline.doInvoke(StandardPipeline.java:655) 
at org.apache.catalina.core.StandardPipeline.invoke(StandardPipeline.java:595) 
at org.apache.catalina.core.StandardHostValve.invoke(StandardHostValve.java:161) 
at org.apache.catalina.connector.CoyoteAdapter.doService(CoyoteAdapter.java:331) 
at org.apache.catalina.connector.CoyoteAdapter.service(CoyoteAdapter.java:231) 
at com.sun.enterprise.v3.services.impl.ContainerMapper$AdapterCallable.call(ContainerMapper.java:317) 
at com.sun.enterprise.v3.services.impl.ContainerMapper.service(ContainerMapper.java:195) 
at com.sun.grizzly.http.ProcessorTask.invokeAdapter(ProcessorTask.java:849) 
at com.sun.grizzly.http.ProcessorTask.doProcess(ProcessorTask.java:746) 
at com.sun.grizzly.http.ProcessorTask.process(ProcessorTask.java:1045) 
at com.sun.grizzly.http.DefaultProtocolFilter.execute(DefaultProtocolFilter.java:228) 
at com.sun.grizzly.DefaultProtocolChain.executeProtocolFilter(DefaultProtocolChain.java:137) 
at com.sun.grizzly.DefaultProtocolChain.execute(DefaultProtocolChain.java:104) 
at com.sun.grizzly.DefaultProtocolChain.execute(DefaultProtocolChain.java:90) 
at com.sun.grizzly.http.HttpProtocolChain.execute(HttpProtocolChain.java:79) 
at com.sun.grizzly.ProtocolChainContextTask.doCall(ProtocolChainContextTask.java:54) 
at com.sun.grizzly.SelectionKeyContextTask.call(SelectionKeyContextTask.java:59) 
at com.sun.grizzly.ContextTask.run(ContextTask.java:71) 
at com.sun.grizzly.util.AbstractThreadPool$Worker.doWork(AbstractThreadPool.java:532) 
at com.sun.grizzly.util.AbstractThreadPool$Worker.run(AbstractThreadPool.java:513) 
at java.lang.Thread.run(Thread.java:722) 

की वजह से: java.sql.SQLSyntaxErrorException: ORA-00907: दायां कोष्ठक

लापता
at oracle.jdbc.driver.T4CTTIoer.processError(T4CTTIoer.java:445) 
at oracle.jdbc.driver.T4CTTIoer.processError(T4CTTIoer.java:396) 
at oracle.jdbc.driver.T4C8Oall.processError(T4C8Oall.java:879) 
at oracle.jdbc.driver.T4CTTIfun.receive(T4CTTIfun.java:450) 
at oracle.jdbc.driver.T4CTTIfun.doRPC(T4CTTIfun.java:192) 
at oracle.jdbc.driver.T4C8Oall.doOALL(T4C8Oall.java:531) 
at oracle.jdbc.driver.T4CPreparedStatement.doOall8(T4CPreparedStatement.java:207) 
at oracle.jdbc.driver.T4CPreparedStatement.executeForRows(T4CPreparedStatement.java:1044) 
at oracle.jdbc.driver.OracleStatement.doExecuteWithTimeout(OracleStatement.java:1329) 
at oracle.jdbc.driver.OraclePreparedStatement.executeInternal(OraclePreparedStatement.java:3584) 
at oracle.jdbc.driver.OraclePreparedStatement.executeQuery(OraclePreparedStatement.java:3628) 
at oracle.jdbc.driver.OraclePreparedStatementWrapper.executeQuery(OraclePreparedStatementWrapper.java:1493) 
at com.sun.gjc.spi.jdbc40.PreparedStatementWrapper40.executeQuery(PreparedStatementWrapper40.java:642) 
at com.DX_57.SM_57.Application.updateDBSettings(Application.java:124) 
at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method) 
at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:57) 
at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43) 
at java.lang.reflect.Method.invoke(Method.java:601) 
at javax.el.BeanELResolver.invokeMethod(BeanELResolver.java:779) 
at javax.el.BeanELResolver.invoke(BeanELResolver.java:528) 
at javax.el.CompositeELResolver.invoke(CompositeELResolver.java:257) 
at com.sun.el.parser.AstValue.invoke(AstValue.java:248) 
at com.sun.el.MethodExpressionImpl.invoke(MethodExpressionImpl.java:302) 
at com.sun.faces.facelets.el.TagMethodExpression.invoke(TagMethodExpression.java:105) 
at javax.faces.component.MethodBindingMethodExpressionAdapter.invoke(MethodBindingMethodExpressionAdapter.java:88) 
... 32 more 

उत्तर

7

की जांच कर सकते सही सिंटैक्स कुछ इस तरह होगा:

UPDATE GLOBALSETTINGS 
    SET settingValue = case 
         when settingName = 'SessionTTL' = then ? 
         when settingName = 'MaxUsersActive' = then ? 
         else settingValue 
         end 
WHERE settingName in ('SessionTTL', 'MaxUsersActive'); 

हालांकि मैं इस की सिफारिश नहीं होगा, क्योंकि यह आपके कोड कठिन बना देता है पढ़ें और बनाए रखें। आप डेटाबेस के लिए कुछ roundtrips सहेजना चाहते हैं

String sql = 
    "UPDATE GLOBALSETTINGS " + 
    " SET settingValue = ? " + 
    "WHERE settingName = ?"; 

PreparedStatement pstmt = conn.prepareStatement(sql); 
pstmt.setString(1, "40"); 
pstmt.setString(2, "SessionTTL"); 
pstmt.executeUpdate(); 

pstmt.setString(1, "20"); 
pstmt.setString(2, "MaxUsersActive"); 
pstmt.executeUpdate(); 

, आप एक batched बयान के रूप में इस चला सकते हैं::

आप शायद दो अद्यतन बयान चल रहा से बेहतर कर रहे हैं

pstmt.setString(1, "40"); 
pstmt.setString(2, "SessionTTL"); 
pstmt.addBatch(); 

pstmt.setString(1, "20"); 
pstmt.setString(2, "MaxUsersActive"); 
pstmt.addBatch(); 

pstmt.executeBatch(); 

यह भेजता है डेटाबेस सर्वर पर "एक जाना" में दो कथन।

नोट: मुझे लगता है कि सेटिंग नाम अद्वितीय है।

+0

क्या आप वाकई पहले उदाहरण सही हैं? मैं फिर से java.sql.SQLSyntaxErrorException प्राप्त करता हूं: ORA-00905: अनुपलब्ध कीवर्ड। मैं इसे परीक्षण करने के लिए एसकप्लस में कैसे चला सकता हूं?यदि यह एसकप्लस में इसे चलाता है तो मुझे कमांड लाइन में त्रुटि मिलती है: 3 कॉलम: 56 त्रुटि रिपोर्ट: एसक्यूएल त्रुटि: इंडेक्स पर अनुपलब्ध या आउट पैरामीटर :: 1 –

+0

मेरा उदाहरण जावा कोड है और एसक्यूएल का इरादा है तैयार कथन के रूप में चलाएं (बस आपके उदाहरण की तरह)। आप SQL * प्लस में '?' के साथ ऐसा SQL कथन नहीं चला सकते हैं। आपको उन्हें वास्तविक मूल्यों से प्रतिस्थापित करने की आवश्यकता है। –

+0

मैं SQL डेवलपर में उदाहरण चलाता हूं: http://pastebin.com/aeb9FmQQ –

0
SQL_Statement = "UPDATE GLOBALSETTINGS SET (SettingName = ?, SettingValue = ?)"; 
+0

मैंने आपके द्वारा प्रस्तावित कोड को अपडेट किया है लेकिन अब मुझे यह त्रुटि संदेश मिलता है: javax.faces.el.EvaluationException: java.sql.SQLSyntaxErrorException: ORA-00907: अनुपलब्ध दाएं कोष्ठक –

3
String sqlStatement = 
    "update GLOBALSETTINGS " + 
    "set SettingName = ?, " + 
    "SettingValue = ?" + 
    "where id = ?"; // You have to put where condition here, otherwise all rows will get affected. I assume your serch-key-column as id. Change 'id' according to your table 
PreparedStatement updateQuery = con.prepareStatement(sqlStatement); 
updateQuery.setString(1, "20"); 
updateQuery.setString(2, "40"); 
updateQuery.setString(3, applicationSettingId); 

आप tutorials from oracle

+2

जो शायद सबसे अधिक 'WHERE' खंड –

+0

मैंने इसे जोड़ने के बारे में सोचा लेकिन मैंने पीटर से प्रश्न की आवश्यकता को देखा। –

+0

हां, यह सभी पंक्तियों को अपडेट करेगा और सबकुछ ओवरराइट करेगा। तो सवाल पूछने वाले व्यक्ति इस बारे में सावधान रहें। –

संबंधित मुद्दे