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

  1. #1
    Membre du Club
    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
    Points : 52
    Points
    52
    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 averti
    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
    Points : 339
    Points
    339
    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 du Club
    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
    Points : 52
    Points
    52
    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 460
    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 460
    Points : 8 074
    Points
    8 074
    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.
    Consultant / formateur Oracle indépendant
    Certifié OCP 12c, 11g, 10g ; sécurité 11g

    Ma dernière formation Oracle 19c publiée sur Linkedin : https://fr.linkedin.com/learning/oracle-19c-l-administration

  5. #5
    Membre du Club
    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
    Points : 52
    Points
    52
    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
    Membre averti
    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
    Points : 339
    Points
    339
    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;

  7. #7
    Rédacteur

    Homme Profil pro
    Consultant / formateur Oracle et SQL Server
    Inscrit en
    Décembre 2002
    Messages
    3 460
    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 460
    Points : 8 074
    Points
    8 074
    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 !
    Consultant / formateur Oracle indépendant
    Certifié OCP 12c, 11g, 10g ; sécurité 11g

    Ma dernière formation Oracle 19c publiée sur Linkedin : https://fr.linkedin.com/learning/oracle-19c-l-administration

  8. #8
    Membre du Club
    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
    Points : 52
    Points
    52
    Par défaut
    Effectivement, l'utilisateur n'a pas les droits en dev et n'a donc surement pas les droits en prod.

    Y a t'il une méthode alternative qui n'oblige pas à donner un droit?

    J'ai vu :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    IN_TIME INT; --num seconds
    v_now DATE;
     
    -- 1) Get the date & time 
    SELECT SYSDATE 
      INTO v_now
      FROM DUAL;
     
    -- 2) Loop until the original timestamp plus the amount of seconds = current date
    LOOP
      EXIT WHEN v_now + (IN_TIME * (1/86400)) = SYSDATE
    END LOOP;
    Mais j'imagine que ça va bouffer un proc monstre, même si c'est un sleep de maximum 5 secondes je pense...

  9. #9
    Expert éminent sénior Avatar de mnitu
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Octobre 2007
    Messages
    5 611
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Marne (Champagne Ardenne)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Octobre 2007
    Messages : 5 611
    Points : 11 252
    Points
    11 252
    Par défaut
    Citation Envoyé par SleTT Voir le message
    ...Y a t'il une méthode alternative qui n'oblige pas à donner un droit?
    ...
    Pourquoi cherchez-vous une mauvaise alternative à celle qui est bonne ?

  10. #10
    Membre du Club
    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
    Points : 52
    Points
    52
    Par défaut
    J'ai bien compris que c'était une bonne solution, je l'utiliserais très certainement dans de prochain cas.

    La je ne peux pas utiliser d'autres user que oracle et oracle n'a pas les droits pour faire ce LOCK.
    Je ne peux pas non plus GRANT un autre utilisateur parce que c'est utilisé par des gens lambda a des fins de test et qu'ils n'ont pas à savoir les user/mdp à qui mettre des GRANT.

    Donc, je cherche toujours une alternative puisque je ne PEUX pas utiliser la solution "classique".

  11. #11
    Rédacteur

    Homme Profil pro
    Consultant / formateur Oracle et SQL Server
    Inscrit en
    Décembre 2002
    Messages
    3 460
    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 460
    Points : 8 074
    Points
    8 074
    Par défaut
    Citation Envoyé par SleTT Voir le message
    Donc, je cherche toujours une alternative puisque je ne PEUX pas utiliser la solution "classique".
    Je crois que vous renoncez un peu vite... Si votre besoin est réel, vous n'aurez aucun mal à argumenter auprès du DBA / son chef / le pape pour obtenir ce dont vous avez besoin.

    La solution sous forme de boucle est bien entendu affreuse, et a de bonnes chances de ne pas supporter la montée en charge.
    Consultant / formateur Oracle indépendant
    Certifié OCP 12c, 11g, 10g ; sécurité 11g

    Ma dernière formation Oracle 19c publiée sur Linkedin : https://fr.linkedin.com/learning/oracle-19c-l-administration

  12. #12
    Expert éminent sénior Avatar de mnitu
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Octobre 2007
    Messages
    5 611
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Marne (Champagne Ardenne)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Octobre 2007
    Messages : 5 611
    Points : 11 252
    Points
    11 252
    Par défaut
    Il n’y a pas d’utilisateur Oracle crée par défaut dans une base des données Oracle. Donc pour pouvoir vous connecter et passer vos requêtes quelqu’un (un dba) a créé cet utilisateur et vous a donné les droits de vous connecter. Demandez à la même personne qu’en plus vous donnent les droits nécessaires à votre application pour exécuter les procédures du package dbms_lock

  13. #13
    Membre du Club
    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
    Points : 52
    Points
    52
    Par défaut
    C'est un script de test qui va s’exécuter dans un domaine très sensible et on ne peut pas donner plus de privilèges à un USER.

    On ne m'a pas créé de USER, je ne fais qu'utiliser celui présent pour exécuter du SQL.

    Le test sera lancé via un utilisateur admin du service oracle sous UNIX via :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
     
    sqlplus /nolog
    connect / as sysdba
     
    mesrequêtes...
    S'il n'y a pas de solutions alternatives je le comprendrais, je demande seulement s'il y en a une.

  14. #14
    Rédacteur

    Homme Profil pro
    Consultant / formateur Oracle et SQL Server
    Inscrit en
    Décembre 2002
    Messages
    3 460
    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 460
    Points : 8 074
    Points
    8 074
    Par défaut
    Citation Envoyé par SleTT Voir le message
    connect / as sysdba
    Donc vous vous connectez implicitement sous le compte SYS, qui est le superutilisateur de la base. Il a tous les droits possibles dans la base, en particulier celui d'exécuter DBMS_LOCK.
    Avez-vous au moins testé ???
    Consultant / formateur Oracle indépendant
    Certifié OCP 12c, 11g, 10g ; sécurité 11g

    Ma dernière formation Oracle 19c publiée sur Linkedin : https://fr.linkedin.com/learning/oracle-19c-l-administration

  15. #15
    Membre du Club
    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
    Points : 52
    Points
    52
    Par défaut


    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    SQL> connect /as sysdba
    Connected.
    SQL> exec dbms_lock.sleep(1);
    BEGIN dbms_lock.sleep(1); END;
     
          *
    ERROR at line 1:
    ORA-06550: line 1, column 7:
    PLS-00201: identifier 'DBMS_LOCK.SLEEP' must be declared
    ORA-06550: line 1, column 7:
    PL/SQL: Statement ignored

  16. #16
    Modérateur
    Avatar de Waldar
    Homme Profil pro
    Customer Success Manager @Vertica
    Inscrit en
    Septembre 2008
    Messages
    8 452
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 46
    Localisation : France, Val de Marne (Île de France)

    Informations professionnelles :
    Activité : Customer Success Manager @Vertica
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Septembre 2008
    Messages : 8 452
    Points : 17 820
    Points
    17 820
    Par défaut
    Quitte à faire un .ksh, découpez votre procédure en deux et collez un sleep unix/linux au milieu.

  17. #17
    Membre du Club
    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
    Points : 52
    Points
    52
    Par défaut
    La par contre, ça arrive à mes limites.

    C'est une solution à laquelle je pensais, mais je ne connais qu'un mode de fonctionnement pour ce que je veux faire :

    - J'ai une connexion par laquelle je génère un appel TCP_IP vers mon poste (IP + PORT) et qui fait sonner un dispositif.

    - Si je coupe le KSH, je vais couper ma connexion et donc ça ne sonnera plus.

    - Après avoir patienter, je suis censé renvoyer une trame qui stop la sonnerie.

    - L'effet désiré sera donc une sonnerie de X secondes (temps du slip)

    D’où le fait que je cherche à faire le sleep via SQL (oracle) plutôt qu'en shell, sinon c'est clair que j'aurais cherché plutôt de ce coté ci effectivement.

    Merci pour la proposition en tout cas

  18. #18
    Rédacteur

    Homme Profil pro
    Consultant / formateur Oracle et SQL Server
    Inscrit en
    Décembre 2002
    Messages
    3 460
    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 460
    Points : 8 074
    Points
    8 074
    Par défaut
    Citation Envoyé par SleTT Voir le message
    Cette erreur n'est absolument pas normale !
    En quelle version êtes-vous ?

    Il pourrait y avoir un script DBMSLOCK.SQL à lancer, à voir avec votre DBA.
    Consultant / formateur Oracle indépendant
    Certifié OCP 12c, 11g, 10g ; sécurité 11g

    Ma dernière formation Oracle 19c publiée sur Linkedin : https://fr.linkedin.com/learning/oracle-19c-l-administration

  19. #19
    Membre du Club
    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
    Points : 52
    Points
    52
    Par défaut
    Citation Envoyé par Pomalaix Voir le message
    En quelle version êtes-vous ?
    Le user sysdba n'est pas censé pouvoir "tout" lancer?

  20. #20
    Rédacteur

    Homme Profil pro
    Consultant / formateur Oracle et SQL Server
    Inscrit en
    Décembre 2002
    Messages
    3 460
    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 460
    Points : 8 074
    Points
    8 074
    Par défaut
    Citation Envoyé par SleTT Voir le message
    [code]Le user sysdba n'est pas censé pouvoir "tout" lancer?
    Si, mais le responsable de la base, c'est le DBA !
    Et comme, soit dit sans offense, vous n'en avez pas les compétences, et que vous dites travailler dans un domaine "très sensible", chacun son boulot...
    Consultant / formateur Oracle indépendant
    Certifié OCP 12c, 11g, 10g ; sécurité 11g

    Ma dernière formation Oracle 19c publiée sur Linkedin : https://fr.linkedin.com/learning/oracle-19c-l-administration

+ Répondre à la discussion
Cette discussion est résolue.
Page 1 sur 2 12 DernièreDernière

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