« PL/SQLでCASE式を使わずに条件分岐 #2 | トップページ | WIF2010 ファイナリスト 35チーム決定 »

2010年3月24日 (水) / Author : Hiroshi Sekiguchi.

PL/SQLでCASE式を使わずに条件分岐 #3

PL/SQLでCASE式を使わずに条件分岐の3回目です。

前回作成したプロシージャをパッケージ化し、コマンドを外部から与えられるようにしてみます。

前回作成したsimpleCommandプロシージャを削除してパッケージ化します。store()プロシージャでコマンドを登録、execute()プロシージャで実行です。

SCOTT> drop procedure simpleCommand;

プロシージャが削除されました。

SCOTT>
SCOTT> l
1 CREATE OR REPLACE PACKAGE simpleCommand
2 AS
3 PROCEDURE store(
4 commandName IN VARCHAR2
5 ,commandSource IN command
6 );
7 --
8 PROCEDURE execute(
9 commandName IN VARCHAR2
10 );
11* END;
SCOTT> /

パッケージが作成されました。

SCOTT>
SCOTT> l
1 CREATE OR REPLACE PACKAGE BODY simpleCommand
2 AS
3 TYPE command_type IS TABLE OF command INDEX BY VARCHAR2(4000);
4 commands command_type;
5 --
6 PROCEDURE store(
7 commandName IN VARCHAR2
8 ,commandSource IN command
9 )
10 IS
11 BEGIN
12 commands(commandName) := commandSource;
13 END;
14 --
15 PROCEDURE execute(
16 commandName IN VARCHAR2
17 )
18 IS
19 BEGIN
20 commands(commandName).execute();
21 EXCEPTION
22 WHEN NO_DATA_FOUND THEN
23 DBMS_OUTPUT.PUT_LINE('そんなコマンド知りません! >< ');
24 END;
25* END;
SCOTT> /

パッケージ本体が作成されました。

SCOTT>

では早速試してみます。まず、コマンドを登録!

SCOTT> l
1 BEGIN
2 simpleCommand.store(
3 'いま何時?',
4 Command(
5 'BEGIN '||
6 'DBMS_OUTPUT.PUT_LINE(''現在時刻:''||TO_CHAR(systimestamp, ''yyyy-mm-dd hh24:mi:ss''));'||
7 'END;'
8 )
9 );
10 simpleCommand.store(
11 '従業員数は?',
12 Command(
13 'DECLARE '||
14 'numberOfEmployees NUMBER;'||
15 'BEGIN '||
16 'SELECT COUNT(*) INTO numberOFEmployees FROM emp;'||
17 'DBMS_OUTPUT.PUT_LINE(''従業員数:''||TO_CHAR(numberOfEmployees));'||
18 'END;'
19 )
20 );
21 simpleCommand.store(
22 '従業員リスト',
23 Command(
24 'DECLARE '||
25 'CURSOR empList IS '||
26 'SELECT '||
27 'empno '||
28 ',ename '||
29 ',dname '||
30 'FROM '||
31 'emp JOIN dept '||
32 'ON emp.deptno = dept.deptno '||
33 'ORDER BY '||
34 'dname, empno, ename;'||
35 'BEGIN '||
36 'FOR empRec IN empList LOOP '||
37 'DBMS_OUTPUT.PUT_LINE(empRec.empno || '' '' || empRec.ename || '' '' || empRec.dname);'||
38 'END LOOP; '||
39 'END;'
40 )
41 );
42* END;
SCOTT> /

PL/SQLプロシージャが正常に完了しました。

SCOTT>


実行!.これで適用範囲を広げらるかも・・・w

SCOTT> set serveroutput on size 100000
SCOTT>
SCOTT> exec simpleCommand.execute('従業員リスト');
7782 CLARK ACCOUNTING
7839 KING ACCOUNTING
7934 MILLER ACCOUNTING
7369 SMITH RESEARCH
7566 JONES RESEARCH
7788 SCOTT RESEARCH
7876 ADAMS RESEARCH
7902 FORD RESEARCH
7499 ALLEN SALES
7521 WARD SALES
7654 MARTIN SALES
7698 BLAKE SALES
7844 TURNER SALES
7900 JAMES SALES

PL/SQLプロシージャが正常に完了しました。

SCOTT> exec simpleCommand.execute('いま何時?');
現在時刻:2010-03-20 23:53:22

PL/SQLプロシージャが正常に完了しました。

SCOTT> exec simpleCommand.execute('従業員数は?');
従業員数:14

PL/SQLプロシージャが正常に完了しました。

SCOTT> exec simpleCommand.execute('ほげほげ');
そんなコマンド知りません! ><

PL/SQLプロシージャが正常に完了しました。

SCOTT>




・バックナンバー
PL/SQLでCASE式を使わずに条件分岐 #1
PL/SQLでCASE式を使わずに条件分岐 #2

| |

トラックバック


この記事へのトラックバック一覧です: PL/SQLでCASE式を使わずに条件分岐 #3:

コメント

コメントを書く