2012-03-16 35 views
5

Tôi có một bảng có 2 cột để lưu trữ các thiết lập ứng dụng trong cơ sở dữ liệu Oracle. Đây là một ví dụ chỉ là cơ bản:SQL cách cập nhật các hàng trong bảng bằng một câu lệnh SQL

enter image description here

Tôi muốn tạo ra một phương pháp java mà cập nhật các giá trị với tuyên bố sẵn sàng.

Ví dụ mã:

CẬP NHẬT MÃ

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(); 

       } 

     }  

Tôi biết rằng câu lệnh SQL này là sai. Cách thích hợp để viết câu lệnh SQL là gì?

Chúc Peter

P.S Sau khi cập nhật mã tôi nhận được lỗi chồng này:

javax.faces.el.EvaluationException: java.sql.SQLSyntaxErrorException: ORA-00907: ngoặc đúng mất tích

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) 

Nguyên nhân: java.sql.SQLSyntaxErrorException: ORA-00907: right ngoặc

mất tích
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 

Trả lời

7

Cú pháp đúng sẽ là một cái gì đó như thế này:

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

Tuy nhiên tôi sẽ không khuyên bạn điều này bởi vì nó làm cho mã của bạn khó có thể đọc và duy trì.

Bạn đang có lẽ tốt hơn chạy hai báo cáo cập nhật:

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(); 

Nếu bạn muốn tiết kiệm một số roundtrips đến cơ sở dữ liệu, bạn có thể chạy như một tuyên bố batched:

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

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

pstmt.executeBatch(); 

này gửi hai câu lệnh trong "một lần" tới máy chủ cơ sở dữ liệu.

Lưu ý: Tôi cho rằng tên cài đặt là duy nhất.

+0

Bạn có chắc chắn ví dụ đầu tiên là chính xác không? Tôi nhận lại java.sql.SQLSyntaxErrorException: ORA-00905: thiếu từ khóa. Làm thế nào tôi có thể chạy nó trong sqlplus để kiểm tra nó?Nếu nó chạy nó trong sqlplus theo cách này tôi nhận được lỗi tại Command Line: 3 Cột: 56 Báo cáo lỗi: Lỗi SQL: Thiếu tham số IN hoặc OUT tại chỉ mục :: 1 –

+0

Ví dụ của tôi là mã Java và SQL được dự định là chạy như một tuyên bố chuẩn bị (giống như ví dụ của bạn). Bạn không thể chạy một câu lệnh SQL như vậy với '?' Trong SQL * Plus. Bạn cần phải thay thế chúng bằng các giá trị thực. –

+0

Tôi chạy ví dụ trong nhà phát triển SQL: http://pastebin.com/aeb9FmQQ –

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

Tôi đã cập nhật mã như bạn đề xuất nhưng giờ tôi nhận được thông báo lỗi này: javax.faces.el.EvaluationException: java.sql.SQLSyntaxErrorException: ORA-00907: thiếu dấu ngoặc đơn phải –

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); 

Bạn có thể kiểm tra tutorials from oracle

+2

Điều đó rất có thể cũng sẽ yêu cầu 'WHERE' khoản –

+0

Tôi nghĩ về nó để thêm nhưng tôi nhìn vào câu hỏi Yêu cầu từ Peter. –

+0

Có, điều này sẽ cập nhật tất cả các hàng và ghi đè mọi thứ. Vì vậy, người hỏi các câu hỏi cho thấy cẩn thận về điều này. –

Các vấn đề liên quan