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

SQL Oracle Discussion :

Utilisation d'une variable%ROWTYPE dans une procédure


Sujet :

SQL Oracle

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre confirmé
    Profil pro
    Étudiant
    Inscrit en
    Février 2008
    Messages
    224
    Détails du profil
    Informations personnelles :
    Âge : 40
    Localisation : France, Nord (Nord Pas de Calais)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Février 2008
    Messages : 224
    Par défaut Utilisation d'une variable%ROWTYPE dans une procédure
    Bonjour à tous,

    Je veux créer une procédure qui prend en paramètre un nom de table et je veux derrière créer une variable correspondant au type de la table :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    CREATE OR REPLACE PROCEDURE toto(name VARCHAR2) IS
    TYPE cur IS REF CURSOR;
    c cur;
    cvar name%ROWTYPE;
    BEGIN
    ...
    Oracle me met une erreur lors de la création de la procédure car il ne reconnait pas name%ROWTYPE. Comment puis-je faire ?

    Merci.

    Oracle 9.2.0.8

  2. #2
    Membre averti
    Inscrit en
    Août 2007
    Messages
    20
    Détails du profil
    Informations forums :
    Inscription : Août 2007
    Messages : 20
    Par défaut Nom de paramètre
    Salut

    As-tu essayé de ne pas utiliser name comme nom de paramètre qui est peut-être un mot réservé system?

  3. #3
    Membre confirmé
    Homme Profil pro
    Administrateur de base de données
    Inscrit en
    Décembre 2006
    Messages
    142
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Isère (Rhône Alpes)

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

    Informations forums :
    Inscription : Décembre 2006
    Messages : 142
    Par défaut
    Bonjour,

    je pense que ça ne marche pas car le compilateur a besoin de vérifier que l'objet existe bien et qu'on ait les droits adéquats lors d'une déclaration avec %ROWTYPE. On ne peut donc pas utiliser une variable car cela voudrait dire qu'on exécute sans compiler.
    Je ne sais pas ce que tu veux faire après mais il faudra utiliser une autre solution...

  4. #4
    Membre confirmé
    Profil pro
    Étudiant
    Inscrit en
    Février 2008
    Messages
    224
    Détails du profil
    Informations personnelles :
    Âge : 40
    Localisation : France, Nord (Nord Pas de Calais)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Février 2008
    Messages : 224
    Par défaut
    ok, merci.

    Voilà mon code dans un script PLSQL mais je voudrai en faire une procédure :

    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
    ACCEPT nom PROMPT "Enter a table name : "
    ACCEPT temps_minute PROMPT "Enter the number of minutes you want to flashback : "
    ACCEPT condition PROMPT "specify the WHERE clause (optional) : "
     
    DECLARE
    	col VARCHAR2(50);
    	TYPE cur IS REF CURSOR;
    	c cur;
    	cvar &nom%ROWTYPE;
    BEGIN
    	SELECT column_name into col from user_tab_columns where table_name like upper(name) AND ROWNUM < 2;
    	COMMIT;
    	dbms_flashback.disable;
    	dbms_flashback.enable_at_time(TO_TIMESTAMP(SYSDATE - (&temps_minute/1440)));
     
    	OPEN c FOR 'SELECT * from &nom &condition';
    	dbms_flashback.disable;
    	LOOP	
    		FETCH c INTO cvar;
    		EXIT WHEN c%NOTFOUND;
    		UPDATE &nom SET ROW = cvar where col = cvar.col;
    	END LOOP;
    	COMMIT;
    END;
    /
    Des idées ?

  5. #5
    Membre averti
    Profil pro
    Inscrit en
    Avril 2006
    Messages
    16
    Détails du profil
    Informations personnelles :
    Localisation : Tunisie

    Informations forums :
    Inscription : Avril 2006
    Messages : 16
    Par défaut
    Milo,
    J'ai l'impression que tu as commis deux erreurs dans ton instruction:
    1- &nom est une variable de substitution qui ne possède pas de type de données... donc on ne peut pas référencer son type de données (inexistant) pour d'autres variables PL/SQL.
    2- Pour attribuer le type de données d'une variable scalaire (et non un RECORD), on utilise le mot clé %TYPE et non %ROWTYPE qui concerne plutôt les records et les curseurs.

  6. #6
    Membre confirmé
    Profil pro
    Étudiant
    Inscrit en
    Février 2008
    Messages
    224
    Détails du profil
    Informations personnelles :
    Âge : 40
    Localisation : France, Nord (Nord Pas de Calais)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Février 2008
    Messages : 224
    Par défaut
    Zut,

    Je me suis trompé dans le code que je vous ai mis...

    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
    ACCEPT nom PROMPT "Enter a table name : "
    ACCEPT temps_minute PROMPT "Enter the number of minutes you want to flashback : "
    ACCEPT condition PROMPT "specify the WHERE clause (optional) : "
    ACCEPT col PROMPT "Specify a column name : "
     
    DECLARE
    	TYPE cur IS REF CURSOR;
    	c cur;
    	cvar &nom%ROWTYPE;
    BEGIN
    	COMMIT;
    	dbms_flashback.disable;
    	dbms_flashback.enable_at_time(TO_TIMESTAMP(SYSDATE - (&temps_minute/1440)));
     
    	OPEN c FOR 'SELECT * from &nom &condition';
    	dbms_flashback.disable;
    	LOOP	
    		FETCH c INTO cvar;
    		EXIT WHEN c%NOTFOUND;
    		UPDATE &nom SET ROW = cvar where &col = cvar.&col;
    	END LOOP;
    	COMMIT;
    END;
    /
    Voilà c'est mieux.

    bach, ce script marche parfaitement. Avec les variables de substitution, il n'y a aucun problème.

    Par contre si je veux le passer en procédure, les variables de substitution deviennent des paramètres et là y'a problème

    Donc en gros, je me demande comment faire pour passer ce bloc anonym en procédure? Dois-je changer quelquechose (Comme bach le disait le % ROWTYPE) ?

Discussions similaires

  1. Réponses: 9
    Dernier message: 23/06/2009, 10h54
  2. [PHP-JS] Récupérer une variable JS dans une variable PHP
    Par Perceuse-Killer dans le forum Langage
    Réponses: 2
    Dernier message: 07/02/2008, 15h34
  3. Réponses: 1
    Dernier message: 20/04/2007, 09h12
  4. [PHP-JS] mettre une variable javascript dans une variable php
    Par Mounr dans le forum Général JavaScript
    Réponses: 1
    Dernier message: 20/04/2007, 09h09
  5. récupérer une variable javascript dans une variable java
    Par tx dans le forum Général JavaScript
    Réponses: 1
    Dernier message: 06/07/2006, 17h55

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