9
votes

Afficher les résultats de sélection à l'intérieur du bloc anonyme

J'essaie de déboguer une sélection à l'intérieur d'une procédure et j'essaie d'utiliser un bloc anonyme. J'aimerais que ce développeur SQL renvoie simplement la dernière instruction SELECT, mais j'obtiens l'erreur suivante:

set serveroutput on format wrapped;
DECLARE
  p_cd_doc_type number;
  p_dc_doc_code varchar2(200);
  p_dt_base date;
  p_qt_days number;
  p_vl_mov_total number;
  p_qt_transac number;
  v_dt_max date;
  v_dt_min date;
begin
  p_dt_base := sysdate;
  p_qt_days := 1;

  v_dt_max := trunc(p_dt_base) + 1;
  v_dt_min := v_dt_max - p_qt_days;
  p_vl_mov_total := 0;

  DBMS_OUTPUT.PUT_LINE('v_dt_max = ' || v_dt_max);
  DBMS_OUTPUT.PUT_LINE('v_dt_min = ' || v_dt_min);

    select *
    from tb_cad_cliente a join tb_trn_transacao b
      on a.cd_cliente = b.cd_cliente 
    where a.cd_doc_type = p_cd_doc_type
    and a.dc_doc_code = p_dc_doc_code
    and b.dt_row between v_dt_min and v_dt_max
    and b.cd_status = 3;
end;


0 commentaires

5 Réponses :


1
votes

Pour renvoyer la valeur du SELECT, il doit être sélectionné dans un conteneur (un curseur de référence ou un curseur REF). Dans votre déclaration, vous devez inclure ref_cursor_out sys_refcursor; et changez votre sélection à: xxx

dans le développeur SQL, il existe une option (je suis un utilisateur de crapaud, alors j'oublie où dans SD) qui indique à l'IDE de charger le jeu de résultats dans une grille Pour voir.

[modifier: par commentaire de @DCOOKIE, merci pour la prise!]


3 commentaires

Si j'ajoute un curseur de référence Tblresult; Avant le début, je reçois un PLS-00201: l'identifiant 'curseur' doit être déclaré


Votre déclaration de ref_cursor_out devrait être "ref_cursor_out sys_refcursor;"


Tks @dcookie. Il compile et tout ... J'utilise l'Open Tblresult pour sélectionner * de (...). Je cherche et creuser ... Comment imprimer le Tblresult? 100% des échantillons sont des résultats des Procs. Aucun concernant les blocs anonymes ..: - /



0
votes

erreur

Pour ce que je sais, quel que soit l'outil que vous utilisez pour déboguer, les blocs PL / SQL (anonyme et nommé) doivent être valides pour le compilateur pl / sql . Le fait est que votre bloc ne résulte pas valide pour le compilateur PL / SQL, et votre erreur est là pour vous dire et sort du compilateur pl / sql et pas du développeur SQL !

pls-00428: une clause dans une clause est attendue Dans cette déclaration de sélection Cause: la clause dans une déclaration sélectionnée a été omise. Pour exemple, le code pourrait ressembler Sélectionnez Deptno, Dname, Loc de Dept Où ... au lieu de choisir Deptno, DNAME, LOC IN DEPT_REC DE DEPTH Où ... dans pl / sql, seulement une sous-requête est écrit sans entrer en clause. Action: ajouter le besoin dans la clause

et

ora-06550: chaîne de ligne, chaîne de colonne: chaîne de caractères Cause: généralement une erreur de compilation PL / SQL. Action: Aucune

pourquoi erreur

Lorsqu'une erreur PL / SQL apparaît, vous n'avez le choix que d'enquêter dans le code et dans les manuels : Résolution des noms des instructions SQL statiques


PS: La route est toujours la même:

Comment demander

Tous les "oracles" sont ici:

développeur SQL < / fort>


2 commentaires

Tks pour les informations. Je suis au courant de tout cela, et j'ai fait plus d'une heure de recherche, et je n'ai pas pu trouver un moyen simple de résoudre mon problème sans créer de types. Après toute l'enquête, je n'ai toujours pas pu trouver un moyen simple de résoudre ce problème. Peut-être qu'il n'y a pas de moyen simple, et c'est la réponse. Je ne sais tout simplement pas, même après la recherche. Les activités fonctionnent bien dans mon proc. Il suffit de savoir comment le faire dans un bloc anonyme et l'afficher sur le développeur SQL


Cette réponse peut vous donner une idée: Stackoverflow.com/Questions/6265160/...



11
votes

Vous pouvez essayer avec cela, d'imprimer facilement votre résultat:

declare
your_variable varchar2(19);
BEGIN
DBMS_OUTPUT.PUT_LINE('init..');
 FOR x IN (SELECT      your_column
                 FROM you_table
                 where rownum<2
             order by 1)
   LOOP
      DBMS_OUTPUT.PUT_LINE(x.your_column);
   END LOOP;
END;


0 commentaires

0
votes

J'ai récemment changé de MSSQL en PLSQL et je manque les valeurs de retour en tant que tables des procédures à des fins analytiques. J'ai écrit simplement une requête dynamique qui retourne la table de deux étapes. Peut-être que quelqu'un l'utilise: xxx


0 commentaires

1
votes

pour oracle 12c ou supérieur xxx


0 commentaires