SQL - 如何使用一个SQL语句更新两个行表

Pet*_*zov -2 sql oracle oracle10g oracle11g

我有这个Oracle表,用于存储应用程序设置.

在此输入图像描述

这是用于创建表的SQL脚本:

CREATE TABLE "GLOBALSETTINGS"(
  "SettingName" Varchar2(40 ) NOT NULL,
  "SettingValue" Varchar2(40 )
)
/

-- Add keys for table GLOBALSETTINGS

ALTER TABLE "GLOBALSETTINGS" ADD CONSTRAINT "Key14" PRIMARY KEY ("SettingName")
/

ALTER TABLE "GLOBALSETTINGS" ADD CONSTRAINT "SettingName" UNIQUE ("SettingName")
/
Run Code Online (Sandbox Code Playgroud)

这是我想要使用的SQL语句:

UPDATE GLOBALSETTINGS
SET settingValue =
  CASE
    WHEN settingName = 'SessionTTL'
    THEN '30'
    WHEN settingName = 'MaxUsersActive'
    THEN '40'
    ELSE settingValue
  END
WHERE settingName IN ('SessionTTL', 'MaxUsersActive');
Run Code Online (Sandbox Code Playgroud)

但是当我在SQL开发人员中运行它时,我收到以下错误消息:

Error starting at line 1 in command:
UPDATE GLOBALSETTINGS 
   SET settingValue = case 
                        when settingName = 'SessionTTL'  then '30' 
                        when settingName = 'MaxUsersActive'  then '40' 
                        else settingValue
                      end
WHERE settingName in ('SessionTTL', 'MaxUsersActive')
Error at Command Line:7 Column:6
Error report:
SQL Error: ORA-00904: "SETTINGNAME": invalid identifier
00904. 00000 -  "%s: invalid identifier"
*Cause:    
*Action:
Run Code Online (Sandbox Code Playgroud)

我该如何解决这个问题?

祝彼得

a_h*_*ame 8

当您使用双引号创建表列时,它们现在区分大小写.

所以你必须一直使用引号.

UPDATE GLOBALSETTINGS
SET "SettingValue"  =
  CASE
    WHEN "SettingName" = 'SessionTTL' THEN '30'
    WHEN "SettingName" = 'MaxUsersActive' THEN '40'
    ELSE "SettingValue" 
  END
WHERE "SettingName"  IN ('SessionTTL', 'MaxUsersActive');
Run Code Online (Sandbox Code Playgroud)

请重新阅读有关SQL标识符的手册.

http://docs.oracle.com/cd/E11882_01/server.112/e26088/sql_elements008.htm#i27570

特别是段落:

Oracle建议不要对数据库对象名称使用带引号的标识符.

  • 对不起,我使用了错误的where子句.请参阅我的编辑(但老实说,如果您已经尝试理解该语句,您应该注意到WHERE子句的复制和粘贴错误).是的,我强烈建议您使用WHERE子句. (2认同)