listener =
(description_list =
(description =
(address_list =
(address = (protocol = tcp)(host = chanet)(port = 1521))
)
(address_list =
(address = (protocol = ipc)(key = extproc1))
)
)
)
sid_list_listener =
(sid_list =
(sid_desc =
(sid_name = plsextproc)
(oracle_home = d:/oracle/ora92)
(program = extproc)
)
(sid_desc =
(global_dbname = oradb)
(oracle_home = d:/oracle/ora92)
(sid_name = oradb)
)
)
extproc_connection_data =
(description =
(address_list =
(address = (protocol = ipc)(key = extproc1))
)
(connect_data =
(sid = plsextproc)
(presentation = ro)
)
)
c:/>tnsping extproc_connection_data
tns ping utility for 32-bit windows: version 9.2.0.1.0 - production on 07-4月 -2
005 16:57:00
copyright (c) 1997 oracle corporation. all rights reserved.
d:/oracle/ora92/network/admin/sqlnet.ora
attempting to contact (description = (address_list = (address = (protocol = ipc)
(key = extproc1))) (connect_data = (sid = plsextproc) (presentation = ro)))
ok(30毫秒)
d:/oracle/ora92/bin>extproc
oracle corporation --- 星期四 4月 07 2005 17:37:18.968
heterogeneous agent release 9.2.0.1.0 - production
sql>connect system/[email protected]
sql>create user chanet identified by chanet;
sql>grant create library to chanet;
sql>connect chanet/[email protected];
sql>@d:/oracle/ora92/com/comwrap.sql;
startup_wait_time_listener = 0
connect_timeout_listener = 10
trace_level_listener = off
passwords_lintener = (oracle)
pl/sql数据类型 | com api 数据类型 |
varchar2 | bstr |
boolean | bool |
binary_integer | byte,int,long |
double precision | double,float,currency |
date | date |
名称 | 功能描述 |
createobject | 创建对象 |
destroyobject | 关闭对象 |
getlasterror | 获取错误信息 |
getproperty | 获取属性值 |
setproperty | 设置属性值 |
initarg | 为invoke函数初始化参数 |
initoutarg | 为getarg初始化输出参数 |
getarg | 获取输出参数 |
setarg | 为invoke函数设置参数 |
invoke | 调用com对象的函数或过程 |
create table it_sale_tab(its_id varchar2(5),its_date date,its_total number);
insert into it_sale_tab(its_id,its_date,its_total)
values(’1’,to_date(’2004-01-01’,’yyyy-mm-dd’),250);
insert into it_sale_tab(its_id,its_date,its_total)
values(’2’,to_date(’2004-02-01’,’yyyy-mm-dd’),150);
insert into it_sale_tab(its_id,its_date,its_total)
values(’3’,to_date(’2004-03-01’,’yyyy-mm-dd’),80);
insert into it_sale_tab(its_id,its_date,its_total)
values(’4’,to_date(’2004-04-01’,’yyyy-mm-dd’),96);
insert into it_sale_tab(its_id,its_date,its_total)
values(’5’,to_date(’2004-05-01’,’yyyy-mm-dd’),300);
insert into it_sale_tab(its_id,its_date,its_total)
values(’6’,to_date(’2004-06-01’,’yyyy-mm-dd’),210);
insert into it_sale_tab(its_id,its_date,its_total)
values(’7’,to_date(’2004-07-01’,’yyyy-mm-dd’),320);
insert into it_sale_tab(its_id,its_date,its_total)
values(’8’,to_date(’2004-08-01’,’yyyy-mm-dd’),280);
insert into it_sale_tab(its_id,its_date,its_total)
values(’9’,to_date(’2004-09-01’,’yyyy-mm-dd’),276);
insert into it_sale_tab(its_id,its_date,its_total)
values(’10’,to_date(’2004-10-01’,’yyyy-mm-dd’),368);
insert into it_sale_tab(its_id,its_date,its_total)
values(’11’,to_date(’2004-11-01’,’yyyy-mm-dd’),163);
insert into it_sale_tab(its_id,its_date,its_total)
values(’12’,to_date(’2004-12-01’,’yyyy-mm-dd’),305);
commit;
create or replace package oraexcel is
xlthin binary_integer default 2;
dummytoken binary_integer;
applicationtoken binary_integer:=-1; -- excel对象句柄
workbookstoken binary_integer:=-1; -- 工作簿句柄
workbooktoken binary_integer:=-1;
worksheettoken binary_integer:=-1; -- 工作表句柄
worksheettoken1 binary_integer:=-1;
rangetoken binary_integer:=-1; -- range区句柄
chartobjecttoken binary_integer:=-1; -- 图表对象句柄
chartobject1 binary_integer:=-1;
chart1token binary_integer:=-1;
hlines binary_integer:=-1;
i binary_integer;
err_src varchar2(255);
err_desc varchar2(255);
err_hpf varchar2(255);
err_hpid binary_integer;
-- 创建excel对象
function createexcelworksheet(servername varchar2) return binary_integer;
-- 插入数据(字符型)
function setcellvalues(range varchar2,data varchar2,type varchar2)
return binary_integer;
-- 插入数据(日期型)
function setcellvalues(range varchar2,data date,type varchar2)
return binary_integer;
-- 插入数据(整型)
function setcellvalues(range varchar2,data binary_integer,type varchar2)
return binary_integer;
-- 插入数据(实型)
function setcellvaluesreal(range varchar2,data double precision,type varchar2)
return binary_integer;
-- 设置列宽
function setcellcolwidth(range varchar2,width double precision,type varchar2) return
binary_integer;
-- 设置表格
function setcelllines(range varchar2,bordersindex binary_integer,weight
binary_integer default xlthin,type varchar2) return binary_integer;
-- 合并单元格
function setcellmerge(range varchar2,bvalues boolean,type varchar2)
return binary_integer;
-- 设置字体属性
function setcellfont(range varchar2,property varchar2,
fontvalues binary_integer,type varchar2) return binary_integer;
-- 调用方法
function callmethod(range varchar2,methodname varchar2) return binary_integer;
-- 插入图表
function insertchart(xpos binary_integer,ypos binary_integer,
width binary_integer,height binary_integer,
range varchar2,type varchar2) return binary_integer;
-- 保存文件
function savetofile(filename varchar2) return binary_integer;
-- 关闭excel对象
function closeexcel return binary_integer;
end oraexcel;
create or replace package body oraexcel is
function createexcelworksheet(servername varchar2) return binary_integer is
begin
-- 创建excel对象
i:=ordcom.createobject(’excel.application’, 0, servername,applicationtoken);
if (i!=0) then -- 创建失败,提示返回的错误信息
ordcom.getlasterror(err_src, err_desc, err_hpf, err_hpid);
raise_application_error(-20000,err_src || err_desc || err_hpf || err_hpid);
end if;
-- 通过程序对象句柄获取工作簿句柄
i:=ordcom.getproperty(applicationtoken, ’workbooks’, 0, workbookstoken);
ordcom.initarg();
ordcom.setarg(-4167,’i4’);
i:=ordcom.invoke(workbookstoken, ’add’, 1, workbooktoken);
ordcom.initarg();
ordcom.setarg(’sheet 1’,’bstr’);
-- 获取工作表句柄
i:=ordcom.getproperty(applicationtoken, ’worksheets’, 0, worksheettoken1);
i:=ordcom.invoke(worksheettoken1, ’add’, 0, worksheettoken);
return i;
end createexcelworksheet;
function setcellvalues(range varchar2,data varchar2, type varchar2)
return binary_integer is
begin
ordcom.initarg();
ordcom.setarg(range,’bstr’);
-- 获取range区句柄,之后将数据写入到指定的单元格
i:=ordcom.getproperty(worksheettoken, ’range’, 1, rangetoken);
i:=ordcom.setproperty(rangetoken, ’value’, data, type);
i:=ordcom.destroyobject(rangetoken);
return i;
end setcellvalues;
function setcellvalues(range varchar2,data binary_integer,type varchar2)
return binary_integer is
begin
ordcom.initarg();
ordcom.setarg(range, ’bstr’);
i:=ordcom.getproperty(worksheettoken, ’range’, 1, rangetoken);
i:=ordcom.setproperty(rangetoken, ’value’, data, type);
i:=ordcom.destroyobject(rangetoken);
return i;
end setcellvalues;
function setcellvaluesreal(range varchar2,data double precision,type varchar2)
return binary_integer is
begin
ordcom.initarg();
ordcom.setarg(range, ’bstr’);
i:=ordcom.getproperty(worksheettoken, ’range’, 1, rangetoken);
i:=ordcom.setproperty(rangetoken, ’value’, data, type);
i:=ordcom.destroyobject(rangetoken);
return i;
end setcellvaluesreal;
function setcellvalues(range varchar2,data date,type varchar2)
return binary_integer is
begin
ordcom.initarg();
ordcom.setarg(range, ’bstr’);
i:=ordcom.getproperty(worksheettoken, ’range’, 1, rangetoken);
i:=ordcom.setproperty(rangetoken, ’value’, data, type);
i:=ordcom.destroyobject(rangetoken);
return i;
end setcellcolwidth;
function setcellmerge(range varchar2,bvalues boolean,type varchar2)
return i;
end setcellvalues;
function setcellcolwidth(range varchar2,width double precision,type varchar2)
return binary_integer is
begin
ordcom.initarg();
ordcom.setarg(range,’bstr’);
i:=ordcom.getproperty(worksheettoken,’range’,1,rangetoken);
i:=ordcom.setproperty(rangetoken,’columnwidth’,width,type);
i:=ordcom.destroyobject(rangetoken);
return binary_integer is
begin
ordcom.initarg();
ordcom.setarg(range,’bstr’);
i:=ordcom.getproperty(worksheettoken,’range’,1,rangetoken);
i:=ordcom.setproperty(rangetoken,’mergecells’,bvalues,’boolean’);
i:=ordcom.destroyobject(rangetoken);
return i;
end setcellmerge;
function setcelllines(range varchar2,bordersindex binary_integer,
weight binary_integer default xlthin,type varchar2) return binary_integer is
begin
ordcom.initarg();
ordcom.setarg(range,’bstr’);
i:=ordcom.getproperty(worksheettoken,’range’,1,rangetoken);
ordcom.initarg();
ordcom.setarg(bordersindex,type); -- 画表格的具体载入参数
i:=ordcom.getproperty(rangetoken,’borders’,1,hlines);
i:=ordcom.setproperty(hlines,’weight’,weight,type);
i:=ordcom.destroyobject(hlines);
i:=ordcom.destroyobject(rangetoken);
return i;
end setcelllines;
function setcellfont(range varchar2,property varchar2,fontvalues binary_integer,type
varchar2) return binary_integer is
begin
ordcom.initarg();
ordcom.setarg(range,’bstr’);
i:=ordcom.getproperty(worksheettoken,’range’,1,rangetoken);
ordcom.initarg();
ordcom.setarg(property,type);
ordcom.initarg();
i:=ordcom.getproperty(worksheettoken, ’chartobjects’, 0, chartobjecttoken);
ordcom.initarg();
ordcom.setarg(xpos,’i2’); -- 载入图表对象位置参数
ordcom.setarg(ypos,’i2’);
ordcom.setarg(width,’i2’);
ordcom.setarg(height,’i2’);
i:=ordcom.invoke(chartobjecttoken, ’add’, 4, chartobject1); -- 添加图表
i:=ordcom.getproperty(chartobject1, ’chart’, 0,chart1token);
ordcom.initarg();
ordcom.setarg(range, ’bstr’);
i:=ordcom.getproperty(worksheettoken,’range’, 1, rangetoken); -- 选取区域
ordcom.initarg();
ordcom.setarg(rangetoken, ’dispatch’);
if type=’xlpie’ then
charttype := -4102;
elsif type=’xl3dbar’ then
charttype := -4099;
elsif type=’xlbar’ then
charttype := 2;
elsif type=’xl3dline’ then
i:=ordcom.getproperty(rangetoken,’font’,0,hlines); -- 获取字体对象
i:=ordcom.setproperty(hlines,property,fontvalues,type);
i:=ordcom.destroyobject(hlines);
i:=ordcom.destroyobject(rangetoken);
return i;
end;
function callmethod(range varchar2,methodname varchar2) return binary_integer is
reti binary_integer := -1;
begin
ordcom.initarg();
ordcom.setarg(range,’bstr’);
i:=ordcom.getproperty(worksheettoken,’range’,1,rangetoken);
ordcom.initarg();
i:=ordcom.invoke(rangetoken,methodname,0,reti); -- 调用对象的方法
i:=ordcom.destroyobject(rangetoken);
return reti;
end;
function insertchart(xpos binary_integer, ypos binary_integer,
width binary_integer, height binary_integer,
range varchar2, type varchar2)
return binary_integer is
charttype binary_integer:= -4099;
begin
charttype:= -4101;
end if;
ordcom.setarg(charttype,’i4’);
i:=ordcom.invoke(chart1token,’chartwizard’, 2, dummytoken);
i:=ordcom.destroyobject(rangetoken);
i:=ordcom.destroyobject(chartobjecttoken);
i:=ordcom.destroyobject(chartobject1);
i:=ordcom.destroyobject(chart1token);
return i;
end insertchart;
function savetofile(filename varchar2) return binary_integer is
begin
ordcom.initarg();
ordcom.setarg(filename,’bstr’);
i:=ordcom.invoke(workbooktoken, ’saveas’, 1, dummytoken); -- 保存文件
if (i!=0) then
ordcom.getlasterror(err_src, err_desc, err_hpf, err_hpid);
raise_application_error(-20000,err_src || err_desc || err_hpf || err_hpid);
end if;
return i;
end savetofile;
function closeexcel return binary_integer is
begin
ordcom.initarg();
ordcom.initarg();
ordcom.setarg(false,’bool’);
i:=ordcom.invoke(workbooktoken, ’close’, 0, dummytoken);
i:=ordcom.destroyobject(workbooktoken);
ordcom.initarg();
i:=ordcom.invoke(workbookstoken, ’close’, 0, dummytoken);
i:=ordcom.destroyobject(workbookstoken);
i:=ordcom.invoke(applicationtoken, ’quit’, 0, dummytoken);
-- 关闭所有句柄
i:=ordcom.destroyobject(worksheettoken);
i:=ordcom.destroyobject(worksheettoken1);
i:=ordcom.destroyobject(applicationtoken);
i:=ordcom.destroyobject(chartobjecttoken);
i:=ordcom.destroyobject(chart1token);
i:=ordcom.destroyobject(hlines);
i:=ordcom.destroyobject(chartobject1);
i:=ordcom.destroyobject(dummytoken);
return i;
end closeexcel;
end oraexcel;
create or replace procedure dp_toexcel is
cursor c1 is select its_id,its_date,its_total from it_sale_tab;
n binary_integer:=2;
i binary_integer;
filename varchar2(255);
cellindex varchar2(40);
cellvalue varchar2(40);
cellcolumn varchar2(10);
returnedtime varchar2(20);
currencyvalue double precision;
datevalue date;
xlthin binary_integer:=2;
xledgeleft binary_integer:=7;
xledgetop binary_integer:=8;
xledgebottom binary_integer:=9;
xledgeright binary_integer:=10;
xlinsidevertical binary_integer:=11;
xlinsidehorizontal binary_integer:=12;
begin
i:=oraexcel.createexcelworksheet(’’);
i:=oraexcel.setcellvalues(’a2’, ’序号’, ’bstr’);
i:=oraexcel.setcellvalues(’b2’, ’日期’, ’bstr’);
i:=oraexcel.setcellvalues(’c2’, ’销售’, ’bstr’);
cellvalue:=c1_rec.its_total;
currencyvalue:=cellvalue;
i:=oraexcel.setcellvaluesreal(cellindex, currencyvalue, ’cy’);
n:=n+1;
end loop;
i:=oraexcel.setcellvalues(’a’||n,’合计’,’bstr’);
i:=oraexcel.setcellvalues(’c’||n,’=sum(c3:c’||to_char(n-1)||’)’,’bstr’);
-- 画表格
i:=oraexcel.setcelllines(’a1:c’||n,xledgeleft,xlthin,’i2’);
i:=oraexcel.setcelllines(’a1:c’||n,xledgetop,xlthin,’i2’);
i:=oraexcel.setcelllines(’a1:c’||n,xledgebottom,xlthin,’i2’);
i:=oraexcel.setcelllines(’a1:c’||n,xledgeright,xlthin,’i2’);
i:=oraexcel.setcelllines(’a1:c’||n,xlinsidevertical,xlthin,’i2’);
i:=oraexcel.setcelllines(’a1:c’||n,xlinsidehorizontal,xlthin,’i2’);
-- 设置字体属性
i:=oraexcel.setcellfont(’a1:c1’,’size’,20,’i2’);
i:=oraexcel.setcellfont(’a1:c1’,’bold’,1,’i2’);
i:=oraexcel.callmethod(’a1:c1’,’merge’); -- 合并单元格
i:=oraexcel.setcellvalues(’a1:c1’,’合计’,’bstr’);
-- 插入图表
i:=oraexcel.setcellcolwidth(’b:b’, 12.75,’cy’); -- 设置列宽
i:=oraexcel.setcellcolwidth(’c:c’, 12.75,’cy’);
n:=3;
for c1_rec in c1 loop
cellcolumn:=to_char(n);
cellindex:= ’a’||cellcolumn;
cellvalue:= to_char(c1_rec.its_id);
i:=oraexcel.setcellvalues(cellindex, cellvalue, ’bstr’);
cellindex:= ’b’ || cellcolumn;
datevalue:=c1_rec.its_date;
i:=oraexcel.setcellvalues(cellindex, datevalue, ’date’);
cellindex:= ’c’ || cellcolumn;
i:=oraexcel.insertchart(350,200,250,250,’c3:c’||to_char(n-1),’xlpie’);
select to_char(sysdate, ’hh24miss’) into returnedtime from dual;
filename:=’d:/testexcel’ || returnedtime || ’.xls’;
i:=oraexcel.savetofile(filename); -- 保存文件
i:=oraexcel.closeexcel(); -- 关闭对象
end;
新闻热点
疑难解答