IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

 Oracle Discussion :

Sleep dans un morceau de code !


Sujet :

Oracle

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre averti
    Homme Profil pro
    Développeur JAVA/PHP
    Inscrit en
    Mai 2008
    Messages
    61
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Rhône (Rhône Alpes)

    Informations professionnelles :
    Activité : Développeur JAVA/PHP

    Informations forums :
    Inscription : Mai 2008
    Messages : 61
    Par défaut Sleep dans un morceau de code !
    Bonjour,

    Pour un besoin spécifique, j'ai besoin de réaliser une connexion via oracle, de lancer une commander (pour faire sonner un téléphone) puis lancer la commande de fin de sonnerie après un certain temps (X secondes).

    Je ne sais pas comment patienter j'avoue... J'ai recherché sur le net mais j'ai trouvé des solutions avec des loops toutes plus sales les unes que les autres...

    Je vous donne mon morceau de code exemple (Ne cherchez pas les erreurs, ce n'est qu'un exemple, je ne cherche que le morceau de code à mettre à la place de ##### Sleep ##### ...)



    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
     
    BEGIN
    	CONNECTION    :=
    		UTL_TCP.OPEN_CONNECTION (REMOTE_HOST => ADRESSE_IP, REMOTE_PORT => PORT,
    									 TX_TIMEOUT => TIME_OUT);
    	EXCEPTION
    		WHEN OTHERS THEN
    			ERROR    := 1;
    			BOITIER.LOG ('Impossible de se connecter' || ADRESSE_IP || ':'
    							 || PORT);
    			BOITIER.LOG (SQLERRM);
    END;
     
     
    IF ERROR <> 1 THEN
    	BEGIN
    		RET_VAL           := UTL_TCP.WRITE_LINE (CONNECTION, P_MESSAGE);
    		BOITIER.LOG ('RET_VAL=''' || RET_VAL || '''');
    		RETOUR   := UTL_TCP.GET_LINE (CONNECTION, TRUE);
    	EXCEPTION
    		WHEN OTHERS THEN
    			ERROR    := 1;
    			BOITIER.LOG ('Erreur d''ecriture sur le canal TCP '
    							 || ADRESSE_IP
    							 || ':'
    							 || PORT);
    			BOITIER.LOG (SQLERRM);
    	END;
     
     
    	##### Sleep #####
     
    	UTL_TCP.CLOSE_CONNECTION (CONNECTION);
    END IF;
    Merci d'avance pour l'aide

  2. #2
    Membre expérimenté
    Homme Profil pro
    Administrateur de base de données
    Inscrit en
    Mai 2012
    Messages
    127
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Administrateur de base de données

    Informations forums :
    Inscription : Mai 2012
    Messages : 127
    Par défaut
    Bonjour,

    La procédure qu'il vous faut est DBMS_LOCK.SLEEP

    N'oubliez pas d'accorder à l'utilisateur le droit d'exécuter le package DBMS_LOCK

  3. #3
    Membre averti
    Homme Profil pro
    Développeur JAVA/PHP
    Inscrit en
    Mai 2008
    Messages
    61
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Rhône (Rhône Alpes)

    Informations professionnelles :
    Activité : Développeur JAVA/PHP

    Informations forums :
    Inscription : Mai 2008
    Messages : 61
    Par défaut
    Le problème, c'est que j’exécute ce code dans un .ksh sur le serveur, et que sur les serveurs de prod ça serait bien que j'ai pas à donner de droit à un user...
    Comment vérifier que cette utilisateur à les droits?
    L'utilisateur par défaut "oracle" doit les avoir dès la naissance non? (:p)

  4. #4
    Rédacteur

    Homme Profil pro
    Consultant / formateur Oracle et SQL Server
    Inscrit en
    Décembre 2002
    Messages
    3 461
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Var (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Consultant / formateur Oracle et SQL Server

    Informations forums :
    Inscription : Décembre 2002
    Messages : 3 461
    Par défaut
    Votre code sera en temps normal une procédure stockée ; cette procédure a un propriétaire ; c'est au propriétaire qu'il faut donner le droit d'exécution sur SYS.DBMS_LOCK.

  5. #5
    Membre averti
    Homme Profil pro
    Développeur JAVA/PHP
    Inscrit en
    Mai 2008
    Messages
    61
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Rhône (Rhône Alpes)

    Informations professionnelles :
    Activité : Développeur JAVA/PHP

    Informations forums :
    Inscription : Mai 2008
    Messages : 61
    Par défaut
    Non, ça ne sera pas dans une procédure stockée.

    Je dois créer un script d'appel et donc ne peux utiliser de l'existant (en tout cas créer ou modifier l'existant).

    Je dois donc requêter par le .ksh via sqlplus.

  6. #6
    Rédacteur

    Homme Profil pro
    Consultant / formateur Oracle et SQL Server
    Inscrit en
    Décembre 2002
    Messages
    3 461
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Var (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Consultant / formateur Oracle et SQL Server

    Informations forums :
    Inscription : Décembre 2002
    Messages : 3 461
    Par défaut
    Pour tester, c'est simple : vous vous connectez à SQL*Plus sous le compte que vous avez prévu, et vous faites
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    exec dbms_lock.sleep(1);
    Si ça vous pète à la figure, c'est que vous n'avez pas les droits sous ce compte :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    SCOTT@ORA112>exec dbms_lock.sleep(1);
    BEGIN dbms_lock.sleep(1); END;
     
          *
    ERREUR à la ligne 1 :
    ORA-06550: Ligne 1, colonne 7 :
    PLS-00201: l'identificateur 'DBMS_LOCK' doit être déclaré
    ORA-06550: Ligne 1, colonne 7 :
    PL/SQL: Statement ignored
    Dans ce cas, il faut se connecter sous SYS, et donner le droit :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    grant execute on dbms_lock to le_compte_qui_va_bien;
    Edit : Baldrick m'a devancé d'un poil !

  7. #7
    Membre expérimenté
    Homme Profil pro
    Administrateur de base de données
    Inscrit en
    Mai 2012
    Messages
    127
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Administrateur de base de données

    Informations forums :
    Inscription : Mai 2012
    Messages : 127
    Par défaut
    Je parle de l'utilisateur base de données, celui avec lequel vous vous connectez à la base pour exécuter ce code (ou du propriétaire de la procédure si vous décidez de créer une procédure), et non de l'utilisateur système qui lance ce script.

    Votre script .ksh contient une connexion à la base pour exécuter ce script, vraisemblablement avec sqlplus. Il suffit de relever le nom de l'utilisateur avec lequel vous vous connectez (je pars du principe que vous ne vous connectez pas avec l'utilisateur SYS,ni avec sqlplus / as ..., ce qui est aussi une connexion en tant que SYS, qui est certes propriétaire du package et n'a besoin de rien pour l'exécuter, mais qui ne doit pas être utilisé pour ce genre de choses)

    Il faut alors se connecter en tant que SYS et exécuter la commande suivante :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    GRANT EXECUTE ON DBMS_LOCK TO utilisateur;

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. Réponses: 7
    Dernier message: 01/10/2009, 16h51
  2. Réponses: 4
    Dernier message: 20/07/2007, 03h49
  3. [PERL]Remplacer un caractère dans on a le code ASCII
    Par LE NEINDRE dans le forum Langage
    Réponses: 4
    Dernier message: 30/09/2005, 15h13
  4. Réponses: 12
    Dernier message: 08/02/2005, 23h42
  5. [JSP] [include] inclure un morceau de code
    Par viena dans le forum Servlets/JSP
    Réponses: 3
    Dernier message: 06/01/2005, 11h51

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo