« _pga_max_sizeってOracle11gではどうなったっけ? という確認。 | トップページ | PL/SQLでCASE式を使わずに条件分岐 #2 »

2010年3月22日 (月)

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

随分前ですが、html5-developers-jpのディスカッションでJavaScriptでswitch文を使わずに条件分岐という話題があって、あ、そうそう、PL/SQLでもできるよね、って瞬間的に思っていたのですが、忙しくて、ず〜っと放置してたネタでございます。:)

今回は使うのは、Oracle11g R2 for Linux x86。

SCOTT> select * from v$version;

BANNER
--------------------------------------------------------------------------------
Oracle Database 11g Enterprise Edition Release 11.2.0.1.0 - Production
PL/SQL Release 11.2.0.1.0 - Production
CORE 11.2.0.1.0 Production
TNS for Linux: Version 11.2.0.1.0 - Production
NLSRTL Version 11.2.0.1.0 - Production

まずは、CASE式を使って書けば以下のような感じになるよね! ってところから。

SCOTT> l
1 CREATE OR REPLACE PROCEDURE simpleCommand
2 (
3 commandName IN VARCHAR2
4 )
5 IS
6 CURSOR empList IS
7 SELECT
8 empno
9 ,ename
10 ,dname
11 FROM
12 emp JOIN dept
13 ON emp.deptno = dept.deptno
14 ORDER BY
15 dname, empno, ename
16 ;
17 --
18 numberOfEmployees NUMBER;
19 BEGIN
20 CASE commandName
21 WHEN 'いま何時?' THEN
22 DBMS_OUTPUT.PUT_LINE('現在時刻:'||TO_CHAR(systimestamp, 'yyyy-mm-dd hh24:mi:ss'));
23 WHEN '従業員数は?' THEN
24 SELECT COUNT(*) INTO numberOFEmployees FROM emp;
25 DBMS_OUTPUT.PUT_LINE('従業員数:'||TO_CHAR(numberOfEmployees));
26 WHEN '従業員リスト' THEN
27 FOR empRec IN empList LOOP
28 DBMS_OUTPUT.PUT_LINE(empRec.empno || ' ' || empRec.ename || ' ' || empRec.dname);
29 END LOOP;
30 ELSE
31 DBMS_OUTPUT.PUT_LINE('そんなコマンド知りません! >< ');
32 END CASE;
33 --
34* END;
SCOTT> /

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

SCOTT>
SCOTT> set serveroutput on size 100000
SCOTT> exec simpleCommand('いま何時?');
現在時刻:2010-03-21 00:10:17

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式を排除してコマンドパターンっぽくできるのか。。。方法はいろいろあるな〜と思いつつ、PL/SQLの結合配列を使う方法で試してみた。
ということで、次回へつづく :) …

|

トラックバック


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

コメント

コメントを書く