« Mac De Oracle | トップページ | PL/SQL で Python Challenge 6 »

2005年7月13日 (水)

PL/SQL で Python Challenge 5 完結編

ついにPL/SQLで、Python Chellenge Level5を 解いた!  PL/SQLで解くためのヒント(ヒントより解答に近いかもしれないが。。)

謎は解けたが、PL/SQLでは、1つ問題になることがある。PL/SQLがオブジェクト指向的な拡張はされているが、オブジェクト指向言語ではないからだ。一時はあきらめかけたのだが、Pythonを使って解いてみると、オブジェクト指向言語でなくても解けそうな問題であることに気づく。

そこで、Pythonのソースコードや、仕様を決めているPEPを見始める。(PEPは、javaでいえば、JSRみたいなもの)

大きなヒントになってしまうが、PEP307のソースコードを探し始めたのである。その中で、RubyでPython Chellengeを解いている方のページを発見した。RubyでPEP307の一部(Level5を解くためだけに必要な部分)を実装したコードを発見したのだ。おおお〜〜〜。これをPL/SQLで実装すればいいじゃん!



PL/SQLで解くためのヒントは、上記のコードを解析してPL/SQLで書き上げろ。しかない! 

ポイントは、ANYDATA型及び、VARCHAR2型をネスト表を利用してユーザ定義型を作成する(ようするに、ANYDATA型とVARCHAR2型のコレクション型を定義するとうこと)。それらを、Rubyのコードにある@stackや@memoの代用として利用する。ANYDATA型のコレクションは、コレクションの各要素がANYDATA型になるのでどんな型でも格納できるのである。しがたって、ANYDATA型コレクションの要素にANYDATA型コレクションを格納し、さらに、その要素に。。。を繰り返すという操作が可能になる。最終的には、VARCHAR2型コレクションを格納してやれば今回の問題の80%はクリアできるはず。残りの部分は、UTL_FILEパッケージを利用してファイルを読み込む。結果もUTL_FILEで書き出せるが、SQL*Plusで確認したい方は、DBMS_OUTPUTパッケージを利用して表示させてもよい。(私はDBMS_OUTPUTパッケージを利用した。)その場合、set serveroutput on size xxxx に続けて、スペース表示を抑止しないオプションを付加することをお忘れなく!(あえて、オプションが何かは書きません! SQL*Plusのマニュアルを読んでくださいね)

ちなみに、この問題、PL/SQLでは、stackなどのロジックを書く必要があるため、PythonやRubyのように10行から20行程度のコードでは解決できない。かなりベタに書いてしまったこともあり、stackおよび、PEP307の一部対応で180行程度、全体で200行程度になった。そこまでして、PL/SQLで解きたいか〜という声が聞こえてきそうだが、ANYDATA型の利用方法が見えてきたのは収穫だった。(^^

以下のスナップショットではぼかしを入れてます。これを見せちゃったらつまらないからね〜。
finished


Python Challenge Level 6につづく。(PL/SQLだけでできるのかな?〜)

|

トラックバック


この記事へのトラックバック一覧です: PL/SQL で Python Challenge 5 完結編:

コメント

コメントを書く