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

  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) ?

  7. #7
    Membre régulier
    Profil pro
    Inscrit en
    Avril 2008
    Messages
    8
    Détails du profil
    Informations personnelles :
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations forums :
    Inscription : Avril 2008
    Messages : 8
    Par défaut
    A mon avis les requêtes sont interprétées à leur exécution donc la pas de problème pour ton $nom alors que les procédures sont compilées.

    Le compilateur cherche à resoudre ton %ROWTYPE et bien sur n'y arrive pas.

    Le fait de passer en %TYPE n'amènera pas grand chose je pense.

    Je peux tout à fait me tromper aussi

    edit : peut-être y a t'il un moyen d'indiquer au compilateur de ne pas chercher à résoudre ton %ROWTYPE mais la je ne sais vraiment pas comment ...

  8. #8
    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
    Bon j'ai modifié mon code et ca marche pour le moment. Oublier pour l'instant le passage en procédure il faut déjà que le code marche ^^

    En gros, je vais récupérer des données dans le passé pour les ramener dans le présent.

    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
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    ACCEPT schem PROMPT "Enter a schema name : "
    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
    	CURSOR cur_now IS SELECT * FROM &schem..&nom &condition;
    	CURSOR c_column IS
        SELECT column_name,ROWNUM FROM ALL_TAB_COLUMNS uc WHERE table_name=upper('&nom') AND OWNER = upper('&schem');
    	cvar_now cur_now%ROWTYPE;
    	str VARCHAR2(4000);
    	col VARCHAR2(50);
    	col2 VARCHAR2(50);
    	i NUMBER :=0;
    BEGIN
    	COMMIT;
    	FOR rec2 IN c_column 
    		LOOP
    			IF i=0 THEN
    				str := 'cur_before.' || rec2.column_name; 
    				col := rec2.column_name;
    				col2 := 'cvar.' || col;
    				i:=i+1;
    			ELSE
    				str := str || ', cur_before.' || rec2.column_name; 
    			END IF;
    		END LOOP;
     
    	dbms_flashback.enable_at_time(TO_TIMESTAMP(SYSDATE - (&temps_minute/1440)));
     
    	FOR cur_before IN (SELECT * FROM &schem..&nom &condition)
    	LOOP
    		dbms_flashback.disable;
     
    		DBMS_OUTPUT.PUT_LINE(str);
    		OPEN cur_now;
    			FETCH cur_now INTO cvar_now;
    		IF cur_now%NOTFOUND THEN
     
    			INSERT INTO &schem..&nom VALUES (str);
    where col = col2;
    		END IF;
    		CLOSE cur_now;
    	END LOOP;
    	COMMIT;
    EXCEPTION
    	WHEN OTHERS THEN
    		DBMS_OUTPUT.PUT_LINE(SQLCODE || ' ' || SQLERRM);
    END;
    /
    Le problème vient dans le insert pour la clause VALUES. Je construit dans une variable la chaîne des valeurs de la sorte cur_before.id, cur_before.nom etc...

    Le problème est que dans mon VALUES il prend ma variable str comme une chaine de caractère alors que moi ce que je veux c'est qu'il remplace les cur_before.id et autre par la valeur contenue dans le record.

    J'espère avoir été clair...

    Donc comment faire pour qu'il prenne ma variable string non pas comme une chaine de caractère mais comme une "suite" de variable ?

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