2012-03-16 22 views
-2

アプリケーション設定の保存に使用するこのOracleテーブルがあります。SQL - 2つの行テーブルを1つのSQL文で更新する方法

enter image description here

これは、テーブルを作成するために使用されますことを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") 
/

は、これは私が使用するSQL文です:

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

しかし、ときに私SQL Developerで実行してください。このエラーメッセージが表示されます。

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: 

どうすれば問題を解決できますか?

あなたは、彼らが今、大文字と小文字が区別され、二重引用符を使用して、テーブルの列を作成したとしてベスト ピーター

+4

エラーメッセージを理解できないため、あなたの質問は完全に間違っています。プログラムまたは構文の質問としてフレームに入れますが、メッセージにはINVALID IDENTIFIERが明示されています。これは、二重引用符で囲まれた大文字と小文字の区別なく使用されるためです。詳細については、この質問をご覧ください:http://stackoverflow.com/questions/6027961/ora-00904-invalid-identifier/6030439#6030439 – APC

答えて

8

を願っています。

したがって、常に引用符を使用する必要があります。

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

SQL識別子については、マニュアルをよくお読みください。

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

特に段落:

Oracleは、データベース・オブジェクト名に引用識別子を使用することはお勧めしません。

+0

ありがとうございました!もう一つは "ELSE"が必要ですSettingValue ""私はこれを必要としないと思います。 –

+0

私はついにそれを動作させました:http://pastebin.com/eFTgBfK4本当に必要ですか? "SettingValue" IN( 'SessionTTL'、 'MaxUsersActive'); –

+2

申し訳ありませんが、間違ったwhere節を使用しました。私の編集を参照してください(正直なところ、WHERE句のコピー&ペーストエラーに気づいたはずのステートメントを理解しようとしていれば正直です)。もちろん、WHERE句を使用することを強くお勧めします。 –

関連する問題