1
votes

Comment insérer le résultat de la requête de sélection dans la colonne d'une autre table

SELECT segment_name TABLE_NAME, SUM(bytes) table_size
  FROM USER_SEGMENTS
 WHERE SEGMENT_TYPE = 'TABLE'
 GROUP BY segment_name
 ORDER BY segment_name ASC;

0 commentaires

3 Réponses :


1
votes

Il semble que vous ayez besoin de la fonction LISTAGG() avec une instruction INSERT

RTRIM(XMLAGG(XMLELEMENT(e, 'Table : '||segment_name||'- size: '|| SUM(bytes), ',')
      .EXTRACT('//text()') ORDER BY segment_name)
      .GetClobVal(),
      ',')

Si vous obtenez ORA-01489 : le résultat de la concaténation de chaînes est une erreur trop longue , remplacez la dernière colonne contenant la fonction LISTAGG() par

INSERT INTO R_LOG
SELECT 1, 'tables_job', 'TEST', 'GUEST', 
       LISTAGG('Table : '||segment_name||'- size: '|| SUM(bytes),', ') 
        WITHIN GROUP (ORDER BY segment_name)
  FROM USER_SEGMENTS
 WHERE SEGMENT_TYPE = 'TABLE'
 GROUP BY segment_name


1 commentaires

@tej jetez un œil à la démo s'il vous plaît, quel est le problème ..? Btw, DETAILTEXT est de type CLOB, ou quelle en est la longueur si le type est VARCHAR2 ..?



1
votes

Je suppose que vous voulez concaténer les colonnes segment_name et SUM(bytes) dans la colonne de destination.
Utilisez SELECT au lieu de VALUES :

INSERT INTO R_LOG (DOMAINID, SOURCENAME, TERMINALID,userid, DETAILTEXT) 
SELECT 1, 'tables_job', 'TEST', 'GUEST', segment_name || ' ' || SUM(bytes) 
FROM USER_SEGMENTS
WHERE SEGMENT_TYPE='TABLE'
GROUP BY segment_name
ORDER BY segment_name ASC;


0 commentaires

0
votes

Vous pouvez utiliser directement INSERT INTO <TABLE_NAME>[(columns)] SELECT .. comme suit:

INSERT INTO R_LOG (
    DOMAINID,
    SOURCENAME,
    TERMINALID,
    USERID,
    DETAILTEXT
)
    SELECT 1, -- need to use some sequence here
           'tables_job',
           'TEST',
           'GUEST',
           SEGMENT_NAME || ' ' || SUM(BYTES)
      FROM USER_SEGMENTS
     WHERE SEGMENT_TYPE = 'TABLE'
     GROUP BY SEGMENT_NAME; 
     -- Order by is not needed


0 commentaires