« PL/SQLでCASE式を使わずに条件分岐 #1 | トップページ | PL/SQLでCASE式を使わずに条件分岐 #3 »

2010年3月23日 (火) / Author : Hiroshi Sekiguchi.

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

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

前回作成したプロシージャから、とにかくCASE式を無くてみましょ。

まず、以下の様なオブジェクト型を定義して・・・・・

SCOTT> l
1 CREATE OR REPLACE TYPE command AS OBJECT
2 (
3 commandStr CLOB,
4 MEMBER PROCEDURE execute
5* );
SCOTT> /

型が作成されました。

SCOTT>
SCOTT> l
1 CREATE OR REPLACE TYPE BODY command
2 AS
3 MEMBER PROCEDURE execute
4 IS
5 BEGIN
6 EXECUTE IMMEDIATE commandStr;
7 END;
8* END;
SCOTT> /

型本体が作成されました。

SCOTT>

PL/SQLの結合配列のINDEXにVARCHAR2型を利用すればハッシュテーブルと同じように使えることを利用して実行するコマンドはCLOBに格納してEXECUTE IMMEDIATE文で実行しちゃうという方法です。実行するコマンドは外部から与えるようにすることもできますが、とりあえず内部に直書き。

SCOTT> l
1 CREATE OR REPLACE PROCEDURE simpleCommand
2 (
3 commandName IN VARCHAR2
4 )
5 IS
6 TYPE command_type IS TABLE OF command INDEX BY VARCHAR2(4000);
7 commands command_type;
8 --
9 PROCEDURE init IS
10 BEGIN
11 commands('いま何時?')
12 := Command(
13 'BEGIN '||
14 'DBMS_OUTPUT.PUT_LINE(''現在時刻:''||TO_CHAR(systimestamp, ''yyyy-mm-dd hh24:mi:ss''));'||
15 'END;'
16 );
17 commands('従業員数は?')
18 := Command(
19 'DECLARE '||
20 'numberOfEmployees NUMBER;'||
21 'BEGIN '||
22 'SELECT COUNT(*) INTO numberOFEmployees FROM emp;'||
23 'DBMS_OUTPUT.PUT_LINE(''従業員数:''||TO_CHAR(numberOfEmployees));'||
24 'END;'
25 );
26 commands('従業員リスト')
27 := Command(
28 'DECLARE '||
29 'CURSOR empList IS '||
30 'SELECT '||
31 'empno '||
32 ',ename '||
33 ',dname '||
34 'FROM '||
35 'emp JOIN dept '||
36 'ON emp.deptno = dept.deptno '||
37 'ORDER BY '||
38 'dname, empno, ename;'||
39 'BEGIN '||
40 'FOR empRec IN empList LOOP '||
41 'DBMS_OUTPUT.PUT_LINE(empRec.empno || '' '' || empRec.ename || '' '' || empRec.dname);'||
42 'END LOOP; '||
43 'END;'
44 );
45 END;
46 --
47 BEGIN
48 init();
49 --
50 commands(commandName).execute();
51 EXCEPTION
52 WHEN NO_DATA_FOUND THEN
53 DBMS_OUTPUT.PUT_LINE('そんなコマンド知りません! >< ');
54* END;
SCOTT>
SCOTT> /

プロシージャが作成されました。

SCOTT>


できた!!! :)

SCOTT> set serveroutput on size 100000
SCOTT> exec simpleCommand('いま何時?');
現在時刻:2010-03-20 15:50:27

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

SCOTT> exec simpleCommand('従業員リスト');
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('従業員数は?');
従業員数:14

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

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

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

SCOTT>

次回はコマンドを外部から与えられるように改造してみます。 次回へつづく。



・バックナンバー

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

| |

トラックバック


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

コメント

コメントを書く