2017-08-28 3 views
0

Je suis à une perte complète quant à l'endroit où mon problème est. Plus tôt, j'ai écrit une procédure qui a bien été compilée, mais maintenant je remarque que si je prends le code exact (même copier/coller de la procédure), et que je tente de l'exécuter à nouveau, SQL Developer se fige et ne se compile jamais. Le SQL lui-même n'est certainement pas le plus propre, et je suis conscient que je l'ai rendu un peu plus complexe qu'un meilleur programmeur, mais s'il compilé plus tôt, il devrait compiler à nouveau, non? Ci-dessous le SQL P/L dans le cas qui peut aider ...SQL précédemment compilé P/L gèle maintenant dans le développeur SQL

create or replace PROCEDURE insert_comments AS 

v_blob BLOB; v_record number; 

BEGIN 


SELECT blob_content INTO v_blob from xlsx_files; 

for x in 
    (select id into v_record from 
     (SELECT to_number(id) id, name FROM 
      (WITH xlsx AS 
       (SELECT 
        ROW_NR, 
        COL_NR, 
        CASE CELL_TYPE 
         WHEN 'S' 
          THEN STRING_VAL 
         WHEN 'N' 
          THEN TO_CLOB(NUMBER_VAL) 
         WHEN 'D' 
          THEN TO_CLOB(TO_CHAR(DATE_VAL, 'DD-MON-YYYY')) 
         ELSE 
          TO_CLOB(FORMULA) 
        END CELL_VAL 
       FROM 
        (SELECT * FROM 
         TABLE(as_read_xlsx_clob.read(v_blob)) 
         --as_read_xlsx_clob is a function from the As_read_XLSX_CLOB package 
        ) 
       ) 
      /*The below statement works as a roundabout way of pivoting 
      the table. Since the data in the file may contain CLOBs, you 
      can't use the PIVOT function since CLOBs do not support 
      aggregation. I have commented out the original SQL that used 
      PIVOT*/ 
      SELECT id_table.id, name_table.name FROM 
       (SELECT row_nr, cell_val id FROM 
        (SELECT * FROM xlsx WHERE row_nr > 1) id_table 
        where id_table.col_nr=1 
       ) id_table 
       inner join 
       (SELECT row_nr, cell_val name FROM 
        (SELECT * 
        FROM xlsx 
         --PIVOT (MAX(TO_CHAR(CELL_VAL)) 
         FOR COL_NR IN (1 AS ROW_WID,2 AS NAME) 
         ) ad 
         WHERE row_nr >1 
        ) name_table 
        where name_table.col_nr = 2 
       ) name_table 
      ON id_table.row_nr = name_table.row_nr 
      ) 
     ) 
    ) 
loop 
    v_record := x.id; 
    INSERT INTO comment_test(id, name) 
     (SELECT to_number(id) id, name 
     FROM 
      (WITH xlsx AS 
       (SELECT 
        ROW_NR, 
        COL_NR, 
        CASE CELL_TYPE 
         WHEN 'S' 
          THEN STRING_VAL 
         WHEN 'N' 
          THEN TO_CLOB(NUMBER_VAL) 
         WHEN 'D' 
          THEN TO_CLOB(TO_CHAR(DATE_VAL, 'DD-MON-YYYY')) 
         ELSE TO_CLOB(FORMULA) 
        END CELL_VAL 
       FROM 
       (SELECT * FROM 
        TABLE(as_read_xlsx_clob.read(v_blob)) 
        --as_read_xlsx_clob is a function from the As_read_XLSX_CLOB package 
       ) 
      ) 
      /*The below statement works as a roundabout way of 
      pivoting the table. Since the data in the file may 
      contain CLOBs, you can't use the PIVOT function since 
      CLOBs do not support aggregation. I have commented out 
      the original SQL that used PIVOT*/ 
      SELECT id_table.id, name_table.name FROM 
       (SELECT row_nr, cell_val id FROM 
        (SELECT * FROM xlsx WHERE row_nr > 1) id_table 
       where id_table.col_nr=1 
       ) id_table 
       inner join 
       (SELECT row_nr, cell_val name FROM 
        (SELECT * 
        xlsx 
         --PIVOT (MAX(TO_CHAR(CELL_VAL)) 
         FOR COL_NR IN (1 AS ROW_WID,2 AS NAME) 
         ) ad 
        WHERE row_nr >1 
        ) name_table 
       where name_table.col_nr = 2 
       ) name_table 
       ON id_table.row_nr = name_table.row_nr) 
      where to_number(id) = v_record 
     ); 
    end loop; 

delete from xlsx_files; 
END; 
+0

Etes-vous sûr que vous avez posté le code exact que vous essayez de compiler parce que je peux voir l'erreur de syntaxe dans votre code posté ci-dessus. – XING

+0

Ouais, copié directement à partir de la procédure. Il semble bien se compiler dans une connexion différente (tant que les tables référencées existent). Mind pointin goutter l'erreur de syntaxe? – Ian

+0

Il semble très problème spécifique au système. Vous devez vérifier si le système que vous utilisez possède tous les objets DB et que vous avez les autorisations nécessaires pour exécuter le proc. – XING

Répondre

0

commentaires Per William Robertson, la question était il y avait une autre session qui utilisait la procédure. Cette session a été tuée et j'ai pu recompiler.