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 :

[debutant][SQL]Package body et Create table


Sujet :

Oracle

  1. #1
    Membre confirmé
    Profil pro
    Inscrit en
    Mai 2003
    Messages
    98
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mai 2003
    Messages : 98
    Par défaut [debutant][SQL]Package body et Create table
    Bonjour,

    J'ai créer un package dans lequel je voudrais créer une table temporaire pour stocker des données.
    POur cela, j'ai déclaré le code suivant:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    FUNCTION PRS_CREER_NUMCARNET_RAPPROCHE(DATE_LIMITE IN DATE) return number IS
    BEGIN
          CREATE TABLE TMP_TOTO AS     
          (SELECT * FROM TOTO)
        COMMIT;
        return 0;
    END PRS_CREER_NUMCARNET_RAPPROCHE;
    Lorsque je compile mon code, j'ai l'erreur suivante:
    Erreurs de compilation dans PACKAGE BODY BDTST_2006_2_USER.PRS_TOTO

    Erreur : PLS-00103: Encountered the symbol "CREATE" when expecting one of the following:

    begin case declare exit for goto if loop mod null pragma
    raise return select update while with <an identifier>
    <a double-quoted delimited-identifier> <a bind variable> <<
    close current delete fetch lock insert open rollback
    savepoint set sql execute commit forall merge
    <a single-quoted SQL string> pipe
    Ligne : 186
    Texte : CREATE TABLE TMP_TOTO AS
    Je constate donc, à la lecture de la liste des éléments attendus, que je ne peux pas creér de table (ni même d'en droper d'ailleurs, ce qui m'intéressera par la suite).
    Quelqu'un peut-il m'expliquer pourquoi et/ou me donner une solution alternative?

    Merci d'avance

  2. #2
    Membre confirmé
    Profil pro
    Inscrit en
    Mai 2003
    Messages
    98
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mai 2003
    Messages : 98
    Par défaut
    J'ai trouvé quelques infos supplémentaire.
    dans certaines syntaxes on trouve entre la déclaration du package et du package body la déclaration suivante:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    create or replace package PRS_TOTO is
    ...
    end PRS_TOTO;
    /
    create global temporary table TMP_NUMCARNET_RAPPROCHE AS     
          (SELECT ...)
     
    create or replace package body PRS_TOTO is
    ...
    end PRS_TOTO;
    /
    Mais bon, ca ne m'arrange pas plus que ça, puisque la création de ma table doit se faire sous conditions...

  3. #3
    Membre éclairé
    Inscrit en
    Novembre 2002
    Messages
    549
    Détails du profil
    Informations forums :
    Inscription : Novembre 2002
    Messages : 549
    Par défaut
    Bonjour,

    La solution de ton problème se trouve du coté du SQL Dynamique et de EXECUTE IMMEDIATE : lance une recherche sur le forum, tu auras des exemples à profusion

    @

  4. #4
    Membre confirmé
    Profil pro
    Inscrit en
    Mai 2003
    Messages
    98
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mai 2003
    Messages : 98
    Par défaut
    Merci, effectivement, c'est par la qu'il faut que je m'oriente...
    Par contre:
    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
    FUNCTION PRS_CREER_TABLE(DATE_LIMITE IN DATE) return number IS
          BEGIN
          DECLARE
          LC$Requete        VARCHAR2(256) ;
     
          BEGIN
          LC$Requete:='CREATE TOTO AS  (SELECT * FROM TATA WHERE DATE< :1)';
          EXECUTE IMMEDIATE LC$Requete using DATE_LIMITE;
          END;
        return 0;
    END PRS_CREER_TABLE;
     
    FUNCTION PRS_LIRE_TABLE(DATE_LIMITE IN DATE) return number IS
          BEGIN
          UPDATE TITI SET TITI.OK='OK' WHERE TITI.NOM = TOTO.NOM
          END;
        return 0;
    END PRS_LIRE_TABLE;
    Bon, l'exemple est bidon et inutile, mais dans la seconde fonction, la table TOTO est inconnue puisque non existante définitivement, donc la compilation ne marche pas...
    Je ne sais pas si je me fais comprendre?

  5. #5
    Expert confirmé
    Avatar de SheikYerbouti
    Profil pro
    Inscrit en
    Mai 2003
    Messages
    6 760
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mai 2003
    Messages : 6 760
    Par défaut
    Si vous commencez en dynamique, vous continuer en dynamique !
    A partir du moment ou votre table est "virtuelle", toutes les actions qui s'y rapportent doivent utiliser le SQL dynamique.

  6. #6
    Membre confirmé
    Profil pro
    Inscrit en
    Mai 2003
    Messages
    98
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mai 2003
    Messages : 98
    Par défaut
    Ok, c'est ce que j'avais préssenti.
    Merci, c'est pour moi la soution!!

  7. #7
    Expert confirmé
    Avatar de SheikYerbouti
    Profil pro
    Inscrit en
    Mai 2003
    Messages
    6 760
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mai 2003
    Messages : 6 760
    Par défaut
    Ou alors, vous avez en base une table factice ( TOTO col1 varchar2(1) ) qui sert uniquement à passer les phases de compilation.
    Dans votre code, vous dropez puis recréez la table pour quelle correspondent à votre besoin.

Discussions similaires

  1. Réponses: 0
    Dernier message: 14/04/2011, 20h23
  2. [debutant]ms sql serveur delete entre deux tables
    Par ChristopheOce dans le forum MS SQL Server
    Réponses: 2
    Dernier message: 01/06/2006, 16h36
  3. Réponses: 12
    Dernier message: 26/01/2006, 14h51
  4. [Sql] Create table
    Par Jerem76 dans le forum MS SQL Server
    Réponses: 3
    Dernier message: 25/07/2005, 17h42
  5. [Sql Server/MSDE][Create Table] limite int identity
    Par joefou dans le forum MS SQL Server
    Réponses: 2
    Dernier message: 27/06/2005, 09h45

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