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
多くの場合、私達はいくつかの中国式のレポートを作らなければなりません.例えば、いくつかのデータシートを持って、ある大学を表します.各省の学生募集計画情報:
省情報表
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