2012-01-20 32 views
13

Estoy tratando de actualizar un registro en el desarrollador de Oracle Oracle mediante el uso de combinaciones. que sigue es mi query-Error de SQL: ORA-00933: El comando de SQL no finalizó correctamente

UPDATE system_info set field_value = 'NewValue' 
FROM system_users users 
JOIN system_info info ON users.role_type = info.field_desc 
where users.user_name = 'uname' 

Sin embargo, cuando traté de ejecutarlo, me siguiente de errores

Error report: SQL Error: ORA-00933: SQL command not properly ended 
       00933. 00000 - "SQL command not properly ended" 

He intentado eliminar UNE

UPDATE system_info info 
SET info.field_value = 'NewValue' 
FROM system_users users 
where users.user_name = 'uname' AND users.role_type = info.field_desc 

pero sigue teniendo el mismo error ¿Alguien puede decirme la razón y la solución del error

+0

Creo que su sqlDevelepor ejecutó la línea anterior.poner un punto y coma antes y después de la instrucción SQL y vuelva a intentarlo –

+0

Probé su solución, pero no funciona para mí –

Respuesta

12

Oracle no permite unir tablas en una instrucción UPDATE. Es necesario volver a escribir su declaración con un co-relacionado sub-select

Algo como esto:

UPDATE system_info 
SET field_value = 'NewValue' 
WHERE field_desc IN (SELECT role_type 
        FROM system_users 
        WHERE user_name = 'uname') 

Para una descripción completa de la sintaxis (válido) de la instrucción UPDATE, por favor lea el manual:

http://docs.oracle.com/cd/E11882_01/server.112/e26088/statements_10008.htm#i2067715

+0

Al ver esto por primera vez desde que se alineó en un Comentario (en noviembre de 2016). Esto no es cierto: Oracle permite uniones en una ACTUALIZACIÓN, pero hay algunas restricciones (obvias, exigidas por la lógica, no por Oracle). ¿De dónde viene este concepto erróneo muy extendido de que Oracle no permite actualizar una unión? ¿Cómo se explica la actualización con el trabajo, por ejemplo, se une aquí: http://stackoverflow.com/questions/37001180/update-with-join-syntax-for-oracle-database – mathguy

+0

@mathguy: Oracle permite actualizar una tabla derivada (sub -query) que bajo ciertas restricciones puede usar una combinación (principalmente: la consulta debe ser una "tabla clave conservada"). Pero eso es algo diferente, entonces simplemente unirse a la tabla de destino a otra mesa (que tiene típicamente menos restricciones en los DBMS que apoyan esta) –

+0

Exactamente - que no es lo mismo que "Oracle no permite unir tablas en una sentencia UPDATE". Lo sé, y es evidente que tú también lo sabes; ahora busque a través de SO y vea cuántas veces la gente hace esa afirmación, incluso en (muchos) casos cuando actualizar a través de una unión funcionaría perfectamente bien, si solo las personas usaran la sintaxis adecuada y tuvieran la restricción única adecuada en la tabla fuente. Acabo de crear un artículo de Documentación para discutir esto, veremos si está aprobado. – mathguy

1

Su petición debe ser similar

UPDATE table_name 
SET column1=value, column2=value2,... 
WHERE some_column=some_value 

Puede comprobar la pregunta a continuación en busca de ayuda

+0

ANSI uniones están soportados por Oracle – Sathya

+0

@Sathya: pero no en una instrucción UPDATE. –

+0

@a_horse_with_no_name ah. Gracias. – Sathya

-6

su muy cierto en Oracle, así como SQL es "usuarios" es una palabras reservadas solo lo cambian, va a servir u mejor si u como cambiarlo a este

UPDATE system_info set field_value = 'NewValue' 

FROM system_users users JOIN system_info info ON users.role_type = info.field_desc where users.user_name = 'uname'

+3

'users' is ** not ** ¡una palabra reservada! 'user' sin embargo es una palabra reservada. Pero el verdadero problema es que Oracle no permite FROM o JOIN en una instrucción UPDATE. –

2
No

exactamente el caso del actual contexto de esta pregunta, pero esta excepción puede ser reproducida por la siguiente consulta:

update users set dismissal_reason='he can't and don't want' where userid=123 

Las comillas simples en las palabras can't y don't rompieron la cadena. En caso de que la cadena tenga solo una comilla interna, p. 'no desea' oráculo arroja cadena de comillas más citada no terminada correctamente error, pero en el caso de dos comando SQL no finalizado correctamente se arroja.

Resumen: verifique su consulta para comillas simples dobles.

10

Semicolon ; al final del comando me causó el mismo error.

cmd.CommandText = "INSERT INTO U_USERS_TABLE (USERNAME, PASSWORD, FIRSTNAME, LASTNAME) VALUES (" 
       + "'" + txtUsername.Text + "'," 
       + "'" + txtPassword.Text + "'," 
       + "'" + txtFirstname.Text + "'," 
       + "'" + txtLastname.Text + "');"; <== Semicolon in "" is the cause. 
                 Removing it will be fine. 

Espero que ayude.

Cuestiones relacionadas