日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當(dāng)前位置: 首頁 > 运维知识 > windows >内容正文

windows

利用oracle执行系统命令,利用oracle存储过程执行操作系统命令(转)

發(fā)布時(shí)間:2025/5/22 windows 26 豆豆
生活随笔 收集整理的這篇文章主要介紹了 利用oracle执行系统命令,利用oracle存储过程执行操作系统命令(转) 小編覺得挺不錯(cuò)的,現(xiàn)在分享給大家,幫大家做個(gè)參考.

以下方法在WINNT,LINUX下的oracle9i上測(cè)試通過,java過程調(diào)用系統(tǒng)命令

首先給使用java存儲(chǔ)過程的用戶授予一定的權(quán)限

<>表示所有文件,也可以單獨(dú)指定文件。

r w e d表示四種操作

Code:

Dbms_Java.Grant_Permission('HR',

'java.io.FilePermission', '<>',

'read ,write, execute, delete');

Dbms_Java.Grant_Permission('HR',

'java.io.FilePermission', 'd:aa.bat',

'read ,write, execute, delete');

dbms_java.grant_permission

('HR',

'java.lang.RuntimePermission',

'*',

'writeFileDescriptor' );

end;

/

PL/SQL procedure successfully completed.

See

... timePermission.html

... rityPermission.html

s/api/java/io/FilePermission.html

and

... 53/perf.htm#1001971

From the “Java Developer’s Guide”, Part No. A81353-01, Chapter 5:

Table 5?1 Permission Types

n java.util.PropertyPermission

n java.io.SerializablePermission

n java.io.FilePermission

n java.net.NetPermission

n java.net.SocketPermission

n java.lang.RuntimePermission

n java.lang.reflect.ReflectPermission

n java.security.SecurityPermission

n oracle.aurora.rdbms.security.PolicyTablePermission

n oracle.aurora.security.JServerPermission

相關(guān)的java類如下

SQL> connect hr/hr@ts

已連接。

create or replace and compile

java source named "Util"

as

import java.io.*;

import java.lang.*;

public class Util extends Object

{

public static int RunThis(String args)

{

Runtime rt = Runtime.getRuntime();

int    rc = -1;

try

{

Process p = rt.exec(args);

int bufSize = 4096;

BufferedInputStream bis =

new BufferedInputStream(p.getInputStream(), bufSize);

int len;

byte buffer[] = new byte[bufSize];

// Echo back what the program spit out

while ((len = bis.read(buffer, 0, bufSize)) != -1)

System.out.write(buffer, 0, len);

rc = p.waitFor();

}

catch (Exception e)

{

e.printStackTrace();

rc = -1;

}

finally

{

return rc;

}

}

}

/

Java created.

建立函數(shù)

create or replace

function RUN_CMD(p_cmd in varchar2) return number

as

language java

name 'Util.RunThis(java.lang.String) return integer';

/

Function created.

建立一過程調(diào)用函數(shù)

create or replace procedure RC(p_cmd in varchar2)

as

x number;

begin

x := run_cmd(p_cmd);

end;

/

Procedure created.

SQL> variable x number;

SQL> set serveroutput on

SQL> exec dbms_java.set_output(100000);

PL/SQL procedure successfully completed.

可以執(zhí)行相應(yīng)的命令和bat文件

SQL> exec :x := RUN_CMD('ipconfig');

Windows 2000 IP Configuration

Ethernet adapter 本地連接

:

Connection-specific DNS Suffix . :

IP Address. . . . . . . . . . . . : 172.18.25.102

Subnet Mask . . . . . . .

. . . . : 255.255.255.0

Default Gateway . . . . . . . . . : 172.18.25.1

PL/SQL 過程已成功完成。

也可以執(zhí)行服務(wù)器上的bat文件

SQL>  exec :x := RUN_CMD('c:aa.bat');

c:oracleora92DATABASE>cmd /c

c:oracleora92DATABASE>dir

Volume in drive C is 本地磁盤

Volume Serial Number is 5CE1-2622

Directory of c:oracleora92DATABASE

2004-05-15 15:47    .

2004-05-15 15:47    ..

2002-12-24 20:13    archive

1998-09-09 18:31        31,744 oradba.exe

2004-05-08 11:48         568 OraDim.Log

2004-03-17 11:53        1,536 PWDweblish.ora

2004-05-15 15:47      1,871,872 SNCFWEBLISH.ORA

2003-12-29 13:24        2,560 SPFILEWEBLISH.ORA

2004-05-08 11:48        12,852 sqlnet.log

6 File(s)   1,921,132 bytes

3 Dir(s)  7,141,621,760 bytes free

-----------------

c:aa.bat如下:

cmd /c

dir

以下是利用proc實(shí)現(xiàn):

在Oracle 8i中,往往會(huì)出現(xiàn)要在存儲(chǔ)過程中運(yùn)行操作系統(tǒng)命令的情況.一般來說,利用Oracle Enterprise Manager設(shè)定作業(yè)時(shí)可以達(dá)到這個(gè)目的.但是由于OEM在設(shè)定作業(yè)缺乏靈活性,設(shè)定的作業(yè)的參數(shù)是固定的.在實(shí)際應(yīng)用當(dāng)中往往需要在SQL語句當(dāng)中運(yùn)行需要隨時(shí)運(yùn)行操作系統(tǒng)命令.Oracle 8i沒有直接運(yùn)行OS命令的語句,我們可以利用DBMS_PIPE程序包實(shí)現(xiàn)這一要求.

