Oracleの保存過程を利用して、中国式のクロス統計表を実現します.


リンク:http://blog.csdn.net/sandloves/archive/2010/06/24/5691836.aspx
多くの場合、私達はいくつかの中国式のレポートを作らなければなりません.例えば、いくつかのデータシートを持って、ある大学を表します.各省の学生募集計画情報:
省情報表
Area_Id名称
1遼寧省
2吉林
3アムール川
……
専門情報シート
スペシャリストId院系名称
1外国語学部
2コンピュータ系
3中国語学部
……
学生募集計画情報表
Area_Id speciality_Id年度学生募集人数
1 2010年3
2 1 2010年5
3 1 2010年3
1 2 2010年2
2 2010年5
3 2 2010年3
1 3 2010年1
2 3 2010年4
3 2010年5
……
じゃ、私達はクロスしたレポートを統計したいです.2010年度に、各専門省の学生募集人数を統計します.つまり、このクロス統計レポート(中国式レポート):
本年度の各専攻は各省における学生募集計画情報です.
外国語学部コンピュータ系中国語学科
遼寧3 2
吉林5 4
アムール川3 3
……
      私たちはこのタイプのレポートの統計を実現するためにメモリプロセスを使用します.まずはこの大学の学部のデータを取得して、このラベルを循環して、二次クエリ統計のsql文を作成します.このsqlは生成後、非常に膨大になります.oracleの中でvarhar 2の長さ制限を超えるかもしれません(32767).この格納プロセスはdbms_を採用しています.sql.varrhar 2 s文字列配列は、動的sqlを実現する.
      しかし問題はまた発生しました.dbms_のためです.sql.varrhal 2 sはダイナミックsqlを実行した後、一つの遊覧標識に戻れないので、dbms_sql.varrhal 2 sがsqlを実行する時、私達はviewを使ってこの機能を完成すると考えています.つまり、dbms_を通じてsql.varrhar 2 sを実行すると、私たちが必要とする臨時ビューが生成されます.その後、普通のsqlを通じてこのビューを調べて、遊覧標識に戻ります.具体的な格納プロセスは以下の通り実現される.
create or replace procedure P_Query Report(huutable name in varrhar 2)--行表名
                                          hufieldcode in varrhar 2、--行コード
                                          hufieldname in varrhar 2--行名
                                          huqlwhere  in varrrhar 2、--行検索条件はandから始まります.
                                          
                                          l.utable name in varrhar 2、--リスト名
                                          l fieldcode in varrhar 2、列コード
                                          l fieldname in varrhar 2、--列名
                                          lchlwhere  in varrrhar 2--列検索条件
                                          
                                          cutablename     in varrrhar 2--統計表名
                                          フィールド名のまとめ
                                          cchufieldcode   in varrrhar 2--統計表関連行コード
                                          cul fieldcode   in varrrhar 2、--統計表関連列コード
                                          cchlwhere      in varrrhar 2--統計表検索条件
                                          
                                          reult list out systure fcursor--結果集に戻ります.
                                          ) Authid Currennt is
  l    varrchar 2(32767)
  ルクルス     systure fcursor
  lcuurucode varrhar 2(32767)
  lcuur_namevarrhar 2(32767)
  h呸ルvarrch har 2(32767);
  pucchlwhere varhar(32767);
  ------------------------------------------
  ltmt   dbms.varrhal 2 s;
  lucursor integer default dbms.openucursor;
  lcuurows   number default 0
  lulength number:=0;
  i        number:=1;
  e        number:=0;
  --------------------------------------------
begin
  pucchlwhere:=ccccculwhere;
  e:=length(pucchlwhere);
  l stmt(i):='create or replace view LHTEMP VIEW as select'?|
               hufieldcode 124',??hu fieldname 124;
  i:=i+1
  l sql:='select'from'?
           l table name me me 124; where 1=1'??trim;
  open lcuurs for lcus;
  loop
    Fetch lcuurs
      Into lcuurucode,lcuur uname;
    Exit When lcuurs%notfound;
    l stmt(i):='(select sum('?|?|c⽜;fieldcode 124;')  from;
    i:=i+1
    l stmt(i)=cmutlename;
    i:=i+1
    l stmt(i):='where';
    i:=i+1
    l stmt(i)==cul fieldcode;
    i:=i+1
    l_stmt(i):=''''??lucode';
    i:=i+1
    l stmt(i):=trim(pucchlwhere);
    i:=i+1
    l stmt(i):='and'??cカルドコード124;
                 ') as"????????????'"
    i:=i+1
  end loop;
  if i>2 then
    l stmt(i-1):=substr(lustmt(i-1)、0、length(lmt(i-1)-1);
  end if;
  l stmt(i):='from'??hublename?|?|?ॸ'where 1=1'|トレム(huqlwhere);
  l sql:=l stmt(i-1);
  dbms.parse(c             => lucursor
                 statement      => lcutmt
                 lb            => l.ustmt.first、
                 クラブ            => l.ustmt.last、
                 lfflg         => TRUE、
                 laggage=>dbms.native;
  lcuurows:=dbms.execute(lucursor);
  dbms.close ucursor;
  htsql:='select*from LHTEMP VIEW'
  open resultlist for husql;
end PuQuery Report