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 :

Insert OR Create dans une table


Sujet :

SQL Oracle

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre confirmé Avatar de Momodedf
    Inscrit en
    Juillet 2007
    Messages
    246
    Détails du profil
    Informations personnelles :
    Âge : 36

    Informations forums :
    Inscription : Juillet 2007
    Messages : 246
    Par défaut Insert OR Create dans une table
    Bonjour,

    Je cherche à créer une procédure permentant d'insérer des valeurs dans une table, mais avant de vérifier l'existence de cette table et la créer si besoin.

    J'avais penser à créer une exception permetant de créer la table si lors de l'insertion le server renvoyait une erreur, mais j'ai deux problemes à ce niveau :
    1° je ne trouve pas l'exception levée pour un table not found.
    2° est-il possible de rappeler la procedure à partir d'une exception de cette meme procedure.

    Syntétiquement voilà e que je pensais faire (la syntaxe n'est pas respéctée c'est juste pour expliquer) :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    PROCEDURE insert_or_create
    insert into .......;
    EXCEPTION
    when table not found :
    create table .....;
    call insert_or create;
    end;

  2. #2
    Membre éclairé
    Profil pro
    Inscrit en
    Janvier 2008
    Messages
    50
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Janvier 2008
    Messages : 50
    Par défaut SQL Dynamique
    Pour pouvoir compiler correctement une procédure, tout les objets utilisés (tables, sequences, vues...) doivent exister. Ta table, si tu l'utilises dans un insert "simple" et qu'elle n'existe pas encore empêchera ta procédure de compiler.

    Il te faut passer par du SQL dynamique (execute immediate, dbms_sql...).

    De plus, tu devras octroyer le droit CREATE TABLE à ton utilisateur de manière explicite (pas au travers d'un rôle).

    Pour vérifier qu'une table existe, compte par exemple le nombre de lignes renvoyées par un select sur la vue user_tables avec une clause WHERE adéquate.

    Sinon... cherche ailleurs sur ce forum car cette question revient souvent.

  3. #3
    Membre confirmé Avatar de Momodedf
    Inscrit en
    Juillet 2007
    Messages
    246
    Détails du profil
    Informations personnelles :
    Âge : 36

    Informations forums :
    Inscription : Juillet 2007
    Messages : 246
    Par défaut
    Est-ce le seul moyen ?

    En définitive le but est de créer un table si elle n'existe pas et d'insérer une nouvelle ligne dedans.

  4. #4
    Expert éminent
    Avatar de orafrance
    Profil pro
    Inscrit en
    Janvier 2004
    Messages
    15 967
    Détails du profil
    Informations personnelles :
    Âge : 48
    Localisation : France

    Informations forums :
    Inscription : Janvier 2004
    Messages : 15 967
    Par défaut
    tu peux faire un truc comme ça :
    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
    DECLARE
       dummy   INTEGER;
    BEGIN
     BEGIN
       SELECT 1
         INTO dummy
         FROM user_tables
        WHERE table_name = 'TATABLE';
     
      EXCEPTION
         WHEN NO_DATA_FOUND
          THEN
             EXECUTE IMMEDIATE 'CREATE TABLE tatable ...';
      END;
     
     INSERT INTO tatable...
    END;
    /

  5. #5
    Membre confirmé Avatar de Momodedf
    Inscrit en
    Juillet 2007
    Messages
    246
    Détails du profil
    Informations personnelles :
    Âge : 36

    Informations forums :
    Inscription : Juillet 2007
    Messages : 246
    Par défaut
    Oui c'est ce que j'ai décidé de faire en définitive, mais j'étais en train de chercher le nom de user_tables.
    Et je trouve pu mes cours sur le dictionnaire de donnée ^^

    Merci beaucoup.

  6. #6
    Membre confirmé Avatar de Momodedf
    Inscrit en
    Juillet 2007
    Messages
    246
    Détails du profil
    Informations personnelles :
    Âge : 36

    Informations forums :
    Inscription : Juillet 2007
    Messages : 246
    Par défaut
    Voilà aprés quelques péripéties j'en suis arrivé à ça :

    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
    SET SERVEROUTPUT ON
    CREATE OR REPLACE PROCEDURE add_suspect (
       employeeId    employees.employee_id%TYPE) IS
       nb_table number(10);
     
    BEGIN
    	SELECT 1 INTO nb_table FROM user_tables WHERE table_name = 'SUSPECTS';
    	EXECUTE IMMEDIATE 'INSERT INTO suspects SELECT employee_id, last_name, first_name, 
    	hire_date, salary, job_id FROM employees WHERE employee_id = ' || employeeId;
    EXCEPTION
    	WHEN NO_DATA_FOUND THEN 
    	EXECUTE IMMEDIATE 'CREATE TABLE suspects(employee_id NUMBER(6), last_name VARCHAR2(7),
    	first_name VARCHAR2(25), hire_date DATE, salary NUMBER(8,2), job_id VARCHAR(10))';
     
     
    END add_suspect;
    /
    show errors
    Le probleme c'est que lors de l'appel, s'il la table n'existe pas elle est bien créé mais l'INSERT n'est pas fait.
    Est-ce il possible de continuer procedure uen fois l'exception levée ?
    Et si non est-ce que je peux dans l'exception relancer la procedure avec les parametre qu'elle avait reçu en entrée lors du premier appel ?

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

Discussions similaires

  1. Réponses: 5
    Dernier message: 26/01/2007, 08h11
  2. [SQL 2005][ASP.net 2]Insertion de date dans une table
    Par skystef dans le forum Accès aux données
    Réponses: 2
    Dernier message: 29/12/2006, 09h26
  3. Réponses: 3
    Dernier message: 23/11/2006, 16h45
  4. [A97] VBA : Commande sql pour insertion de champs dans une table
    Par JeremieT dans le forum Requêtes et SQL.
    Réponses: 4
    Dernier message: 27/07/2006, 13h12
  5. echec d'insertion de ligne dans une table
    Par foblar dans le forum MS SQL Server
    Réponses: 1
    Dernier message: 20/07/2006, 10h13

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