الانتقال إلى المحتوى

Run bat file From Oracle database


mustafa76

Recommended Posts

عثرت على هذا الشرح والكود في احد المواقع ولكن لم اقم بتجريبه

Run Executable From Oracle

This is a small utility that can run an executable from PL/SQL on NT40 (>=Oracle80) or Win95 (>=Personel Oracle80). If your Oracle Server is not >=80, don't worry, dowload Personal Oracle from Oracle, install it to a normal win95 machine and then use RPC (Remote Procedure Call) from your server over a db link.

If you are on Unix and want to use something like that, please see Thomas Kyte (Guru of the Oracle Gurus). He has a solution for this on Unix using pipes. You can find and get the source from comp.databases.oracle.server newsgroup (or www.dejanews.com on Web).


create user mail identified by mail;
grant connect,resource,create library,create public synonym to mail;

CREATE OR REPLACE LIBRARY demolib IS 'c:\winnt\system32\kernel32.dll';

create or replace
function run(lpCmdLine IN varchar2, nCmdShow IN binary_integer) return binary_integer
AS EXTERNAL
NAME "WinExec"
LIBRARY demolib
CALLING STANDARD PASCAL;

create sequence lock#;
grant execute on dbms_lock to mail;

P.S. Here we have a 7.2 production and a 8.0 where-shell-function-is database, when i use RPC from 7.2 like this;
execute shell@data('dir'); -- it gives an error, but when i use values instead of defaults, like this;
execute shell@data('dir',true,false,100); -- it executes succesfully.
In my opinion, this can because of default boolean datatypes.

create or replace procedure
shell (what varchar2,llock boolean default true,show boolean default false,wait number default 100) IS
pfile utl_file.file_type;
d binary_integer;
dummy varchar2(20);
ok boolean:=false;
ploop number:=0;
plock# number;
ndumm number;
begin
if llock then
select lock#.nextval into plock# from dual;
loop
select count(*)
into ndumm
from v$session
where to_number(substr(client_info,instr(client_info,'-')+1))<plock# and
client_info is not null;

pfile:=utl_file.fopen('c:\mail\','shell.ok','r');
utl_file.get_line(pfile,dummy);
utl_file.fclose(pfile);

if substr(dummy,1,1)='O' and ndumm=0 then
pfile:=utl_file.fopen('c:\mail\','shell.ok','w');
utl_file.put_line(pfile,to_char(plock#));
utl_file.fclose(pfile);

ok:=true;
else
ploop:=ploop+1;
if ploop > wait then
raise_application_error(-20000,'Try again later');
else
dbms_application_info.set_client_info('Waiting for ' || to_char(ploop) || ' secs - ' || to_char(plock#));
dbms_lock.sleep(ploop);
dbms_application_info.set_client_info(null);
end if;
end if;

exit when ok;
end loop;
pfile:=utl_file.fopen('c:\mail\','shell.ok','r');
utl_file.get_line(pfile,dummy);
utl_file.fclose(pfile);
if plock#<>to_number(dummy) then
raise_application_error(-20999,'Conflict ! Try again');
end if;
end if;
if show then
d:=1;
else
d:=0;
end if;
-- pfile:=utl_file.fopen('c:\mail\','shell.bat','w'); for Win95
pfile:=utl_file.fopen('c:\mail\','shell.bat','w'); --for NT

utl_file.put_line(pfile,what);
utl_file.put_line(pfile,'echo O> c:\mail\shell.ok');
utl_file.put_line(pfile,'echo ' || what || '(' || to_char(sysdate,'dd/mm/yyyy hh24:mi:ss') || ')' || '>> c:\mail\shell.log');
utl_file.put_line(pfile,'exit');
utl_file.fclose(pfile);

-- d:=run('c:\mail\shell.bat',d); for Win95
d:=run('c:\mail\shell.cmd',d); --for WinNT
end;
/
create public synonym shell for mail.shell;
grant all on shell to public;



http://www.geocities.com/ohakano/htmls/utilities.htm

رابط هذا التعليق
شارك

انضم إلى المناقشة

يمكنك المشاركة الآن والتسجيل لاحقاً. إذا كان لديك حساب, سجل دخولك الآن لتقوم بالمشاركة من خلال حسابك.

زائر
أضف رد على هذا الموضوع...

×   Pasted as rich text.   Paste as plain text instead

  Only 75 emoji are allowed.

×   Your link has been automatically embedded.   Display as a link instead

×   تمت استعادة المحتوى السابق الخاص بك.   مسح المحرر

×   You cannot paste images directly. Upload or insert images from URL.

جاري التحميل
×
×
  • أضف...

برجاء الإنتباه

بإستخدامك للموقع فأنت تتعهد بالموافقة على هذه البنود: سياسة الخصوصية