ここではORACLE社が提供するPL/SQL言語でUPDATE文の書き方について紹介しています。
PL/SQLの基本的な処理については↓で詳しく解説していますので参考にしてください。
>>PL/SQLの書き方
UPDATE文の基本構文
UPDATE文の基本的な構文・文法は次の通りです。
より詳しい解説は↓で紹介していますので参考にしてください。
>>【SQL】UPDATE文の書き方:サンプル多数あり
UPDATE テーブル名 SET 列名 = 値[,列名 = 値] [WHERE 条件];
UPDATE文のサンプル
PL/SQLでのUPDATE文の実行
PL/SQLでUPDATE文を実行するときは、処理部(BEGIN~END)に実行したいUPDATE文をそのまま記述します。
文末には、;(セミコロン)を記述します。
次の例では、処理部にUPDATE文を1件実行しています。UPDATE文を実行した後、コミットで確定しています。
SQL> CREATE OR REPLACE PROCEDURE PRO1
2 IS
3 BEGIN
4 UPDATE tab1 SET emp_name = 'test' WHERE emp_id = '00001';
5 COMMIT;
6 END;
7 /
プロシージャが作成されました。
実際にプロシージャをEXECUTE文で実行します。
実行結果として1件のレコードが更新されていることを確認できました。
SQL> select * from tab1;
EMP_ID EMP_NAME DEPT AGE
---------- -------------------- ---------- ----------
00001 Suzuki D0001 28
00002 Tanaka D0002 25
00003 Kizaki D0002 99
SQL> EXECUTE PRO1
PL/SQLプロシージャが正常に完了しました。
SQL> select * from tab1;
EMP_ID EMP_NAME DEPT AGE
---------- -------------------- ---------- ----------
00001 test D0001 28
00002 Tanaka D0002 25
00003 Kizaki D0002 99
UPDATE件数の取得
PL/SQLで実行した直前のUPDATE文の処理結果件数は、ROWCOUNTという属性に格納されています。
このROWCOUNTは「SQL%ROWCOUNT」で取得出来ます。
次の例では、UPDATE文で実行した件数をDBMS_OUTPUTパッケージで出力しています。
SQL> CREATE OR REPLACE PROCEDURE PRO1
2 IS
3 BEGIN
4 UPDATE tab1 SET age = 99;
5 DBMS_OUTPUT.PUT_LINE(SQL%ROWCOUNT);
6 COMMIT;
7 END;
8 /
プロシージャが作成されました。
SQL> set serveroutput on
SQL> EXECUTE PRO1
3
PL/SQLプロシージャが正常に完了しました。
SELECTした結果でUPDATEする方法
ORACLEデータベースでは、UPDATE句でINNER JOINが使えないため、SET句で副問合せを使ってSELECTした結果で更新します。
次の例ではtab1テーブルをtab2テーブルのSELECT結果を使って更新しています。
SQL> CREATE OR REPLACE PROCEDURE PRO1
2 IS
3 BEGIN
4 UPDATE tab1 a
5 SET a.EMP_NAME = (SELECT b.DEPT_NAME FROM tab2 b WHERE a.DEPT = b.DEPT);
6 COMMIT;
7 END;
8 /
プロシージャが作成されました。
SQL> EXECUTE PRO1
PL/SQLプロシージャが正常に完了しました。
SQL> select * from tab1;
EMP_ID EMP_NAME DEPT AGE
---------- -------------------- ---------- ----------
00001 HR D0001 28
00002 SALES D0002 25
00003 SALES D0002 35
00004 DEV D0003 45
00005 DEV D0003 55
00006 DEV D0003 35
6行が選択されました。
INNER JOINを使った更新
PL/SQL(ORACLEデータベース)では、INNER JOINを使ってSELECTした結果を取得することが出来ません。
次のようなSQLは構文エラーとなり実行することが出来ません。
UPDATE tab1 a INNER JOIN tab2 b ON a.DEPT = b.DEPT
SET a.EMP_NAME = b.DEPT_NAME;
複数テーブルを使ってUPDATEする方法
PL/SQLで複数テーブルを使ってUPDATEするには、WHERE句に条件を追加します。
次の例では、WHERE句に副問合せで別の表の結果を取得し、一致するレコードだけを更新しています。
SQL> select * from tab1;
EMP_ID EMP_NAME DEPT AGE
---------- -------------------- ---------- ----------
00001 Suzuki D0001 28
00002 Tanaka D0002 25
00003 Kizaki D0002 35
00004 Tanaka D0003 45
00005 Kizaki D0003 55
00006 Nakata D0003 35
6行が選択されました。
SQL> CREATE OR REPLACE PROCEDURE PRO1
2 IS
3 BEGIN
4 UPDATE tab1 a SET a.EMP_NAME = 'test'
5 WHERE a.DEPT IN (SELECT b.DEPT FROM tab2 b WHERE b.DEPT_NAME = 'SALES');
6 COMMIT;
7 END;
8 /
プロシージャが作成されました。
SQL> EXECUTE PRO1
PL/SQLプロシージャが正常に完了しました。
SQL> select * from tab1;
EMP_ID EMP_NAME DEPT AGE
---------- -------------------- ---------- ----------
00001 Suzuki D0001 28
00002 test D0002 25
00003 test D0002 35
00004 Tanaka D0003 45
00005 Kizaki D0003 55
00006 Nakata D0003 35
6行が選択されました。
UPDATE文でCASE式を使う方法
PL/SQLのUPDATE文でも、CASE式を使った条件分岐を実装することが出来ます。
CASE式の書き方については↓で詳しく解説していますので参考にしてください。
>>【SQL】CASE式の書き方:サンプル多数あり
次の例では、AGE列が30以上の値の場合に99に更新しています。30未満の場合はそのままの値で更新しています。
SQL> select * from tab1;
EMP_ID EMP_NAME DEPT AGE
---------- -------------------- ---------- ----------
00001 Suzuki D0001 28
00002 Tanaka D0002 25
00003 Kizaki D0002 35
00004 Tanaka D0003 45
00005 Kizaki D0003 55
00006 Nakata D0003 35
6行が選択されました。
SQL> CREATE OR REPLACE PROCEDURE PRO1
2 IS
3 BEGIN
4 UPDATE
5 tab1 a
6 SET
7 a.AGE = CASE WHEN a.AGE >= 30 THEN 99 ELSE a.AGE END;
8 COMMIT;
9 END;
10 /
プロシージャが作成されました。
SQL> EXECUTE PRO1
PL/SQLプロシージャが正常に完了しました。
SQL> select * from tab1;
EMP_ID EMP_NAME DEPT AGE
---------- -------------------- ---------- ----------
00001 Suzuki D0001 28
00002 Tanaka D0002 25
00003 Kizaki D0002 99
00004 Tanaka D0003 99
00005 Kizaki D0003 99
00006 Nakata D0003 99
6行が選択されました。
UPDATEとINSERTの同時実行
UPDATE文では、既に存在するレコードは更新、存在しないレコードはINSERTするといったことは出来ません。
INSERT文とUPDATE文の同時実行をするには、MERGE文で行います。