Skip to main content

This is documentation for Caché & Ensemble. See the InterSystems IRIS version of this content.Opens in a new tab

For information on migrating to InterSystems IRISOpens in a new tab, see Why Migrate to InterSystems IRIS?

VALUES

フィールド内で使用するデータ値を指定する INSERT/UPDATE 節です。

Synopsis

(field1{,fieldn})
     VALUES (value1{,valuen})

引数

field フィールド名、またはコンマで区切られたフィールド名のリスト。
value 値、あるいはコンマで区切られた値のリスト。各値は対応するフィールドに割り当てられています。

概要

VALUES 節は INSERT 文や UPDATE 文で使用され、フィールドに挿入するデータ値を指定します。通常は、以下のとおりです。

  • INSERT クエリは、以下の構文を使用します。

    INSERT INTO tablename (fieldname,fieldname,...)
         VALUES (value,...)
    
  • UPDATE クエリは、以下の構文を使用します。

    UPDATE tablename (fieldname,fieldname,...)
         VALUES (value,...)
    

VALUES 節の要素は、テーブル名の後で指定されているフィールドに連続して対応します。VALUES 節で 1 つの値だけが指定されている場合は、要素を括弧で囲む必要はありません。

以下の埋め込み SQL の例は、単独の行を "Employee" テーブルに追加する INSERT 文を示しています。

   &sql(INSERT INTO Employee (Name,SocSec,Telephone)
        VALUES("Boswell",333448888,"546-7989"))
   &sql(INSERT INTO Employee (Name,SocSec,Telephone)
        VALUES ('Boswell',333448888,'546-7989'))

INSERT クエリと UPDATE クエリは、テーブル名の後にフィールド名のリストを明示的に指定せずに、VALUES 節を使用できます。テーブル名の後でフィールド名のリストを省略するには、クエリが次の 2 つの基準を満たしている必要があります。

  • VALUES 節で指定されている値の数は、テーブル内のフィールドの数と同じです (ID フィールドは除く)。

  • VALUES 節の値は、列 2 から始まるフィールドの内部列番号の順序でリストされます。列 1 は常にシステムによって作成された ID フィールド用として使用されるので、VALUES 節では指定されません。

例えば、以下にクエリがあります。

INSERT INTO Sample.Person VALUES (5,'John')

以下に別のクエリがあります。

INSERT INTO Sample.Person (Age,Name) VALUES (5,'John')

テーブル "Sample.Person" が 2 つのユーザ定義のフィールドを持っている場合、上と下のクエリは等しくなります。

この例では、値 5 が下位番号の列フィールドに割り当てられており、値 "John" がもう 1 つのフィールドに割り当てられています。

VALUES 節は、以下の埋め込み SQL の例のように配列の要素を指定できます。

   &sql( UPDATE Person(Tel)
        VALUES :per('tel',)
        WHERE ID = :id )

また、UPDATE クエリは、指定されていない最後の部分文字列を持つ配列を参照できます。したがって、INSERT は配列要素の有無を使用して、値と既定値を新規に作成された行に割り当てます。UPDATE は配列要素の存在を使用して、対応するフィールドが更新されることを示します。例えば、以下のような 6 列のテーブルに対する配列があるとします。

emp("profile",2)="Smith"
emp("profile",3)=2
emp("profile",3,1)="1441 Main St."
emp("profile",3,2)="Cableton, IL 60433"
emp("profile",5)=NULL
emp("profile",7)=25
emp("profile","next")="F"

列 1 は常に ID フィールド用のもので、ユーザ定義ではありません。挿入された "Employee" 行は列 2 の "Name" を "Smith" に設定し、列 3 の "Address" が 2 行の値を持つように設定し、列 4 の "Department" はここでは指定されていないので既定値に設定し、そして列 5 の "Location" は NULL に設定します。"Location" の既定値は、対応する配列要素が NULL 値で定義されているので、使用されません。配列要素 "7" と "next" は、"Employee" テーブルの列番号に対応しないので、クエリによって無視されます。ここでは、この配列を使用する UPDATE 文を示しています。

  &sql(UPDATE Employee
       VALUES :emp('profile',)
       WHERE Employee = 379)

上記の定義と配列値により、この文は RowID = 379 である "Employee" 行の "Name" フィールド、"Address" フィールド、"Location" フィールドを更新します。

ただし、添え字を完全に省略すると SQLCODE -54 エラーが発生します。VALUES の後に (最後の添え字が省略された) 配列識別子が必要です。

例えば以下のように、複数の行を対象にした UPDATE クエリを持つ配列参照を使用することもできます。

  &sql(UPDATE Employee
       VALUES :emp('profile',)
       WHERE Type = 'PART-TIME')

VALUES 節変数は、ドット構文を使用できません。したがって、以下の埋め込み SQL の例では正常に動作します。

   SET sname = state.Name
   &sql(INSERT INTO StateTbl VALUES :sname)

以下は不適切です。

     &sql(INSERT INTO State VALUES :state.Name)

NULL と空白文字列値は異なります。詳細は "NULL" を参照してください。後方互換性では、古い既存データ内にあるすべての空白文字列 ('') 値は NULL 値と見なされます。新規データでは、空白文字列は $CHAR(0) としてデータ内に保存されます。SQL では、NULL は 'NULL' と記述されます。以下はその例です。

INSERT INTO Sample.Person
(SSN,Name,Home_City) VALUES ('123-45-6789','Doe,John',NULL)

SQL では、空白文字列は '' (2 つの一重引用符) と記述されます。以下はその例です。

INSERT INTO Sample.Person
(SSN,Name,Home_City) VALUES ('123-45-6789','Doe,John','')

ID フィールドに NULL 値は挿入できません。

以下の埋め込み SQL の例は、"Doe,John" のレコードを Sample.Person テーブルに挿入します。次に、このレコードを選択して、このレコードを削除します。2 番目の SELECT で削除を確認します。

   SET x="Doe,John",y="123-45-6789",z="Metropolis"
   SET (a,b,c,d,e)=0
   NEW SQLCODE,%ROWCOUNT,%ROWID
   &sql(INSERT INTO Sample.Person
   (Name,SSN,Home_City) VALUES (:x,:y,:z))
   IF SQLCODE'=0 {
     WRITE !,"INSERT Error code ",SQLCODE
     QUIT }
   &sql(SELECT Name,SSN,Home_City
        INTO :a,:b,:c
        FROM Sample.Person
        WHERE Name =:x)
   IF SQLCODE'=0 {
     WRITE !,"Error code ",SQLCODE }
   ELSE {
      WRITE !,"After INSERT:"
      WRITE !,"Name=",a," SSN=",b," City=",c
      WRITE !,"SQL code=",SQLCODE," Number of rows=",%ROWCOUNT }
    &sql(DELETE FROM Sample.Person
        WHERE Name=:x)
    &sql(SELECT Name,SSN
        INTO :d,:e
        FROM Sample.Person
        WHERE Name='Doe,John')
   IF SQLCODE <0 {
     WRITE !,"Error code ",SQLCODE }
   ELSE {
     WRITE !,"After DELETE:"
     WRITE !,"Name=",d," SSN=",e
     WRITE !,"SQL code=",SQLCODE," Number of rows=",%ROWCOUNT }

関連項目

FeedbackOpens in a new tab