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;
3 Réponses :
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
@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 ..?
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;
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