目次
環境
実行は、SQL PlusとSQL Developerで確認しています。
文字列のhello worldを出力する
文字列のhello worldを出力するプロシージャです。
CREATE OR REPLACE PROCEDURE TEST1
IS
/*
comment
*/
STR1 VARCHAR2(15) := 'hello world';
BEGIN
DBMS_OUTPUT.PUT_LINE(STR1); --hello worldと出力される
END;
1行目は、TEST1というプロシージャを作成しています。
CREATE OR REPLACEなので既にある場合は上書きされます。
2行目は、ISまたはASを入力します。意味はどちらも同じです。
3から5行目は、複数行のコメントです。/*で始まり*/で終了します。
6行目は、変数に文字列をセットしています。VARCHAR2は型で(15)は桁数です。
8行目は、コンソールに文字列を出力します。--は単一行のコメントです。
SQL Plusで実行する場合、最終行にスラッシュ(/)を入力します。
プロシージャを実行する
上記で作成したプロシージャをSQL Plusで実行します。
SQL> set serveroutput on
SQL> execute test1()
hello world
PL/SQLプロシージャが正常に完了しました。
1行目のset serveroutput onは、serverのoutputをonにして文字列を出力します。
2行目は、executeでプロシージャを実行します。
3行目は、プロシージャから文字列が出力されています。
INとOUTを使用する
create or replace procedure TEST1
(
STR1 IN varchar2,
STR2 OUT varchar2
)
IS
BEGIN
STR2 := STR1 || ' and blue';
END;
3行目のINは入力で4行目のOUTは出力です。
プロシージャを実行する
上記で作成したプロシージャをSQL Plusで実行します。
SQL> set serveroutput on
SQL> variable out1 varchar2(20)
SQL> execute test1('red',:out1)
PL/SQLプロシージャが正常に完了しました。
SQL> print out1
OUT1
--------------------------------------------------------------------------------
red and blue
2行目は、出力の変数を定義しています。バインド変数です。
SQL*Plusからアクセスできるようになります。
https://docs.oracle.com/cd/E57425_01/121/SQPUG/GUID-B52D6F2E-A28A-48B6-B73F-6A9D018BD107.htm
3行目の1番目の引数は入力で、2番目の引数は出力です。
7行目は、print+変数で取得した値を表示しています。
select intoで項目を取得する
select テーブルの項目 into 変数 from テーブル名 |
select文を実行するプロシージャのサンプルです。
入力として数値を渡してSQLを実行します。
create or replace procedure TEST1(
id1 IN number
)
IS
wk_name employee.name%TYPE;
BEGIN
select name into wk_name from employee
where ID = id1;
dbms_output.put_line('my name is ' || wk_name || '.');
END;
2行目は、INの項目です。外部から値を受け取ります。
5行目は、変数です。%TYPEはDBの項目の型になります。
→「employeeテーブルのnameという項目と同じ型です」という宣言です。
8行目はselect intoで取得したnameを右の変数のwk_nameにセットしています。
※PKの項目を指定するので1件のみ取得します。
9行目は、外部から受け取ったIDで条件を指定します。
select intoで複数項目を取得する
BEGIN
select name,romaji into wk_name,wk_romaji from employee
where ID = id1;
selectで取得する項目を複数にし、intoの後の変数も複数にすれば取得できます。
select文でカーソル(cursor)とfetchを使用
select文でカーソル(cursor)とfetchを使用するサンプルです。
create or replace procedure TEST1
(
id1 IN number,
name1 OUT varchar2,
romaji1 OUT varchar2
)
IS
CURSOR cur1 IS
SELECT name,romaji FROM employee
WHERE id = id1;
employee_rec cur1%ROWTYPE;
BEGIN
OPEN cur1;
FETCH cur1 INTO employee_rec;
CLOSE cur1;
name1 := employee_rec.name;
romaji1 := employee_rec.romaji;
END;
3行目は、INで入力の項目です。
4,5行目は、OUTで出力の項目です。
10行目は、INの項目のidを条件にしています。
19,20行目は、取得したレコードからOUTの項目に値をセットしています。
結果確認用のコマンド
set serveroutput on
variable out1 varchar2(20)
variable out2 varchar2(20)
execute test1(1,:out1,:out2)
print out1
print out2
returnで処理を終了する
returnは、処理を終了します。
CREATE OR REPLACE PROCEDURE TEST1
IS
num1 NUMBER := 1;
BEGIN
IF (num1 = 1) THEN
dbms_output.put_line('process1'); --出力される
RETURN;
END IF;
dbms_output.put_line('process2');
END;
8行目は、returnです。ここでこのプロシージャの処理が終了します。
実行した場合、7行目の「process1」が出力されます。
10行目の「process2」は出力されません。
NULLで処理を何もしない
NULLは、処理を何もしない時に使用します。
CREATE OR REPLACE PROCEDURE TEST1
IS
num1 NUMBER := 1;
BEGIN
IF (num1 = 1) THEN
NULL;
END IF;
dbms_output.put_line('process2'); --出力される
END;
7行目のNULLは、何もしない場合に記述します。
何も記述しない場合(NULLがない場合)は、エラーになります。
入力項目にデフォルト値をセットする(default)
create or replace procedure TEST1(
id IN number default 2,
name IN varchar2 default 'tanaka'
)IS
BEGIN
dbms_output.put_line('id = ' || id);
dbms_output.put_line('name = '|| name);
END;
デフォルト値は、defaultの後に値を指定します。
値がない場合はデフォルト値になります。以下は実行結果です。
SQL> execute test1();
id = 2
name = tanaka
SQL> execute test1(10);
id = 10
name = tanaka
SQL> execute test1(name=>'suzuki');
id = 2
name= suzuki
作成時にコンパイルエラーが発生したとき
プロシージャ作成時にコンパイルエラーが発生したときは、show errorと入力するとエラー内容が表示されます。
SQL> CREATE OR REPLACE PROCEDURE TEST1
2 IS
3 /*
4 comment
5 */
6 BEGIN
7 DBMS_OUTPUT.PUT_LINE(STR1); --hello worldと出力される
8 END;
9 /
警告: プロシージャが作成されましたが、コンパイル・エラーがあります。
SQL> show error
PROCEDURE TEST1のエラーです。
LINE/COL ERROR
-------- -----------------------------------------------------------------
7/3 PL/SQL: Statement ignored
7/24 PLS-00201: 識別子STR1を宣言してください。
SQL>
プロシージャの存在確認を行う
現ユーザがアクセスできるプロシージャを確認できます
SELECT * FROM ALL_PROCEDURES
where OBJECT_TYPE = 'PROCEDURE' and OWNER = 'SYSTEM'
上記は、systemスキーマのプロシージャを確認しています。
現ユーザが所有するプロシージャを確認できます
SELECT * FROM USER_PROCEDURES
プロシージャを削除する
プロシージャの削除は、以下のように「DROP PROCEDURE プロシージャ名」と入力します。
DROP PROCEDURE test1;
プロシージャが削除されました。
関連の記事
Oracle PL/SQLのストアドファンクションのサンプル
Oracle PL/SQLのcommitとrollbackと例外処理