ITPub博客

首页 > 数据库 > 数据库开发技术 > print the result sql

print the result sql

原创 数据库开发技术 作者:imlihj2007 时间:2008-02-29 11:03:18 0 删除 编辑

create or replace procedure Print_sql(sqltest varchar2) is
/*
作者:李红杰
说明:为了进行性能的管理,对一些性能管理的语句做一些必要的结果的输出!!
*/

begin
dbms_output.enable(2000000);
--验证输入的SQL语句是否有问题!!
--利用DBMS__SQL包进行数据正确性的判断!!
----------------------------------------------------------------------
declare
cur_sql_int number:=0;
cur_sqltest varchar2(500):=0;
begin
cur_sqltest:=sqltest;
cur_sql_int:=dbms_sql.open_cursor;
dbms_sql.parse(cur_sql_int,cur_sqltest,dbms_sql.v7);
--dbms_output.put_line(cur_sql_int);
dbms_sql.close_cursor(cur_sql_int);
exception
when others then
dbms_output.put_line(' 错误提示:');
dbms_output.put_line(' 请检查你的SQL语句!');
dbms_output.put_line(' '||substrb(sqlerrm,1,200));
return;

end;
--对SQL 语句进行简单的判断!并对列的信息进行解析!!
--获得语句列信息的详细
------------------------------------------------------------------------
declare
fh_01 varchar2(2):='*';
fh_02 number:=0;
fh_03 number:=0;
fh_04 varchar2(500);--要格式话的SQL语句
fh_05 varchar2(500);--列的信息
fh_06 number:=1; --输出列的数量
fh_07 number:=1;
fh_08 varchar2(100);
type cols_list_type is table of varchar2(30) index by binary_integer;
cols_list cols_list_type; --定义成公共的方便下面的调用
begin
fh_04:=upper(sqltest);
dbms_output.put_line(' '||fh_04);
fh_02:=instr(fh_04,fh_01);
--dbms_output.put_line(fh_02);
if fh_02>0 then
--当有 * 出现的时候!
--只输出20列
--简单的SQL语句还比较容易处理
--但是复杂的SQL语句就很不容易处理拉!
--避免出现乘号的时候 8 kais
declare
fh_001 number:=0;
fh_002 varchar(100);
begin
fh_001:=instr(fh_04,'SELECT');
fh_03:=instr(fh_04,'FROM');
fh_002:=substrb(fh_04,fh_001+7,fh_03-fh_001-7);

dbms_output.put_line(fh_001||''||fh_03||' :'||fh_002);
if rtrim(ltrim(fh_002))='*' then
dbms_output.put_line(' 警告:QQ');
dbms_output.put_line(' 警告:');
dbms_output.put_line(' 暂时不做处理!');
return;
end if;

end;
end if;
if fh_02=0 then
--当没有* 出现的时候!
begin
fh_03:=instr(fh_04,'FROM');
fh_05:=ltrim(rtrim(substrb(fh_04,8,fh_03-8)));
--要用一个自己调用自己的过程
while instr(fh_05,',',1,fh_06)>0 loop
cols_list(fh_06):=replace(substrb(fh_05,fh_07,instr(fh_05,',',1,fh_06)
-fh_07),',','');
fh_07:=instr(fh_05,',',1,fh_06);
fh_06:=fh_06+1;
end loop;
cols_list(fh_06):=replace(substrb(fh_05,fh_07),',','');
--dbms_output.put_line(fh_06);
--在这个地方对SQL 语句进行特定的格式
for i in 1..20-fh_06 loop
fh_08:=fh_08||','''' ';
end loop;
fh_04:=replace(fh_04,fh_05,fh_05||fh_08);
end;
end if;
--输出与打印相关的信息 需要用动态的语句
--生成必要的动态语句
------------------------------------------------------------------------
declare
exe_sql varchar2(5000);
out_01 varchar2(200);
out_02 varchar2(200);
out_03 varchar2(200);
out_04 varchar2(200);
out_05 varchar2(200);
out_06 varchar2(200);
out_07 varchar2(200);
out_08 varchar2(200);
out_09 varchar2(200);
out_10 varchar2(200);
out_11 varchar2(200);
out_12 varchar2(200);
out_13 varchar2(200);
out_14 varchar2(200);
out_15 varchar2(200);
out_16 varchar2(200);
out_17 varchar2(200);
out_18 varchar2(200);
out_19 varchar2(200);
out_20 varchar2(200);
type cur_type is ref cursor;
cur_001 cur_type;
v_bt varchar2(500);
v_jlx varchar2(500);
begin
--对标题要进行全面的格式话!!
--dbms_output.put_line('%^%^%^');
if fh_06>20 then
dbms_output.put_line('the columns must be smaller than 20!');
return;
end if;
for i in 1..fh_06 loop
v_bt:= v_bt||lpad('-------------------',20,' ');
end loop;
--对记录项进行格式话
for i in 1..cols_list.count loop
v_jlx:=v_jlx||lpad(substrb(cols_list(i),1,12),20,' ');
end loop;

dbms_output.put_line(v_jlx);
dbms_output.put_line(v_bt);
open cur_001 for lower(fh_04);
loop
fetch cur_001 into out_01,out_02,out_03,out_04,out_05,out_06,

out_07,out_08,out_09,out_10,out_11,out_12,out_13,out_14,out_15,

out_16,out_17,out_18,out_19,out_20;
exit when cur_001%notfound;
--对输出进行格式的处理!!
out_01:=lpad(out_01,20,' ');
out_02:=lpad(out_02,20,' ');
out_03:=lpad(out_03,20,' ');
out_04:=lpad(out_04,20,' ');
out_05:=lpad(out_05,20,' ');
out_06:=lpad(out_06,20,' ');
out_07:=lpad(out_07,20,' ');
out_08:=lpad(out_08,20,' ');
out_09:=lpad(out_09,20,' ');
out_10:=lpad(out_10,20,' ');
out_11:=lpad(out_11,20,' ');
out_12:=lpad(out_12,20,' ');
out_13:=lpad(out_13,20,' ');
out_14:=lpad(out_14,20,' ');
out_15:=lpad(out_15,20,' ');
out_16:=lpad(out_16,20,' ');
out_17:=lpad(out_17,20,' ');
out_18:=lpad(out_18,20,' ');
out_19:=lpad(out_19,20,' ');
out_20:=lpad(out_20,20,' ');
--dbms_output.
--怎样清空这个隐含的缓存!!
dbms_output.put_line(out_01||out_02||out_03||out_04||out_05||
out_06||out_07||out_08||

out_09||out_10||out_11||out_12||out_13||out_14||out_15||out_16||
out_17||out_18||out_19||out_20);
end loop;
dbms_output.put_line(v_bt);--instruction
dbms_output.put_line(lpad('-----☆made by lihj☆',length(v_bt),' '));
dbms_output.put_line(lpad('instruction: ',length(v_bt),' '));
dbms_output.put_line(lpad('the columns must be smaller than 20!',
length(v_bt),' '));
end;
end;

end Print_sql;
--以上的存储过程可以打印一般的SQL语句!!!!

[@more@]

来自 “ ITPUB博客 ” ,链接:https://blog.itpub.net/9879835/viewspace-1000183/ ,如需转载,请注明出处,否则将追究法律责任。

上一篇: 从ORACLE 生成图片
请登录后发表评论 登录
全部评论

注册时间:2011-05-25

  • 博文量
    109
  • 访问量
    1577025