PL/SQL でハッシュ

使ってないとすぐ忘れるのでメモ
Oracle 7 時代に試したらダメだったことがいろいろできるようになってるようだ
PL/SQL なんて話題にする人いないから気が付かないけど、地味にいろいろ便利になってるみたい

declare
    type    vc_hash     is  table of varchar2(32000)
                            index by varchar2(32000)
    ;
    function read_hash(
        p_key               in  out varchar2
    ,   p_hash              in  vc_hash
    )
    return boolean
    is
    begin
        if  p_hash.count    =   0
        then
            return false;
        end if;
        if  p_key   is  null
        then
            p_key   := p_hash.first;
        else
            if  p_hash.next(p_key)  is  null
            then
                return false;
            end if;
            p_key   := p_hash.next(p_key);
        end if;
        return true;
    end ;
begin
    declare
        tmp     vc_hash;
        key     varchar2(100);
    begin
        tmp('hoge') :=  'fuga';
        tmp('HOGE') :=  'Fuga';
        tmp('hoge') :=  'FUGA'; --update

        loop
            if not read_hash(key,tmp)
            then
                exit;
            end if;
            dbms_output.put_line( key || ' = ' || tmp( key ) );
        end loop;
    end ;
end ;
/
HOGE = Fuga
hoge = FUGA