仓酷云

 找回密码
 立即注册
搜索
热搜: 活动 交友 discuz
查看: 542|回复: 8
打印 上一主题 下一主题

[学习教程] MYSQL网页编程之Oracle中利用PL/SQL操纵COM工具

[复制链接]
金色的骷髅 该用户已被删除
跳转到指定楼层
楼主
发表于 2015-1-16 22:25:51 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式

马上注册,结交更多好友,享用更多功能,让你轻松玩转社区。

您需要 登录 才可以下载或查看,没有帐号?立即注册

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解决方案时,客户可能需要部署、迁移、支持、异地备份、系统集成和灾难恢复等方面的帮助。
因胸联盟 该用户已被删除
沙发
发表于 2015-1-19 11:48:46 | 只看该作者
现在是在考虑:如果写到服务器端,我一下搞他个10个存储过程导过去,那久之服务器不就成垃圾箱了吗?即便优化了我的中间层.
变相怪杰 该用户已被删除
板凳
发表于 2015-1-25 19:48:02 | 只看该作者
从项目平台的选择上讲,我们关心的,应该是一款产品能不能满足任务需求,而不是网上怎么说。
只想知道 该用户已被删除
地板
发表于 2015-2-3 19:46:47 | 只看该作者
然后最好有实践机会,能够把实践到的和实践结合起来,其实理论思考是个非常困扰和痛苦的事情
海妖 该用户已被删除
5#
发表于 2015-2-9 04:47:42 | 只看该作者
其中最有名的应该是row_number了。这个终于解决了用临时表生成序列号的历史,而且SQLServer2005的row_number比Oracle的更先进。因为它把Orderby集成到了一起,不用像Oracle那样还要用子查询进行封装。
精灵巫婆 该用户已被删除
6#
发表于 2015-2-26 23:57:01 | 只看该作者
始终遗憾SQLServer的登陆无法分配CPU/内存占用等指标数。如果你的SQLServer给别人分配了一个只可以读几个表的权限,而这个家伙疯狂的死循环进行连接查询,会给你的系统带来很大的负担。
若天明 该用户已被删除
7#
发表于 2015-3-8 18:40:18 | 只看该作者
你可以简单地认为适合的就是好,不适合就是不好。
金色的骷髅 该用户已被删除
8#
 楼主| 发表于 2015-3-16 11:03:43 | 只看该作者
如果是将来做数据库的开发设计,就应该详细学习T-SQL的各种细节,包括T-SQL的程序设计、存储过程、触发器以及具体使用某个开发语言来访问数据库。
莫相离 该用户已被删除
9#
发表于 2015-3-22 22:33:11 | 只看该作者
在select语句中可以使用groupby子句将行划分成较小的组,然后,使用聚组函数返回每一个组的汇总信息,另外,可以使用having子句限制返回的结果集。
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

QQ|Archiver|手机版|仓酷云 鄂ICP备14007578号-2

GMT+8, 2024-11-16 08:10

Powered by Discuz! X3.2

© 2001-2013 Comsenz Inc.

快速回复 返回顶部 返回列表