龙盟编程博客 | 无障碍搜索 | 云盘搜索神器
快速搜索
主页 > 数据库类 > Oracle 技术 >

在Oracle中使用PL/SQL操作COM对象(1)(3)

时间:2011-04-12 23:18来源:未知 作者:admin 点击:
分享到:
成功创建oraExcel包后,最后创建使用包的存储过程,实现把数据表里的字符型、日期型和数值型分别传到Excel工作表里,对数值型数据进行统计和使用Excel中
成功创建oraExcel包后,最后创建使用包的存储过程,实现把数据表里的字符型、日期型和数值型分别传到Excel工作表里,对数值型数据进行统计和使用Excel中的图表。该过程具体操作步骤为:

创建Excel对象。

建立表头,设置列宽。

将游标数据传到工作表。

画表格。

设置字体属性。

插入图表。

保存为Excel格式文件,关闭Excel对象。

如下为dp_toExcel存储过程:

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;

小结

本文介绍如何从PL/SQL中直接调用C程序的外部例程,并以操作Excel对象为示例。在调用该外部例程时,有如下相关的限制:

操作系统必需支持动态链接库(DLL)和共享库功能。

监听器和extproc进程必须运行在数据库所在的同一台机子上,不支持远程数据库。

extproc唯一支持的是C例程,但可以通过先调用C外部例程去使用其它对象(如:COM对象)。

除了限制外,调用外部例程会引起额外的系统资源开销,在使用外部例程之前要考虑是否一定要用到外部例程。

(责任编辑:铭铭 mingming_ky@126.com TEL:(010)68476636)


精彩图集

赞助商链接