UPDATE tablename (fieldname1,fieldname2,...)
VALUES (value1,value2,...)
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 つの基準を満たしている必要があります。
例えば、以下にクエリがあります。
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 }
関連項目