テスト用に適当な名前を生成する

元ネタはかんたん10分プログラミング - 第11回 テスト用の名前データを自動生成する:ITpro
PL/SQLに移植して、SELECT文で適当な名前を生成するためのプロシージャを作成してみた。

CREATE OR REPLACE PACKAGE Test is

  function GetRandName return varchar2;

end Test;
/


CREATE OR REPLACE PACKAGE BODY Test is
  TYPE tArray6 IS TABLE OF VARCHAR2(6) NOT NULL;

  /**
   * GetRandName テスト用の架空の人名を返す
   * @return 人名
   */
  function GetRandName return varchar2 is
    vFName_List1 tArray6 := tArray6('*','山','川','谷','田','小','石','水','大','橋','野','池','吉','中');
    vFName_List2 tArray6 := tArray6('田','本','川','口','野','村','崎','山','島','上','浦','内','原');
    vFamilierFNs tArray6 := tArray6('加藤','鈴木','佐藤','高橋','渡辺','伊藤','斉藤','佐々木','原','田中');
    vLName_List1 tArray6 := tArray6('順','優','恵','浩','裕','正','昭','真','純','清','博','孝','幸');
    vLName_List2 tArray6 := tArray6('*','一','二','子','美','一郎','実','義','夫','雄','太郎','彦');

    vFName1 varchar2(6);
    vFName2 varchar2(2);
    vLName1 varchar2(2);
    vLName2 varchar2(4);
  begin
    -- 名字の作成
    vFName1 := vFName_List1(trunc(dbms_random.value(1, vFName_List1.Count)));
    vFName2 := vFName_List2(trunc(dbms_random.value(1, vFName_List2.Count)));
    if (vFName1=vFName2 or vFName1 = '*' or vFName1||vFName2 = '池川') then
      -- 変な名字ができてしまったら無難リストから選び直す
      -- vFName_List1に'*'を混ぜる割合が高いほど無難な名字が増える
      vFName1 := vFamilierFNs(trunc(dbms_random.value(1, vFamilierFNs.Count)));
      vFName2 := '';
    end if;

    -- 名前の作成
    vLName1 := vLName_List1(trunc(dbms_random.value(1, vLName_List1.Count)));
    vLName2 := vLName_List2(trunc(dbms_random.value(1, vLName_List2.Count)));
    if (vLName2 = '*') then
      vLName2 := '';
    end if;

    return vFName1||vFName2||' '||vLName1||vLName2;
  end GetRandName;

end Test;
/