|
马上注册,结交更多好友,享用更多功能,让你轻松玩转社区。
您需要 登录 才可以下载或查看,没有帐号?立即注册
x
DBaaS解决方案可以降低首次投入成本,对于那些小企业来说,他们往往认为内部部署的数据库成本太高,DBaaS的成本和灵活性优势对小企业吸引力更大,他们是云数据库解决方案的重点客户群体。 PL/SQL是由Oracle公司对尺度SQL举行扩大,公用于Oracle数据库中程序计划的公用言语,属第三代历程式程序计划言语。从Oracle8入手下手供应了间接从PL/SQL中挪用内部C言语历程,同意开辟职员用PL/SQL举行利用C言语体例的程序模块。从Oracle8i入手下手,又引进了Java程序。
在本文中次要先容内部例程的基础道理和利用前提,先容怎样经由过程援用内部例程来操纵Windows中的COM工具,并做了一个操纵Excel工具的示例。
本文的运转情况全体创建在Oracle9i和Windows2000。个中ORACLE的安装目次(ORACLE_HOME)为D:oracleora92,SID为ORADB,主机名为CHANET。
需要性
扩大后的PL/SQL言语已集成了尺度SQL,在效力和平安上十分合适计划Oracle数据库程序,但关于使用的某些功效,别的的程序计划言语比PL/SQL更合适,如:利用操纵体系资本,C言语在盘算和援用体系工具及利用设备上优于PL/SQL,而Java言语在收集上的使用优于PL/SQL。
假如在使用上要用到不合适用PL/SQL言语的话,这时候就要利用别的言语举行体例,然后由PL/SQL作为内部例程举行挪用。
在Oracle8之前的版本,PL/SQL和别的言语的独一通讯是借助于DBMS_PIPE和DBMS_ALERT包来完成,在利用之前必须创建一个OCI接口或预编译器体例的监护程序,利用对照庞大。内部例程的呈现,只需在PL/SQL中创建一个函数映照到内部例程对应的函数,就像一般的PL/SQL函数利用一样,简化了利用历程。
基础道理
当援用内部C言语例程时,Oracle监听器将启动extproc历程,该历程将会静态地载进共享库(在Windows下称为静态链接库,便是DLL文件),历程起了一个缓冲的感化,当PL/SQL历程挪用内部函数时,历程把命令发送到共享库,以后把了局前往给PL/SQL历程。
历程被挪用后跟着共享库的利用会话(session)而存在,假如挪用终了大概封闭数据库用户会话,extproc历程会主动封闭。
以下-1为挪用内部例程的形貌。
监听器与extproc历程
利用设置
在挪用内部例程之前,必须举行以下设置:
・设置监听器。
・设置Net组件服务。
设置监听器,翻开D:oracleora92
etworkadminlistener.ora文件,修正文件参数。
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:oracleora92)
(PROGRAM=extproc)
)
(SID_DESC=
(GLOBAL_DBNAME=ORADB)
(ORACLE_HOME=D:oracleora92)
(SID_NAME=ORADB)
)
)
个中有两部分参数关于利用内部例程是很主要的。
・(ADDRESS_LIST=(ADDRESS=(PROTOCOL=IPC)(KEY=extproc1))
设置基于IPC协定的内部例程
・(SID_DESC=(SID_NAME=PLSExtProc)(ORACLE_HOME=D:oracleora92)(PROGRAM=extproc))
纪录数据库的相干属性,SID_NAME在默许的情形下是PLSExtproc。
设置Net组件服务,翻开D:oracleora92
etworkadmin nsnames.ora文件,把以下内容保留在该文件里。
EXTPROC_CONNECTION_DATA=
(DESCRIPTION=
(ADDRESS_LIST=
(ADDRESS=(PROTOCOL=IPC)(KEY=EXTPROC1))
)
(CONNECT_DATA=
(SID=PLSExtProc)
(PRESENTATION=RO)
)
)
主要参数申明:
・(ADDRESS=(PROTOCOL=IPC)(KEY=EXTPROC1))
・(CONNECT_DATA=(SID=PLSExtProc)(PRESENTATION=RO)
两设置必须与listener.ora里的分歧。
重启监听器,并测试服务是不是可用。
中断监听器:lsnrctlstop
启动监听器:lsnrctlstart
测试服务是不是可用:
C:>tnspingEXTPROC_CONNECTION_DATA
TNSPingUtilityfor32-bitWindows:Version9.2.0.1.0-Productionon07-4月-2
00516:57:00
Copyright(c)1997OracleCorporation.Allrightsreserved.
已利用的参数文件:
D:oracleora92
etworkadminsqlnet.ora
已利用TNSNAMES适配器来剖析别号
Attemptingtocontact(DESCRIPTION=(ADDRESS_LIST=(ADDRESS=(PROTOCOL=IPC)
(KEY=EXTPROC1)))(CONNECT_DATA=(SID=PLSExtProc)(PRESENTATION=RO)))
OK(30毫秒)
测试extproc历程是不是一般:
D:oracleora92in>extproc
OracleCorporation---木曜日4月07200517:37:18.968
HeterogeneousAgentRelease9.2.0.1.0-Production
4、利用COM工具申明
COM工具计划城市供应了三个基础操纵给开辟职员利用,分离为:猎取属性值,设置属性值(只读属性除外),挪用办法。Oracle数据库在Windows的平台下供应了操纵COM工具的接口,属于C言语内部例程形式。
事情道理以下图:
操纵COM工具事情道理
在利用该功效之前,需分明以下内容:
1)创立COM工具操纵函数。
SQL>CONNECTSYSTEM/chanet@oradb
SQL>CREATEUSERchanetidentifiedbychanet;
SQL>GRANTCREATELIBRARYTOchanet;
SQL>CONNECTchanet/chanet@oradb;
SQL>@D:oracleora92comcomwrap.sql;
2)设置监听器。
在listener.ora文件里,增加以下内容,偏重启监听器。
STARTUP_WAIT_TIME_LISTENER=0
CONNECT_TIMEOUT_LISTENER=10
TRACE_LEVEL_LISTENER=off
PASSWORDS_LINTENER=(oracle)
3)PL/SQL数据范例与对应的COM工具范例
表1-1数据范例对照
PL/SQL数据范例COMAPI数据范例VARCHAR2BSTRBOOLEANBOOLBINARY_INTEGERBYTE,INT,LONGDOUBLEPRECISIONDOUBLE,FLOAT,CURRENCYDATEDATE
4)函数申明。
表1-2函数申明
称号功效形貌CreateObject创立工具DestroyObject封闭工具GetLastError猎取毛病信息GetProperty猎取属性值SetProperty设置属性值InitArg为Invoke函数初始化参数InitOutArg为GetArg初始化输入参数GetArg猎取输入参数SetArg为Invoke函数设置参数Invoke挪用COM工具的函数或历程
5)操纵Excel示例
本节先容怎样操纵COM工具(以Excel工具为例),将数据库里的表纪录经由过程PL/SQL语句输入成Excel文件。经由过程工具扫瞄器能够检察Excel工具供应的属性和办法。(如:在Excel菜单,工具->宏->翻开VisualBasic编纂器,在编纂器里,视图->工具扫瞄器)。
利用Excel工具一样平常针对单位格举行操纵(如,设置第一个单位格字体巨细的代码为:Range("A1").Font.Size=20)。对应的COM内部例程操纵的步骤为:
1、猎取程序句柄;
2、猎取事情簿句柄;
3、猎取事情表句柄;
4、猎取Range区句柄;
5、猎取Font类句柄;
6、设置Size属性。
以下为操纵Excel工具的例子,起首创建示例表,然后创建操纵包(package),最初是利用包函数的历程(procedure)。创立一个测试用表:
--发卖表(剧本)
CREATETABLEIT_SALE_TAB(ITS_IDVARCHAR2(5),ITS_DATEDATE,ITS_TOTALNUMBER);
INSERTINTOIT_SALE_TAB(ITS_ID,ITS_DATE,ITS_TOTAL)
VALUES(’1’,TO_DATE(’2004-01-01’,’YYYY-MM-DD’),250);
INSERTINTOIT_SALE_TAB(ITS_ID,ITS_DATE,ITS_TOTAL)
VALUES(’2’,TO_DATE(’2004-02-01’,’YYYY-MM-DD’),150);
INSERTINTOIT_SALE_TAB(ITS_ID,ITS_DATE,ITS_TOTAL)
VALUES(’3’,TO_DATE(’2004-03-01’,’YYYY-MM-DD’),80);
INSERTINTOIT_SALE_TAB(ITS_ID,ITS_DATE,ITS_TOTAL)
VALUES(’4’,TO_DATE(’2004-04-01’,’YYYY-MM-DD’),96);
INSERTINTOIT_SALE_TAB(ITS_ID,ITS_DATE,ITS_TOTAL)
VALUES(’5’,TO_DATE(’2004-05-01’,’YYYY-MM-DD’),300);
INSERTINTOIT_SALE_TAB(ITS_ID,ITS_DATE,ITS_TOTAL)
VALUES(’6’,TO_DATE(’2004-06-01’,’YYYY-MM-DD’),210);
INSERTINTOIT_SALE_TAB(ITS_ID,ITS_DATE,ITS_TOTAL)
VALUES(’7’,TO_DATE(’2004-07-01’,’YYYY-MM-DD’),320);
INSERTINTOIT_SALE_TAB(ITS_ID,ITS_DATE,ITS_TOTAL)
VALUES(’8’,TO_DATE(’2004-08-01’,’YYYY-MM-DD’),280);
INSERTINTOIT_SALE_TAB(ITS_ID,ITS_DATE,ITS_TOTAL)
VALUES(’9’,TO_DATE(’2004-09-01’,’YYYY-MM-DD’),276);
INSERTINTOIT_SALE_TAB(ITS_ID,ITS_DATE,ITS_TOTAL)
VALUES(’10’,TO_DATE(’2004-10-01’,’YYYY-MM-DD’),368);
INSERTINTOIT_SALE_TAB(ITS_ID,ITS_DATE,ITS_TOTAL)
VALUES(’11’,TO_DATE(’2004-11-01’,’YYYY-MM-DD’),163);
INSERTINTOIT_SALE_TAB(ITS_ID,ITS_DATE,ITS_TOTAL)
VALUES(’12’,TO_DATE(’2004-12-01’,’YYYY-MM-DD’),305);
COMMIT;
操纵Excel工具包(Package)。
CREATEORREPLACEPACKAGEoraExcelIS
xlThinBINARY_INTEGERDEFAULT2;
DummyTokenBINARY_INTEGER;
applicationTokenBINARY_INTEGER:=-1;--Excel工具句柄
WorkBooksTokenBINARY_INTEGER:=-1;--事情簿句柄
WorkBookTokenBINARY_INTEGER:=-1;
WorkSheetTokenBINARY_INTEGER:=-1;--事情表句柄
WorkSheetToken1BINARY_INTEGER:=-1;
RangeTokenBINARY_INTEGER:=-1;--Range区句柄
ChartObjectTokenBINARY_INTEGER:=-1;--图表工具句柄
ChartObject1BINARY_INTEGER:=-1;
Chart1TokenBINARY_INTEGER:=-1;
hLinesBINARY_INTEGER:=-1;
iBINARY_INTEGER;
err_srcVARCHAR2(255);
err_descVARCHAR2(255);
err_hpfVARCHAR2(255);
err_hpIDBINARY_INTEGER;
--创立Excel工具
FUNCTIONCreateExcelWorkSheet(servernameVARCHAR2)RETURNBINARY_INTEGER;
--拔出数据(字符型)
FUNCTIONsetCellValues(RANGEVARCHAR2,dataVARCHAR2,TYPEVARCHAR2)
RETURNBINARY_INTEGER;
--拔出数据(日期型)
FUNCTIONsetCellValues(RANGEVARCHAR2,dataDATE,TYPEVARCHAR2)
RETURNBINARY_INTEGER;
--拔出数据(整型)
FUNCTIONsetCellValues(RANGEVARCHAR2,dataBINARY_INTEGER,TYPEVARCHAR2)
RETURNBINARY_INTEGER;
--拔出数据(实型)
FUNCTIONsetCellValuesReal(RANGEVARCHAR2,dataDOUBLEPRECISION,TYPEVARCHAR2)
RETURNBINARY_INTEGER;
--设置列宽
FUNCTIONsetCellColWidth(RANGEVARCHAR2,widthDOUBLEPRECISION,TYPEVARCHAR2)RETURN
BINARY_INTEGER;
--设置表格
FUNCTIONsetCellLines(RANGEVARCHAR2,BordersIndexBINARY_INTEGER,weight
BINARY_INTEGERDEFAULTxlThin,TYPEVARCHAR2)RETURNBINARY_INTEGER;
--兼并单位格
FUNCTIONsetCellMerge(RANGEVARCHAR2,bValuesBOOLEAN,TYPEVARCHAR2)
RETURNBINARY_INTEGER;
--设置字体属性
FUNCTIONsetCellFont(RANGEVARCHAR2,PropertyVARCHAR2,
fontValuesBINARY_INTEGER,TYPEVARCHAR2)RETURNBINARY_INTEGER;
--挪用办法
FUNCTIONcallMethod(RANGEVARCHAR2,MethodNameVARCHAR2)RETURNBINARY_INTEGER;
--拔出图表
FUNCTIONInsertChart(xposBINARY_INTEGER,yposBINARY_INTEGER,
widthBINARY_INTEGER,heightBINARY_INTEGER,
RANGEVARCHAR2,TYPEVARCHAR2)RETURNBINARY_INTEGER;
--保留文件
FUNCTIONSaveToFile(filenameVARCHAR2)RETURNBINARY_INTEGER;
--封闭Excel工具
FUNCTIONCloseExcelRETURNBINARY_INTEGER;
ENDoraExcel;
数据包体内容(PACKAGEBODY)
CREATEORREPLACEPACKAGEBODYoraExcelIS
FUNCTIONCreateExcelWorkSheet(servernameVARCHAR2)RETURNBINARY_INTEGERIS
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);
ENDIF;
--经由过程程序工具句柄猎取事情簿句柄
i:=ordcom.GetProperty(applicationToken,’WorkBooks’,0,WorkBooksToken);
ordcom.InitArg();
ordcom.SetArg(-4167,’I4’);
i:=ordcom.Invoke(WorkBooksToken,’Add’,1,WorkBookToken);
ordcom.InitArg();
ordcom.SetArg(’Sheet1’,’BSTR’);
--猎取事情表句柄
i:=ordcom.GetProperty(applicationToken,’WorkSheets’,0,WorkSheetToken1);
i:=ordcom.Invoke(WorkSheetToken1,’Add’,0,WorkSheetToken);
RETURNi;
ENDCreateExcelWorkSheet;
FUNCTIONsetCellValues(RANGEVARCHAR2,dataVARCHAR2,TYPEVARCHAR2)
RETURNBINARY_INTEGERIS
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);
RETURNi;
ENDsetCellValues;
FUNCTIONsetCellValues(RANGEVARCHAR2,dataBINARY_INTEGER,TYPEVARCHAR2)
RETURNBINARY_INTEGERIS
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);
RETURNi;
ENDsetCellValues;
FUNCTIONsetCellValuesReal(RANGEVARCHAR2,dataDOUBLEPRECISION,TYPEVARCHAR2)
RETURNBINARY_INTEGERIS
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);
RETURNi;
ENDsetCellValuesReal;
FUNCTIONsetCellValues(RANGEVARCHAR2,dataDATE,TYPEVARCHAR2)
RETURNBINARY_INTEGERIS
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);
RETURNi;
ENDsetCellColWidth;
FUNCTIONsetCellMerge(RANGEVARCHAR2,bValuesBOOLEAN,TYPEVARCHAR2)
RETURNi;
ENDsetCellValues;
FUNCTIONsetCellColWidth(RANGEVARCHAR2,widthDOUBLEPRECISION,TYPEVARCHAR2)
RETURNBINARY_INTEGERIS
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);
RETURNBINARY_INTEGERIS
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);
RETURNi;
ENDsetCellMerge;
FUNCTIONsetCellLines(RANGEVARCHAR2,BordersIndexBINARY_INTEGER,
weightBINARY_INTEGERDEFAULTxlThin,TYPEVARCHAR2)RETURNBINARY_INTEGERIS
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);
RETURNi;
ENDsetCellLines;
FUNCTIONsetCellFont(RANGEVARCHAR2,PropertyVARCHAR2,fontValuesBINARY_INTEGER,TYPE
VARCHAR2)RETURNBINARY_INTEGERIS
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’);
IFTYPE=’xlPie’THEN
charttype:=-4102;
ELSIFTYPE=’xl3DBar’THEN
charttype:=-4099;
ELSIFTYPE=’xlBar’THEN
charttype:=2;
ELSIFTYPE=’xl3dLine’THEN
i:=ordcom.GetProperty(RangeToken,’Font’,0,hLines);--猎取字体工具
i:=ordcom.SetProperty(hLines,Property,fontValues,TYPE);
i:=ordcom.DestroyObject(hLines);
i:=ordcom.DestroyObject(RangeToken);
RETURNi;
END;
FUNCTIONcallMethod(RANGEVARCHAR2,MethodNameVARCHAR2)RETURNBINARY_INTEGERIS
retiBINARY_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);
RETURNreti;
END;
FUNCTIONInsertChart(xposBINARY_INTEGER,yposBINARY_INTEGER,
widthBINARY_INTEGER,heightBINARY_INTEGER,
RANGEVARCHAR2,TYPEVARCHAR2)
RETURNBINARY_INTEGERIS
charttypeBINARY_INTEGER:=-4099;
BEGIN
charttype:=-4101;
ENDIF;
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);
RETURNi;
ENDInsertChart;
FUNCTIONSaveToFile(filenameVARCHAR2)RETURNBINARY_INTEGERIS
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);
ENDIF;
RETURNi;
ENDSaveToFile;
FUNCTIONCloseExcelRETURNBINARY_INTEGERIS
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);
RETURNi;
ENDCloseExcel;
ENDoraExcel;
乐成创立oraExcel包后,最初创立利用包的存储历程,完成把数据内外的字符型、日期型和数值型分离传到Excel事情内外,对数值型数据举行统计和利用Excel中的图表。该历程详细操纵步骤为:
・创立Excel工具。
・创建表头,设置列宽。
・将游标数据传到事情表。
・画表格。
・设置字体属性。
・拔出图表。
・保留为Excel格局文件,封闭Excel工具。
以下为dp_toExcel存储历程:
CREATEORREPLACEPROCEDUREdp_ToExcelIS
CURSORc1ISSELECTITS_ID,ITS_DATE,ITS_TOTALFROMIT_SALE_TAB;
nBINARY_INTEGER:=2;
iBINARY_INTEGER;
filenameVARCHAR2(255);
cellIndexVARCHAR2(40);
cellValueVARCHAR2(40);
cellColumnVARCHAR2(10);
returnedTimeVARCHAR2(20);
currencyvalueDOUBLEPRECISION;
dateValueDATE;
xlThinBINARY_INTEGER:=2;
xlEdgeLeftBINARY_INTEGER:=7;
xlEdgeTopBINARY_INTEGER:=8;
xlEdgeBottomBINARY_INTEGER:=9;
xlEdgeRightBINARY_INTEGER:=10;
xlInsideVerticalBINARY_INTEGER:=11;
xlInsideHorizontalBINARY_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;
ENDLOOP;
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;
Forc1_recINc1LOOP
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’);
SELECTTO_CHAR(SYSDATE,’HH24MISS’)INTOreturnedTimeFROMdual;
filename:=’D: estExcel’||returnedTime||’.xls’;
i:=oraExcel.SaveToFile(filename);--保留文件
i:=oraExcel.closeExcel();--封闭工具
END;
小结
本文先容怎样从PL/SQL中间接挪用C程序的内部例程,并以操纵Excel工具为示例。在挪用该内部例程时,有以下相干的限定:
・操纵体系必须撑持静态链接库(DLL)和共享库功效。
・监听器和extproc历程必需运转在数据库地点的统一台机子上,不撑持远程数据库。
・extproc独一撑持的是C例程,但能够经由过程先挪用C内部例程往利用别的工具(如:COM工具)。
除限定外,挪用内部例程会引发分外的体系资本开支,在利用内部例程之前要思索是不是必定要用到内部例程。
DBaaS并不意味着解决方案提供者要让自己失业。与其他系统一样,在实施DBaaS解决方案时,客户可能需要部署、迁移、支持、异地备份、系统集成和灾难恢复等方面的帮助。 |
|