2012-01-20 154 views
13

我想通过使用连接来更新oracle SQL开发人员中的记录。 以下是我的querySQL错误:ORA-00933:SQL命令未正确结束

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' 

然而,当我试图执行它,我得到了下面的错误 -

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

我试着删除JOINS

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 

,但仍然有同样的错误 有人可以告诉我错误的原因和解决办法

+0

我想你的sqlDevelepor执行了上一行。在你的sql语句之前和之后放一个分号,然后再试一次 –

+0

我试过你的解决方案,但是不适合我 –

回答

12

Oracle不允许在UPDATE语句中连接表。你需要有共同相关的子选择

像这样的东西来重写你的说法:

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

有关UPDATE语句的(有效)语法的完整说明,请仔细阅读本手册:

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

+0

自评论(2016年11月)以来第一次看到这一点。这不是事实:Oracle确实允许在UPDATE中加入,但有一些限制(明显的限制,逻辑要求,而不是Oracle要求)。 Oracle不允许更新连接的这种非常普遍的误解来自哪里?在这里讨论如何使用连接更新工作:http://stackoverflow.com/questions/37001180/update-with-join-syntax-for-oracle-database – mathguy

+0

@mathguy:Oracle允许更新派生表(sub -query),它可以在某些限制下使用连接(主要是:查询需要是“保存键的表”)。但是,这是不同的,那么简单地将目标表连接到另一个表(在那些支持该表的DBMS中通常具有较少的限制)。 –

+0

完全正确 - 这与“Oracle不允许在UPDATE语句中连接表”不同。我知道这一点,显然你也知道这一点。现在通过SO进行搜索并查看人们做出该声明的次数,即使在通过连接进行更新的情况下(很多情况下),如果只有人们使用正确的语法,并且他们在源表中具有适当的唯一约束,那么也可以很好地工作。我刚刚创建了一篇文档来讨论这个问题,我们会看看它是否被批准。 – mathguy

1

您的查询应该像

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

您可以检查帮助

+0

ANSI连接受Oracle – Sathya

+0

支持@Sathya:但不在UPDATE语句中。 –

+0

@a_horse_with_no_name啊。谢谢。 – Sathya

-6

其在Oracle和SQL非常真实的是“用户”是一个保留字只是改变它, 它将为U中最好的,如果ü喜欢它改成这样

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

'用户'是**不**保留字!然而'user'是一个保留字。但真正的问题是,Oracle不允许在UPDATE语句中使用FROM或JOIN。 –

2

不完全是这个问题的实际情境的情况,但这种异常可以通过下面的查询中被复制:

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

用单引号can'tdon't打破了字符串。 如果字符串只有一个内部引号,例如'他不想'甲骨文抛出更多相关引用的字符串没有正确终止错误,但在两个情况下SQL命令未正确结束被抛出。

摘要:检查双引号的查询。

10

分号;在命令结束时对我造成了同样的错误。

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. 

希望它有帮助。

相关问题