|
马上注册,结交更多好友,享用更多功能,让你轻松玩转社区。
您需要 登录 才可以下载或查看,没有帐号?立即注册
x
珍贵的资金可以用于其他业务的启动,诸如市场、广告或调研和开发等。oracle在Oracle8i中,常常会呈现要在存储过程当中运转操纵体系命令的情形.一样平常来讲,使用OracleEnterpriseManager设定功课时能够到达这个目标.可是因为OEM在设定功课缺少天真性,设定的功课的参数是流动的.在实践使用傍边常常必要在SQL语句傍边运转必要随时运转操纵体系命令.Oracle8i没有间接运转OS命令的语句,我们能够使用DBMS_PIPE程序包完成这一请求.DBMS_PIPE经由过程创立管道,可让最少两个历程举行通讯.Oracle的管道与操纵体系的管道在观点上有不异的中央,可是在完成机制分歧.上面先容完成详细步骤:1创立一个程序包,临时起名叫DAEMON,SQL语句以下:/*创立daemon程序包*/CREATEORREPLACEPACKAGEBODYdaemonAS/*execute_system是完成运转os命令的函数*/FUNCTIONexecute_system(commandVARCHAR2,timeoutNUMBERDEFAULT10)RETURNNUMBERISstatusNUMBER;resultVARCHAR2(20);command_codeNUMBER;pipe_nameVARCHAR2(30);BEGINpipe_name:=DBMS_PIPE.UNIQUE_SESSION_NAME;DBMS_PIPE.PACK_MESSAGE(SYSTEM);DBMS_PIPE.PACK_MESSAGE(pipe_name);DBMS_PIPE.PACK_MESSAGE(command);/*向daemon管道发送暗示命令的字符*/status:=DBMS_PIPE.SEND_MESSAGE(daemon,timeout);IFstatus0THENRAISE_APPLICATION_ERROR(-20010,Execute_system:Errorwhilesending.Status=||status);ENDIF;status:=DBMS_PIPE.RECEIVE_MESSAGE(pipe_name,timeout);IFstatus0THENRAISE_APPLICATION_ERROR(-20011,Execute_system:Errorwhilereceiving.Status=||status);ENDIF;/*猎取前往了局*/DBMS_PIPE.UNPACK_MESSAGE(result);IFresultdoneTHENRAISE_APPLICATION_ERROR(-20012,Execute_system:Donenotreceived.);ENDIF;DBMS_PIPE.UNPACK_MESSAGE(command_code);DBMS_OUTPUT.PUT_LINE(Systemcommandexecuted.result=||command_code);RETURNcommand_code;ENDexecute_system;/*stop是让daemon中断*/PROCEDUREstop(timeoutNUMBERDEFAULT10)ISstatusNUMBER;BEGINDBMS_PIPE.PACK_MESSAGE(STOP);status:=DBMS_PIPE.SEND_MESSAGE(daemon,timeout);IFstatus0THENRAISE_APPLICATION_ERROR(-20030,stop:errorwhilesending.status=||status);ENDIF;ENDstop;ENDdaemon;经由过程Sql*Plus运转以上语句,将为以后用户创立daemon程序包.2创立在OS上运转的保卫历程,监听由下面的daemon程序包发来的请求实行os命令的语句.以下Pro*C的代码,必需由pro*c先辈行预编译.#include#includeEXECSQLINCLUDESQLCA;EXECSQLBEGINDECLARESECTION;char*uid="scott/tiger";/*在这个中央改成你本人会见的用户,暗码,服务名*/intstatus;VARCHARcommand[20];VARCHARvalue[2000];VARCHARreturn_name[30];EXECSQLENDDECLARESECTION;voidconnect_error(){charmsg_buffer[512];intmsg_length;intbuffer_size=512;EXECSQLWHENEVERSQLERRORCONTINUE;sqlglm(msg_buffer,&buffer_size,&msg_length);printf("Daemonerrorwhileconnecting:
");printf("%.*s
",msg_length,msg_buffer);printf("Daemonquitting.
");exit(1);}voidsql_error(){charmsg_buffer[512];intmsg_length;intbuffer_size=512;EXECSQLWHENEVERSQLERRORCONTINUE;sqlglm(msg_buffer,&buffer_size,&msg_length);printf("Daemonerrorwhileexecuting:
");printf("%.*s
",msg_length,msg_buffer);printf("Daemoncontinuing.
");}main(){EXECSQLWHENEVERSQLERRORDOconnect_error();EXECSQLCONNECT:uid;printf("Daemonconnected.
");EXECSQLWHENEVERSQLERRORDOsql_error();printf("Daemonwaiting...
");while(1){EXECSQLEXECUTEBEGIN/*吸收deamon发来的字符*/:status:=DBMS_PIPE.RECEIVE_MESSAGE(daemon);IF:status=0THEN/*掏出字符*/DBMS_PIPE.UNPACK_MESSAGE(:command);ENDIF;END;END-EXEC;IF(status==0){command.arr[command.len]= ;/*假如是stop,该历程就加入*/IF(!strcmp((char*)command.arr,"STOP")){printf("Daemonexiting.
");break;}ELSEIF(!strcmp((char*)command.arr,"SYSTEM")){EXECSQLEXECUTEBEGINDBMS_PIPE.UNPACK_MESSAGE(:return_name);DBMS_PIPE.UNPACK_MESSAGE(:value);END;END-EXEC;value.arr[value.len]= ;printf("Willexecutesystemcommand%s
",value.arr);/*运转os命令*/status=system(value.arr);EXECSQLEXECUTEBEGINDBMS_PIPE.PACK_MESSAGE(done);DBMS_PIPE.PACK_MESSAGE(:status);:status:=DBMS_PIPE.SEND_MESSAGE(:return_name);END;END-EXEC;IF(status){printf("Daemonerrorwhilerespondingtosystemcommand.");printf("status:%d
",status);}}ELSE{printf("Daemonerror:invalidcommand%sreceived.
",command.arr);}}ELSE{printf("Daemonerrorwhilewaitingforsignal.");printf("status=%d
",status);}}EXECSQLCOMMITWORKRELEASE;exit(0);}以上代码起名为daemon.pc,用proc预编译:prociname=daemon.pcuserid=用户名/暗码@服务名sqlcheck=semantics失掉daemon.c,在用c举行编译,注重在NT上要把orasql8.lib加上,不然编译经由过程,毗连没法经由过程.3在服务器上运转daemon.exe
4在sqlplus运转测试语句:SQL>variablervnumberSQL>execute:rv:=DAEMON.EXECUTE_SYSTEM(ls-la);PL/SQL历程已乐成完成。SQL>execute:rv:=DAEMON.EXECUTE_SYSTEM(dir);PL/SQL历程已乐成完成。SQL>DBMS_PIPE的用法见oracle的文档.一些典型的RDBMS功能并不总是在DBaaS系统中可用。例如MySQL学习教程,WindowsAzureSQLDatabase(以前的SQLAzure)是微软的DBaaS产品,提供了一个类似于SQLServer的数据库平台。 |
|