Host Command from PL/SQL
Hi,
We use JAVA source in Oracle to execute some unix commands directly from within stored procedures in Oracle.
Our Java source looks like this :
CREATE OR REPLACE AND RESOLVE JAVA SOURCE NAMED "HOST" AS
import java.lang.*;
import java.io.*;
public class Host
public static void executeCommand (String command, String etype) throws IOException
String[] wFullCommand = {"C:\\winnt\\system32\\cmd.exe", "/y", "/c", command};
String[] uFullCommand = {"/bin/sh", "-c", command};
if (etype.toUpperCase().equals("W"))
Runtime.getRuntime().exec(wFullCommand);
else if(etype.toUpperCase().equals("U+"))
Runtime.getRuntime().exec(uFullCommand);
else if(etype.toUpperCase().equals("U"))
Runtime.getRuntime().exec(command);
CREATE OR REPLACE PROCEDURE Host_Command (p_command IN VARCHAR2, p_etype IN VARCHAR2)
AS LANGUAGE JAVA
NAME 'Host.executeCommand (java.lang.String, java.lang.String)';
We call one unix shell script and discover that some UNIX commands from this shell script are executed and others not. A cp & touch command don't give problems whilst cat & unix2dos commands don't function.
Can anybody help me on this subject?
Thanks !
Kris
Thanks for your reactions. Got it to work with the unix scripts, the problem was a syntax error in the script itself.
However I don't get it to function when I try to run a unix command directly. Normally the parameter U+ should decide to start it in a shell for scripts and otherwise it should run the command directly. (whithout the /bin/sh in front of it).
I already adapted my source to try to execute the command in a new shell but without success :
String[] uFullCommand = {"/bin/sh", "-c", "\'cp /export/home/caluwaek/test/bestand2 /export/home/caluwaek/test/bestand8\'"};
I tried to put the whole command in one string, in 3 strings, to just call the cp command without bothering the shell. Nothing seems to work.
In unix both the following work :
cp /export/home/caluwaek/test/bestand2 /export/home/caluwaek/test/bestand8
and
/bin/sh -c 'cp /export/home/caluwaek/test/bestand2 /export/home/caluwaek/test/bestand8'
Thanks for your help!
Kris
Similar Messages
-
Run OS command from Pl/SQL
Is there any way to execute an OS command from pl/sql other than using dbms_pipe & pro*C combo. I have done this way before but it seems there is built-in oracle package which can do this in 8/8i.
Also HOST command in forms will execute the OS coomand from the clinet. Is there any way to execute the OS command on the server from the forms clinet?
thanks,
Ravi.
nullRavi,
Can you send me an example how one can
execute a this command from a PL/SQL
program 'sed 3q /etc/passwd'.
Please write to me at
[email protected]
thanks
Pramod -
Host command in PL/SQL Package
Hi,
How is it possible to launch a host command from a PL/SQL package without Pro*C nor Java ?
Hope it's possible, 'cos Java is not available here and Pro*C has some^problems that the DBA cqn't solve...
Could you please answer at [email protected]
Thanks in advance !Hi Thomas,
You can call external progs within PlSql.
You have to
- Configure Tnsnames.ora aned listener.ora on the server
with the 'extproc' entry
- Have an external proc in a DDL on NT (or .so on unix)
- Create a libray pointing on this .so file with 'Create library'
- Declare a PlSql proc calling your external proc in the library
And then you will use your PlSql proc within your package.
It's fastidious but it works.
Mbo -
A HOST command in PL/SQL?
Hello guys! :)
I need to execute some SFTP commands on the database server to another SFTP server. In oracle forms theres a built in called "HOST" which executes native commands on the server. Is there something similar to that in PL/SQL?
Also, im wondering of each call of the "HOST" command opens a new session in CMD. I'll need to log in, submit files, and retrieve files as well. If the HOST command opens a new session everytime, ill lose the login credentials from the first HOST command.
Anyone know of anything like this thats been done before? Let me know. Thanks.
MoDuplicate thread
SFTP in PL/SQL
Please do not repost if the prior answers don't suit you.
The answer to your question is obviously there is no HOST command in PL/SQL, as there has never been a HOST command, as Oracle happens to be a RDBMS.
You could use the external procedure facility, you could also call Java.
Tom Kyte has an utility for this on http://asktom.oracle.com, called run_cmd
Sybrand Bakker
Senior Oracle DBA -
Am calling the sql loader (sqlldr73) using HOST command from D2K Forms 4.5.
my code has following sequence,
<sequence of stmts 1>
Host(....);
<sequence of stmts 2>
the stmts(<sequence of stmts 2>) following the call to HOST commant should be executed only after successful execution of the sql loader.
curently the sql loader and stmts(<sequence of stmts 2>) are running parallely
Is there any work around?Hi,
Better way to do it would be to write a batch / shell script with the sequence of statements you want to execute and call the batch file using the host command.
Regards,
Arun -
Running sqlldr command from PL/SQL Block
DECLARE
BEGIN
END;In SQL * plus we can run DOS commands using the following command
HOST DIR
HOST DIR/P
But When we can't run the HOST command in PL/SQL Block..
I have to Run sqlldr command from PL/SQL Block..
i tried as follows
DECLARE
BEGIN
EXECUTE IMMEDIATE ' host sqlldr control= bad= ';
END;
By
BalaNagaRaju -
Fire OMB Plus commands from PL/SQL
Hi all,
does anyone know if it is possible to fire OMB Plus commands from PL/SQL procedures?
I can imagine that there might be a PL/SQL package in the repository owner schema that accepts OMB Plus commands as strings...or something similar...
Thanks,
ElioHi Elio
I don't know about any existing package that could do that.
What I'd suggest is to build a stored procedure/function/package that could do that. Or even, execute OMB Scripts in the host from a pl/sql program.
Good luck.
Regards,
Marcos -
Call HOST cmd from PL/SQL Block
Hi ,
I'm trying to call the HOST command from stored procedure
declare
cmd varchar2(100):='c:\file.bat';
begin
execute immediate 'host('c:\file.bat')';
dbms_output.put_line('Executed');
end;
but,It gives an error msg on execute immediate stmt.
Plz resolve this problem.
Rgrds,
AnandYou are confusing SQL*Plus's command (a client) with that of PL/SQL.
Just as you cannot code C# commands, or Perl commands, or PHP commands in PL/SQL, you cannot code SQL*Plus commands in PL/SQL.
SQL*Plus runs on your client platform. It has a couple of commands.
PL/SQL is a server side programming language. This runs inside the Oracle server process servicing the client.
This server process does not know your client language commands. Nor can this server process hack across the network, break into your computer, and access your local file called c:\file.bat.
Yes, you can execute server o/s commands and execute server programs from PL/SQL via a Java stored procedure or via the EXTPROC interface. Refer to the sample code in [url http://forums.oracle.com/forums/thread.jspa?messageID=1439836#1439836]this thread on how to call server o/s commands and server programs. -
O/s commands from PL/SQL
hi all..
i want to execute operating system commands from PL/SQL..
particulary imp command....
i have used the f/wg approach but while i execute the imp command it does not responds me any output..
I have to kill the process from o/s.
prodn is my user
--AS SYS user
begin
dbms_java.grant_permission( 'PRODN',
'SYS:java.io.FilePermission',
'/oracle/product/9.2.0/bin/imp',
'execute' );
dbms_java.grant_permission
('PRODN',
'java.lang.RuntimePermission',
'writeFileDescriptor' );
end;
---------------------------------AS PRODN user
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;
create or replace
function RUN_CMD(p_cmd in varchar2) return number
as
language java
name 'Util.RunThis(java.lang.String) return integer';
create or replace procedure RC(p_cmd in varchar2)
as
x number;
begin
x := run_cmd(p_cmd);
end;
i executed the command as follows in sql>
BEGIN
rc('/oracle/product/9.2.0/bin/imp tim/tim file=/home/oracle/vas4359.dmp log
=log1.log');
END;
it runs fine creates log1.log in / home/oracle but there is no output in
log1.log file.
I have to kill the process as follows after which sql> displays me :
"PL/SQL procedure successfully completed."
[oracle@msebdb oracle]$ ps aux|grep imp
oracle 20052 0.0 0.2 12732 4328 ? S 11:57 0:00 /oracle/product/
.2.0/bin/imp file=/home/oracle/vas4359.dmp log=log1.log
oracle 20102 0.0 0.0 3692 652 pts/2 S 12:03 0:00 grep imp
Note:There is no tim user.. i just want to get error in my log file..
my further steps are to read this log file and send email/notifications to users.
my main program is as f/ws:
/*imp and check log file*/
create or replace procedure abc
as
v_exists boolean;
v_exists_log boolean;
ex_open BOOLEAN;
flen NUMBER;
bsize NUMBER;
vInHandle_open utl_file.file_type;
vInHandle_open_log utl_file.file_type;
v_filelog utl_file.file_type;
v_fl utl_file.file_type;
v_pth varchar2(60);
v_fnm varchar2(60);
v_file_exists varchar2(60);
v_logline varchar2(30) ;
v_search varchar2(30) :='ORA-';
vNewLine VARCHAR2(32767);
cursor c_fname is
select full_pth ,f_name from upld_file_t where f_name in
(select f_name from tbl_file_nm where typ_file='D' AND DEL_FLG='N');
BEGIN
for v_sec in c_fname
loop
utl_file.fgetattr(LOCATION=>'ORALOAD',
FILENAME=>v_sec.f_name,
FEXISTS=>v_exists,
FILE_LENGTH=> flen,
BLOCK_SIZE=>bsize);
if v_exists
THEN
dbms_output.put_line('File Exists' || v_sec.f_name);
v_file_exists:=v_sec.f_name;
--dbms_output.put_line('v_file_exists ' || v_file_exists);
dbms_output.put_line('File Length: ' || TO_CHAR(flen));
dbms_output.put_line('Block Size: ' || TO_CHAR(bsize));
dbms_output.put_line(' before file open');
vInHandle_open := utl_file.fopen('ORALOAD',v_sec.f_name,'R',32767);
-- dbms_output.put_line(' after file open');
-- do whater with teh file data
v_fl:=utl_file.fopen('ORALOAD','v_sec.f_name','W');
dbms_output.put_line('v_sec.f_name');
IF utl_file.is_open(vInHandle_open)
THEN
/*if log file exists..*/
utl_file.fgetattr(LOCATION=>'ORALOAD',
FILENAME=>v_sec.f_name||'.log',
FEXISTS=>v_exists_log,
FILE_LENGTH=> flen,
BLOCK_SIZE=>bsize);
if v_exists_log
then
dbms_output.put_line('file' ||v_sec.f_name||'.log');
v_filelog :=utl_file.fopen('ORALOAD',v_sec.f_name||'.log','W',32767);
LOOP
BEGIN
UTL_FILE.PUT(v_filelog,'ORA-');
exit;
END;
END LOOP;
else
dbms_output.put_line('File not found' || v_sec.f_name);
END IF;
UTL_FILE.fclose(v_filelog);
dbms_output.put_line('Closed File ' || v_sec.f_name|| '.log');
END IF;
/*imp THE FILE and read log file*/
utl_file.fgetattr(LOCATION=>'ORALOAD',
FILENAME=>v_sec.f_name||'.log',
FEXISTS=>v_exists_log,
FILE_LENGTH=> flen,
BLOCK_SIZE=>bsize);
if v_exists_log
then
dbms_output.put_line('file' ||v_sec.f_name||'.log');
v_filelog :=utl_file.fopen('ORALOAD',v_sec.f_name||'.log','R',32767);
LOOP
BEGIN
UTL_FILE.get_line(v_filelog,v_logline);
if v_logline = v_search then
dbms_output.put_line(v_logline);
end if;
UTL_FILE.fclose(v_filelog);
dbms_output.put_line('Closed File ' || v_sec.f_name|| '.log');
exit;
END;
END LOOP;
else
dbms_output.put_line('File not found' || v_sec.f_name);
END IF;
END IF;
END LOOP;
--close the curosr .. check this
EXCEPTION
WHEN UTL_FILE.ACCESS_DENIED THEN
DBMS_OUTPUT.PUT_LINE('No Access!!!');
when others then
dbms_output.put_line('ERROR (open_file) => '||sqlcode);
dbms_output.put_line('MSG (open_file) => '||sqlerrm);
end;Hi,
You might have better luck in the PL/SQL or Java forums. They are located here:
PL/SQL: PL/SQL
Java: http://forums.oracle.com/forums/forum.jsp?forum=99
Good luck,
Mark -
Is it possible to run host command from SAP environment? How do you run?
Hi
Is it possible to run host command from SAP environment? How do you run?
Thank YouHello Subhash
You will more details in the following thread:
Re: How to define command for SXPG_COMMAND_EXECUTE
Regards
Uwe -
Calling Operating System Commands from PL/SQL using java
Calling Operating System Commands from PL/SQL - The Java Way
wlth help of given thread link,
Calling OS Commands from Plsql
but i had user privilege problem
Declare
x Varchar2(2000);
Begin
x := OSCommand_Run('/tmp/sri/GROUP_ho.sh');
DBMS_OUTPUT.Put_Line(x);
End;
o/p;
can't exec: /tmp/sri/GROUP_ho.sh lacks user privilege
i done the grant privillage also
part
dbms_java.grant_permission('abcd', 'SYS:java.lang.RuntimePermission', 'writeFileDescriptor', '');
dbms_java.grant_permission('abcd', 'SYS:java.lang.RuntimePermission', 'readFileDescriptor', '');
dbms_java.grant_permission('
abcd', 'SYS:java.io.FilePermission','<<ALL FILES>>', 'execute');
again
get
can't exec: /tmp/sri/GROUP_ho.sh lacks user privilege
same error;Process management at the OS level should prevent execution continuing in the calling code until the command has completed (either successfully or with error).
If the low level java code were to spawn child process threads then execution could continue, but I'm guessing the Java function your talking about doesn't do that and just calls the operating system to execute the command and waits for the returning code to come back. -
How to: execute operating system commands from PL/SQL
System: IBM pSeries AIX
Oracle: 11g Enterprise
Is there a quick way to execute operating system commands from PL/SQL?
Without creating a JAVA class....
I need to execute a Loader script.
I want to do this from within PL/SQL.
I need to to do 4 things.
Three require SQL scripts.
The fourth is SQL*Loader.
The usual way is with a UNIX script calling 3 SQL scripts and one Loader control file.
Is there way to do all this from within ONE PL/SQL SCRIPT ??
Just let me know.Is there a quick way to execute operating system commands from PL/SQL?
NO
Without creating a JAVA class....
I need to execute a Loader script.
I want to do this from within PL/SQL.
WHY ON EARTH, such action will create a new connection and become a resource hog?
I need to to do 4 things.
Three require SQL scripts.
The fourth is SQL*Loader.
The usual way is with a UNIX script calling 3 SQL scripts and one Loader control file.
Which is perfect for the purpose.
Is there way to do all this from within ONE PL/SQL SCRIPT ??
Just let me know.
NO, there is NOT. Nor should there be. Why create unstable ineffcient Mickey Mouse systems, glued together by hacking?
Sybrand Bakker
Senior Oracle DBA -
Calling SQL Loader using HOST command from Developer Forms 4.5
I want to execute a set of code from D2K Forms 4.5 which has interfface with Client - OS ( In my case Windows NT/XP). I want to execute SQL Loader from Forms using Host Command and then after completion of that process, I want to do next transcations ( depending upond success of HOST/SQL Loader).
How to achive this?
I tried writing code like this ...
l_vc_command := 'sqlldr73'
||' USERID='||l_vc_username||'/'||l_vc_password||'@'||l_vc_connect_string
||' CONTROL='||l_vc_filepath||'Upload.ctl'
||' DATA='||LTRIM(RTRIM(l_vc_fileloc))
||' LOG='||l_vc_filepath|| l_vc_log_file || '_' || l_dt_sysdate_str ||'.log'
||' BAD='||l_vc_filepath|| l_vc_bad_file || '_' || l_dt_sysdate_str ||'.bad'
||' DISCARD='||l_vc_filepath|| l_vc_discard_file || '_' || l_dt_sysdate_str ||'.dsc';
HOST(l_vc_command,NO_PROMPT);
After this command i want to do some other code execution. so even if it fails or success, next code is executed. How to control this?
Please help..
Regards,
MilindForms6i running on W2000, Rdbms 8.1.7
in Forms I added a button TEST,
Trigger when-button-pressed : host('test.bat') ;
in directory .......\frm I added file test.bat :
REM ===============
cd /d C:\........\ldr
pause
sqlldr parfile=test.par
pause
type test.log
pause
exit
REM ================
now, pressing TEST button opens DOS window, telling me what's going on, running sqlldr, finally going back to forms
Are you using NO_PROMPT or NO_SCREEN option of HOST command ?
Had a look at Forms 4.5 manuals, there is no mentioning of (a)synchronously operation in connection with HOST command. -
Host command from sqlplus based on a condition
I am on an Oracle 10.2.0.3.0 database running on sun solaris.
Am using my sqlplusw on my windows xp professional to do the below :
SQL> select * from v$version;
BANNER
Oracle Database 10g Enterprise Edition Release 10.2.0.3.0 - 64bi
PL/SQL Release 10.2.0.3.0 - Production
CORE 10.2.0.3.0 Production
TNS for Solaris: Version 10.2.0.3.0 - Production
NLSRTL Version 10.2.0.3.0 - Production
I have 4 variables declared in sqlplus for which I get my values from anonymous pl/sql blocks :
print db1_status;
DB1_STATUS
3
print db2_status;
DB2_STATUS
0
print db3_status;
DB3_STATUS
1
print db4_status;
DB4_STATUS
0
I needed some help with doing this :
Based on the values of each these variables, I wanted to invoke the host command to run stuff like
if db1_status = 3 then
host ...something
if db2_status = 0 then
host ...something
I am looking for a way to do this without creating an external procedure or java stored programs. Are there any?
ThanksNeed to use a batch file (.bat) to utilize SQL Plus while generating the SQL statements within the .bat file.
Example:
Inside SQL Plus
SQL> create table testme (name varchar2(255), value number(5));
Table created.
SQL> insert into testme(name, value) values ('db1_status', 3);
1 row created.
SQL> insert into testme(name, value) values ('db2_status', 0);
1 row created.Create a .bat file (Using test.bat)
test.bat
@echo off
echo select value from testme where name = 'db1_status';>temp.sql
echo exit >> temp.sql
sqlplus -S %2/%3@%1 @temp.sql > result.dat
for /f %%x in ('more result.dat') do set RESULT=%%x
if "%RESULT%" == "3" goto :DB1_STATUS_3
if not "%RESULT%" == "3" goto :DB1_STATUS_NOT_3
goto :EOF
:DB1_STATUS_3
echo db1_status = 3
**ENTER SYS COMMANDS HERE**
goto :EOF
:DB1_STATUS_NOT_3
echo db1_status != 3
**ENTER SYS COMMANDS HERE**
goto :EOF
echo select value from testme where name = 'db2_status';>temp.sql
echo exit >> temp.sql
sqlplus -S %2/%3@%1 @temp.sql > result.dat
for /f %%x in ('more result.dat') do set RESULT=%%x
if "%RESULT%" == "0" goto :DB2_STATUS_0
if not "%RESULT%" == "0" goto :DB2_STATUS_NOT_0
goto :EOF
:DB2_STATUS_0
echo db2_status = 0
**ENTER SYS COMMANDS HERE**
goto :EOF
:DB2_STATUS_NOT_0
echo db2_status != 0
**ENTER SYS COMMANDS HERE**
goto :EOF
:EOF
del temp.sql
del result.dat
@echo onAs you can see, this is a simple if/then which takes the value from a dynamically created SQL file (temp.sql) and uses it do determine the next system commands to execute.
Hope this is what ya needed.
-Tim -
How to simulate HOST command from DB Procedure
Hi,
I'm using Oracle 9.2 database on Win2000 PC.
I need to start .bat file from a database procedure. More generaly how to simulate HOST command that I'm using from Forms6i.
Thanks,Thanks for the reply,
But, I am able to successffuly execute HOST from SQL+
only from the PC where the database is, not from the client. My .bat file is on the server side.
From the procedure I was not able to run it in either cases
Procedure TEST
IS
BEGIN
EXECUTE IMMEDIATE 'host C:\MYBATCHFILE.BAT'
END;
returns ORA-00900 INVALID SQL STATMENT
with EXECUTE IMMEDIATE '$ C:\MYBATCHFILE.BAT' returns Invalid Character Error.
BR,
Maybe you are looking for
-
Mail program not recieiving messages, but I can send. I use .Mac to get mai
My Mail program is not receiving messages all of a sudden. But I can send. I have to get my mail at .Mac. Just tried fixing permissions. No luck yet. I just sent myself an email and it came into .Mac but not to my Mail program. What have I done? Powe
-
TIme Machine will not back up to External Hard Drive
I reinstalled Snow Leopard on my Mac Mini after having some issues. After reinstallation, Time Machine would no longer backup to my External HD because it will not allow me to change permissions. I right click on my "Backup" drive and change the perm
-
Can you add a task or reminder to calendar from reminders app?
i am trying to add a task from the reminders app on my iphone to the calendar app. i haven't figured out how to do this so far. is it possible?
-
Write back to BW cube through HANA Stored Procedure?
Hi , I am looking for a way to write back to BW cube using HANA stored Procedure and not use the traditional approach where we fetch the data as output using stored procedure and write that to BW cube using traditional write back approach . Is it pos
-
One of our laptops keep crashing indesign and illustrator all the time on windows 8. Viallisen sovelluksen nimi: InDesign.exe, versio: 9.2.2.103, aikaleima: 0x537279c1 Viallisen moduulin nimi: AdobePSL.dll, versio: 14.0.0.31988, aikaleima: 0x5272de8e