DBMS_PIPE通過創(chuàng)建管道,可以讓至少兩個(gè)進(jìn)程進(jìn)行通信.Oracle的管道與操作系統(tǒng)的管道在概念上有相同的地方,但是在實(shí)現(xiàn)機(jī)制不同.

下面介紹實(shí)現(xiàn)具體步驟:

1 創(chuàng)建一個(gè)程序包,姑且起名叫DAEMON,SQL語句如下:

/*創(chuàng)建daemon程序包*/CREATEORREPLACEPACKAGE BODY daemonAS/*execute_system是實(shí)現(xiàn)運(yùn)行os命令的函數(shù)*/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管道發(fā)送表示命令的字符*/status :=DBMS_PIPE.SEND_MESSAGE('daemon', timeout);IFstatus<>0THENRAISE_APPLICATION_ERROR(-20010,'Execute_system: Error while sending. Status ='||status);ENDIF;

status :=DBMS_PIPE.RECEIVE_MESSAGE(pipe_name, timeout);IFstatus<>0THENRAISE_APPLICATION_ERROR(-20011,'Execute_system: Error while receiving.

Status ='||status);ENDIF;/*獲取返回結(jié)果*/DBMS_PIPE.UNPACK_MESSAGE(result);IFresult<>'done'THENRAISE_APPLICATION_ERROR(-20012,'Execute_system: Done not received.');ENDIF;

DBMS_PIPE.UNPACK_MESSAGE(command_code);

DBMS_OUTPUT.PUT_LINE('System command executed. result ='||command_code);RETURNcommand_code;ENDexecute_system;/*stop是讓daemon停止*/PROCEDUREstop(timeoutNUMBERDEFAULT10)ISstatusNUMBER;BEGINDBMS_PIPE.PACK_MESSAGE('STOP');

status :=DBMS_PIPE.SEND_MESSAGE('daemon', timeout);IFstatus<>0THENRAISE_APPLICATION_ERROR(-20030,'stop: error while sending. status ='||status);ENDIF;ENDstop;ENDdaemon;

通過Sql*Plus運(yùn)行以上語句,將為當(dāng)前用戶創(chuàng)建daemon程序包.

2 創(chuàng)建在OS上運(yùn)行的守護(hù)進(jìn)程,監(jiān)聽由上面的daemon程序包發(fā)來的要求執(zhí)行os命令的語句.以下Pro*C的代碼,必須由pro*c先進(jìn)行預(yù)編譯.

#include

#include

EXECSQL INCLUDE SQLCA;

EXECSQLBEGINDECLARESECTION;char*uid="scott/tiger";/*在這個(gè)地方改為你自己訪問的用戶,密碼,服務(wù)名*/intstatus;

VARCHARcommand[20];

VARCHARvalue[2000];

VARCHARreturn_name[30];

EXECSQLENDDECLARESECTION;

void

connect_error()

{

charmsg_buffer[512];

intmsg_length;

intbuffer_size=512;

EXECSQL WHENEVER SQLERRORCONTINUE;

sqlglm(msg_buffer,&buffer_size,&msg_length);

printf("Daemon errorwhileconnecting:n");

printf("%.*sn", msg_length, msg_buffer);

printf("Daemon quitting.n");

exit(1);

}

void

sql_error()

{

charmsg_buffer[512];

intmsg_length;

intbuffer_size=512;

EXECSQL WHENEVER SQLERRORCONTINUE;

sqlglm(msg_buffer,&buffer_size,&msg_length);

printf("Daemon errorwhileexecuting:n");

printf("%.*sn", msg_length, msg_buffer);

printf("Daemon continuing.n");

}

main()

{

EXECSQL WHENEVER SQLERROR DO connect_error();

EXECSQL CONNECT :uid;

printf("Daemon connected.n");

EXECSQL WHENEVER SQLERROR DO sql_error();

printf("Daemon waiting...n");

while(1) {

EXECSQLEXECUTEBEGIN/*接收deamon發(fā)來的字符*/: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,該進(jìn)程就退出*/IF(!strcmp((char*) command.arr, "STOP"))

{

printf("Daemon exiting.n");

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("Willexecutesystem command'%s'n", value.arr);/*運(yùn)行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

("Daemon errorwhilerespondingtosystem command.");

printf(" status:%dn", status);

}

}

ELSE{

printf

("Daemon error: invalid command'%s'received.n",

command.arr);

}

}

ELSE{

printf("Daemon errorwhilewaitingforsignal.");

printf(" status=%dn", status);

}

}

EXECSQLCOMMITWORKRELEASE;

exit(0);

}

以上代碼起名為daemon.pc,用proc預(yù)編譯:

proc iname=daemon.pc userid=用戶名/密碼@服務(wù)名 sqlcheck=semantics

得到daemon.c,在用c進(jìn)行編譯,注意在NT上要把orasql8.lib加上,否則編譯通過,連接沒法通過.

3 在服務(wù)器上運(yùn)行daemon.exe

4 在sqlplus運(yùn)行測(cè)試語句:

SQL>variable rvnumberSQL>execute:rv :=DAEMON.EXECUTE_SYSTEM('ls -la');

PL/SQL 過程已成功完成。

SQL>execute:rv :=DAEMON.EXECUTE_SYSTEM('dir');

PL/SQL 過程已成功完成。

DBMS_PIPE的用法見oracle的文檔.

總結(jié)

以上是生活随笔為你收集整理的利用oracle执行系统命令,利用oracle存储过程执行操作系统命令(转)的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網(wǎng)站內(nèi)容還不錯(cuò),歡迎將生活随笔推薦給好友。