2017-08-28 123 views
0

我是在一个完整的损失严重,我的问题是。早前我写的精编的程序,但现在我发现,如果我走了确切的代码(甚至从程序本身复制/粘贴),并尝试再次运行它,SQL开发人员基本上是冻结它从不编译。以前编译的P/L SQL现在冻结在SQL Developer中

的SQL本身肯定是不干净的,我知道,我将它一点点比一个更好的程序员会更复杂,但是如果它编译早期就应该重新编译,不是吗?下面是情况下可以帮助P/L 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

你确定你发布你试图编译监守我可以在你的代码发布见上面的语法错误的确切代码。 – XING

+0

是的,直接从程序中复制。它似乎很好地在不同的连接中编译(只要引用的表存在)。思想点痛风的语法错误? – Ian

+0

看来非常系统特定的问题。您需要检查您正在运行的系统是否具有所有数据库对象,并且您有必要授予执行该proc的权限。 – XING

回答

0

每威廉·罗伯逊的评论,这个问题是有其使用的程序的另一个会话。这次会议被杀,我可以重新编译。