SQL comment mettre à jour les lignes de la table avec une instruction SQL
J'ai une table avec 2 colonnes pour le stockage des paramètres de l'application dans la base de données Oracle. C'est juste un exemple de base:
Je veux créer une méthode java qui met à jour les valeurs à l'aide de l'instruction préparée.
Exemple de code:
MISE À JOUR DU CODE
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();
}
}
Je sais que cette instruction SQL est faux. Quelle est la bonne façon d'écrire l'instruction SQL?
Meilleurs voeux
Peter
P.S
Après la mise à jour du code, j'obtiens cette erreur de pile:
javax.des visages.el.EvaluationException: java.sql.SQLSyntaxErrorException: ORA-00907: manquant parenthèse droite
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)
Causés par: java.sql.SQLSyntaxErrorException: ORA-00907: manquant parenthèse droite
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
OriginalL'auteur Peter Penzov | 2012-03-16
Vous devez vous connecter pour publier un commentaire.
La syntaxe correcte serait quelque chose comme ceci:
Cependant, je ne recommanderais pas cela, car il rend votre code difficile à lire et à maintenir.
Vous êtes probablement mieux de l'exécution de deux instructions update:
Si vous voulez économiser de l'allers-retours vers la base de données, vous pouvez exécuter ce qu'un groupées déclaration:
Cela envoie deux états "aller" vers le serveur de base de données.
Remarque: je suppose que settingName est unique.
Mon exemple est le code Java et le code SQL est destiné à être exécuté comme une déclaration préparée à l'avance (comme dans votre exemple). Vous ne pouvez pas exécuter une instruction SQL avec
?
dans SQL*Plus. Vous avez besoin de les remplacer par des valeurs réelles.Je exécuter l'exemple en SQL developer: pastebin.com/aeb9FmQQ
Pas d'interactive SQL outil que je ne connais peut traiter les requêtes préparées. Vous à remplacer les points d'interrogation avec des valeurs réelles. Je ne comprends pas pourquoi vous avez posté tout ce que le code Java si vous n'êtes pas intéressé par une solution Java mais juste une plaine SQL solution.
oui, j'ai fait ceci: pastebin.com/aeb9FmQQ
OriginalL'auteur a_horse_with_no_name
Vous pouvez consulter tutoriels oracle
WHERE
clauseJ'ai pensé à ajouter, mais j'ai regardé une question d'Exigence de la part de Peter.
Oui, cela permettra de mettre à jour toutes les lignes et de remplacer tout. Donc, la personne qui pose les questions montrent être prudents à ce sujet.
Ouais, bien sûr Daniel, Merci 🙂 je vais modifier ma réponse.
OriginalL'auteur Nandkumar Tekale
OriginalL'auteur tusar