Maison >base de données >tutoriel mysql >Comment récupérer le DBMS_OUTPUT d'Oracle à l'aide de JDBC ?

Comment récupérer le DBMS_OUTPUT d'Oracle à l'aide de JDBC ?

Linda Hamilton
Linda Hamiltonoriginal
2025-01-04 04:35:39894parcourir

How to Retrieve Oracle's DBMS_OUTPUT Using JDBC?

Récupération de DBMS_OUTPUT.get_lines à l'aide de JDBC

Lors de l'utilisation de dbms_output.get_lines d'Oracle dans une application Java, JDBC fournit un moyen d'obtenir la sortie sans créer des objets de base de données supplémentaires. Cette approche implique une série d'étapes :

  1. Activer la mise en mémoire tampon de sortie du serveur : Utilisez dbms_output.enable() pour activer la mise en mémoire tampon de sortie du serveur.
  2. Générer Sortie : Exécutez toutes les procédures stockées ou scripts qui produisent une sortie et qui doivent être capturé.
  3. Récupérer la sortie à l'aide de DBMS_OUTPUT.get_lines : Utilisez l'interface CallableStatement pour exécuter une procédure qui appelle dbms_output.get_lines et enregistrez un objet Array comme paramètre de sortie.
  4. Désactiver la mise en mémoire tampon de sortie du serveur :Invoquer dbms_output.disable() pour éviter le débordement de tampon.

Voici un exemple d'extrait de code qui illustre ce processus :

try (CallableStatement call = c.prepareCall(
    "declare "
  + "  num integer := 1000;" // Adapt this as needed
  + "begin "
  + "  dbms_output.enable();"
  + "  dbms_output.put_line('abc');"
  + "  dbms_output.put_line('hello');"
  + "  dbms_output.put_line('so cool');"

  // This captures the output up until now through a PL/SQL TABLE type.
  // Oracle 12c+ uses a SQL cursor, while 11g requires an auxiliary SQL TABLE
  + "  dbms_output.get_lines(?, num);"

  // Disable buffering
  + "  dbms_output.disable();"
  + "end;"
)) {
    call.registerOutParameter(1, Types.ARRAY, "DBMSOUTPUT_LINESARRAY");
    call.execute();

    Array array = null;
    try {
        array = call.getArray(1);
        System.out.println(Arrays.asList((Object[]) array.getArray()));
    }
    finally {
        if (array != null)
            array.free();
    }
}

Utilisation de jOOQ

Si vous utilisez la bibliothèque jOOQ, vous pouvez récupérer automatiquement la sortie du serveur pour les requêtes en l'activant dans les paramètres object:

DSLContext ctx = DSL.using(c, 
    new Settings().withFetchServerOutputSize(10));

La sortie du serveur sera disponible dans ExecuteContext::serverOutput après l'exécution de la requête.

Attention contre DBMS_OUTPUT.GET_LINE

Alors que DBMS_OUTPUT.GET_LINE récupère les lignes individuellement, les tests ont montré un ralentissement significatif par rapport à l'utilisation DBMS_OUTPUT.GET_LINES, même en PL/SQL. Par conséquent, l'approche groupée utilisant DBMS_OUTPUT.GET_LINES est recommandée pour des raisons d'efficacité.

Ce qui précède est le contenu détaillé de. pour plus d'informations, suivez d'autres articles connexes sur le site Web de PHP en chinois!

Déclaration:
Le contenu de cet article est volontairement contribué par les internautes et les droits d'auteur appartiennent à l'auteur original. Ce site n'assume aucune responsabilité légale correspondante. Si vous trouvez un contenu suspecté de plagiat ou de contrefaçon, veuillez contacter admin@php.cn