【问题标题】:SQL Error: ORA-00933: SQL command not properly endedSQL 错误:ORA-00933:SQL 命令未正确结束
【发布时间】:2012-02-14 23:06:50
【问题描述】:

我正在尝试使用联接更新 oracle 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

但仍然有同样的错误 谁能告诉我错误原因和解决方法

【问题讨论】:

  • 我认为您的 sqlDevelepor 执行了上一行。在你的 sql 语句前后加一个分号,然后再试一次
  • 我尝试了您的解决方案,但对我不起作用

标签: sql oracle


【解决方案1】:

不完全是这个问题的实际上下文的情况,但这个异常可以通过下一个查询重现:

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

单词can'tdon't 中的单引号破坏了字符串。 如果字符串只有一个内引号,例如'he don't want' oracle 会抛出更多相关的quoted string not proper terminate错误,但如果有两个SQL command not properly end会被抛出。

总结:检查您的查询是否有双单引号。

【讨论】:

    【解决方案2】:

    命令末尾的分号; 对我造成了同样的错误。

    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.
    

    希望对你有帮助。

    【讨论】:

    • 哎哟!我有这个问题,但没有意识到,因为包括“;”在 SqlPlus 命令行上工作得很好。
    • 我也有同样的问题。很难找到确切的问题,谢谢它对我有很大帮助
    • 非常有帮助,这是错误“;”,谢谢
    • 花了 3 小时才看到这个答案。
    【解决方案3】:

    您的查询应如下所示

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

    您可以查看以下问题以获取帮助

    【讨论】:

    • Oracle 支持 ANSI 连接
    • @Sathya:但不在 UPDATE 语句中。
    • @a_horse_with_no_name 啊。谢谢。
    • 你可以查看链接(使用连接的SQL更新查询?),它有你的答案
    【解决方案4】:

    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

    【讨论】:

    • 自从它在评论(2016 年 11 月)中被排成一行后第一次看到这个。这不是真的:Oracle 确实允许在 UPDATE 中进行连接,但是有一些限制(很明显,是逻辑要求的,而不是 Oracle 要求的)。 Oracle 不允许更新联接的这种非常普遍的误解从何而来?例如这里讨论了连接更新的工作原理:stackoverflow.com/questions/37001180/…
    • @mathguy:Oracle 允许更新派生表(子查询),在某些限制下可以使用连接(主要是:查询需要是“键保留表”)。但这与简单地将目标表连接到另一个表不同(在那些支持此功能的 DBMS 中通常限制较少)
    • 完全正确 - 这与“Oracle 不允许在 UPDATE 语句中连接表”不同。我知道,显然你也知道;现在搜索 SO 并查看人们做出该语句的次数,即使在(许多)情况下,通过连接进行更新也可以正常工作,只要人们使用正确的语法并且他们在源表中具有正确的唯一约束。我刚刚创建了一篇文档文章来讨论这个问题,我们将看看它是否被批准。
    • 提到的链接说“找不到页面”
    【解决方案5】:

    在 oracle 和 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'

    【讨论】:

    • users 不是保留字! user 然而是一个保留字。但真正的问题是,Oracle 不允许在 UPDATE 语句中使用 FROM 或 JOIN。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-10-07
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-10-15
    相关资源
    最近更新 更多