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

PL/SQL Oracle Discussion :

MERGE INTO avec une variable de type TABLE [12c]


Sujet :

PL/SQL Oracle

  1. #1
    Rédacteur/Modérateur

    Avatar de Antoun
    Homme Profil pro
    Architecte décisionnel
    Inscrit en
    Octobre 2006
    Messages
    6 284
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 54
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Architecte décisionnel
    Secteur : Conseil

    Informations forums :
    Inscription : Octobre 2006
    Messages : 6 284
    Par défaut MERGE INTO avec une variable de type TABLE
    Bonjour,

    J'ai un package, auquel j'essaie d'ajouter une procédure qui effectuerait un MERGE INTO sur une vraie table, mais avec des données contenues dans une variable de type table...

    J'ai ça comme déclaration de types :
    Code PLSQL : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     type TFILTRE is RECORD (APP VARCHAR2(8), CUBE VARCHAR2(8), FILTRE VARCHAR2(255), ENTITY VARCHAR2(80)) ;
     type TFILTRES is table of TFILTRE ;

    Et voici ma procédure :
    Code PLSQL : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
      PROCEDURE IU_FILTRE (v_FILTRES IN TFILTRES)
      IS
      BEGIN
        MERGE INTO OBI_FILTRES F
        USING (SELECT... FROM v_FILTRES) V ON (F.APPLICATION = V.APP AND ...)
        WHEN MATCHED THEN UPDATE ...
        WHEN NOT MATCHED THEN INSERT ...
      END ;

    Mais lorsque j'essaie de compiler, il me dit à propos de v_FILTRES :
    PL/SQL: ORA-00942: table or view does not exist.
    Il y a une syntaxe spéciale pour faire un SELECT sur une variable table ? J'ai essayé TABLE(v_FILTRES), mais ça m'a fait une autre erreur :
    PLS-00642: local collection types not allowed in SQL statements.
    Merci d'avance pour toute piste !

  2. #2
    Membre Expert
    Homme Profil pro
    Administrateur de base de données
    Inscrit en
    Avril 2013
    Messages
    2 005
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Administrateur de base de données
    Secteur : High Tech - Produits et services télécom et Internet

    Informations forums :
    Inscription : Avril 2013
    Messages : 2 005
    Par défaut
    Tu écris "MERGE INTO OBI_FILTRES F" mais où est-ce que tu déclares cet objet OBI_FILTRES?
    C'est une table? une variable de type TFILTRES ? Je pense que c'est le deuxième cas donc il faut déclarer OBI_FILTRES comme étant de type TFILTRES.

    Attention à ta déclaration "type TFILTRES is table of TFILTRE" : il n'y a qu'une lettre d'écart (le S), cela peut facilement créer des confusions à la lecture du code.

  3. #3
    Rédacteur/Modérateur

    Avatar de Antoun
    Homme Profil pro
    Architecte décisionnel
    Inscrit en
    Octobre 2006
    Messages
    6 284
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 54
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Architecte décisionnel
    Secteur : Conseil

    Informations forums :
    Inscription : Octobre 2006
    Messages : 6 284
    Par défaut
    OBI_FILTRES est une table.

  4. #4
    Expert confirmé
    Profil pro
    Inscrit en
    Août 2008
    Messages
    2 952
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Août 2008
    Messages : 2 952
    Par défaut
    Ce n'est pas possible avec le type record qui n'est qu'un type du moteur PL/SQL non connu par le moteur SQL.

    Il faut utiliser le type SQL Object stocké en base pour pouvoir l'utiliser dans une requête.
    https://www.developpez.net/forums/d1...d/#post8214400

  5. #5
    Membre Expert
    Homme Profil pro
    Développeur Oracle
    Inscrit en
    Décembre 2019
    Messages
    1 167
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Nord (Nord Pas de Calais)

    Informations professionnelles :
    Activité : Développeur Oracle

    Informations forums :
    Inscription : Décembre 2019
    Messages : 1 167
    Par défaut
    Bonjour,

    Dans ce cas il faut utiliser une instruction FORALL. Par exemple:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    PROCEDURE IU_FILTRE (v_FILTRES IN TFILTRES)
      IS
      BEGIN
        forall i in v_filtres.first .. v_filtres.last
        MERGE INTO OBI_FILTRES F
        USING DUAL
        ON (v_filtres(i).app = f.application)
        WHEN MATCHED THEN UPDATE set f.entity = v_filtres(i).entity;
      END ;

  6. #6
    Rédacteur/Modérateur

    Avatar de Antoun
    Homme Profil pro
    Architecte décisionnel
    Inscrit en
    Octobre 2006
    Messages
    6 284
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 54
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Architecte décisionnel
    Secteur : Conseil

    Informations forums :
    Inscription : Octobre 2006
    Messages : 6 284
    Par défaut
    Merci pour toutes vos réponses.

    Au final, j'ai choisi la solution de mnitu citée par skuatamad, et tout fonctionne !

    Code SQL : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    CREATE OR REPLACE TYPE TFILTRE AS OBJECT(
     APP VARCHAR2(8), 
     CUBE VARCHAR2(8), 
     FILTRE VARCHAR2(255), 
     PRIV VARCHAR2(9),  ENTITY VARCHAR2(80)
    ) ;
    /
    CREATE OR REPLACE TYPE TFILTRES AS TABLE OF TFILTRE ;
    /

    Code PLSQL : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
      PROCEDURE IU_FILTRE (v_FILTRES TFILTRES)
      IS
      BEGIN
        MERGE INTO OBI_FILTRES F
        USING (SELECT... FROM TABLE(v_FILTRES)) V ON (F.APPLICATION = V.APP AND ...)
        WHEN MATCHED THEN UPDATE ...
        WHEN NOT MATCHED THEN INSERT ...
      END ;

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

Discussions similaires

  1. Problème avec une variable de type objet
    Par mrocks dans le forum C#
    Réponses: 7
    Dernier message: 09/05/2009, 22h27
  2. ré-initialiser un identity sur une variable de type table
    Par laurent-devel dans le forum MS SQL Server
    Réponses: 4
    Dernier message: 31/03/2008, 19h39
  3. Réponses: 5
    Dernier message: 22/01/2008, 09h54
  4. problème avec une variable de type string
    Par marsupilami34 dans le forum Macros et VBA Excel
    Réponses: 3
    Dernier message: 14/06/2007, 14h53
  5. Réponses: 15
    Dernier message: 10/05/2007, 13h36

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