Bonjour,
J'ai une problématique :
je voudrai lancé un fichier .ksh, qui se trouve sur un serveur distant, à partir de la base Oracle. Est-ce qu'il y a un moyen?
merci d'avance
Version imprimable
Bonjour,
J'ai une problématique :
je voudrai lancé un fichier .ksh, qui se trouve sur un serveur distant, à partir de la base Oracle. Est-ce qu'il y a un moyen?
merci d'avance
Bonjour,
Rapidement, une solution possible est la suivante :
1. Creer une librairie en C
Le source minimaliste ci-dessous :
L'extrait du makefile :Code:
1
2
3
4
5
6
7
8
9
10
11
12
13
14 #include <unistd.h> #include <string.h> #include <stdio.h> #include <stdlib.h> #include <math.h> int CommandSystem(char *); int CommandSystem( char * p_cmd) { num = system(p_cmd); return num; }
2. Declarer un objet librairie avec une fonctionCode:
1
2
3
4
5
6 OracleShell: ./OracleShell.c -@echo "Generation de la cible <OracleShell.so>..." -@cc -v -Aa -O -g -c ./OracleShell.c -o ./OracleShell.o -@ld -r -o OracleShell.so OracleShell.o -@echo "Fin generation <OracleShell.so>"
3. Mettre à jour le fichier listener.ora de l'instanceCode:
1
2
3
4
5
6
7
8
9
10
11
12 CREATE OR REPLACE LIBRARY LIB_SHELL AS '${APPLI_LIB}/OracleShell.so'; / CREATE OR REPLACE FUNCTION CommandSystem (p_Command IN CHAR) RETURN PLS_INTEGER AS EXTERNAL NAME "CommandSystem" LIBRARY LIB_SHELL LANGUAGE C PARAMETERS ( p_Command STRING); / -- Ne pas oublier les grant qui vont bien GRANT EXECUTE ...
4. demarrer le listener CALLOUT_<INSTANCE>Code:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18 CALLOUT_<INSTANCE> = (DESCRIPTION_LIST = (DESCRIPTION = (ADDRESS_LIST = (ADDRESS = (PROTOCOL = IPC)(KEY = EXTPROC)) ) ) ) SID_LIST_CALLOUT_<INSTANCE> = (SID_LIST = (SID_DESC = (SID_NAME = <INSTANCE>) (ORACLE_HOME = /u00/app/oracle/product/9.2.0) (PROGRAM = extproc32) (ENVS="EXTPROC_DLLS=ONLY:bla/bla/bla/OracleShell.so") ) )
5. Sous SQL-PLUS, on peut réaliser le test suivant :
6. Cette commande sera exécutée par le compte propriétaire du process du listener... Donc attention aux droits ... En 1er lieu, celui d'accès à la librairie "OracleShell.so" ;)Code:
1
2 exec CommandSystem("touch test");