2016-02-09 27 views
0

我正在執行一個存儲過程,但它在某個時候失敗了, 當前錯誤代碼不幫我找到錯誤的位置和確切位置 我想知道它正在失敗,所以想要在執行時逐行輸出。 例如:如何在oracle存儲過程中逐行打印

create or replace 
    -- decaring required variable 
    PROCEDURE "PROC_DATA_TABLE_DETAILS" IS 
    FOR TABLEDETAILS IN (SELECT * FROM user_tables) 
     LOOP 

dbms_output.put_line (TABLENAME); 

    select NUM_ROWS INTO COUNTRECORDS from all_tables where owner not like 'SYS%'and TABLE_NAME = TABLEDETAILS.TABLE_NAME; 

    FOR FIELDSDETAILS IN (SELECT * FROM USER_TAB_COLUMNS WHERE TABLE_NAME = TABLENAME) 

     LOOP 


FIELDNAME :=FIELDSDETAILS.COLUMN_NAME; 

dbms_output.put_line (FIELDNAME); 

      execute immediate 'SELECT NVL(count(*),0) FROM ' ||TABLENAME || ' WHERE '|| FIELDNAME || ' is not null ' into TEMPNONBLANK; 
    END LOOP; 

    INSERT INTO DATA_TABLE_DETAILS VALUES (TABLEDETAILS.TABLE_NAME,COUNTFIELDS) 

    END LOOP; 

    END PROC_DATA_TABLE_DETAILS; 
+0

開始語句/關鍵字缺少。 – brenners1302

回答

0

嘗試將代碼分解爲幾個分段。這樣你將縮小搜索範圍。 Becoz想要做的是對何時打印進行分析。 或者,如果你想在每次賦值後打印,你可以將PL/SQL代碼解析爲一個變量,然後遍歷它直到找不到下一個':='。然後在Loop中找到';'的下一個位置和子串thr。追加dbms_output.print_line(precedence_part_of_assignment),然後再追加剩餘的字符串。 相反,你可以使用調試。

1

您的代碼將如下所示;此外,您可以編寫一個具有自治事務的過程來記錄所有錯誤或日誌。您還將獲得此功能的在線代碼。

http://log4plsql.sourceforge.net/

create or replace procedure proc_data_table_details is 
    tablename varchar2(30); 
    countrecords number; 
    fieldname varchar2(30); 
    tempnonblank number; 
begin 
    for tabledetails in (select * from user_tables where rownum < 3) loop 
    tablename := tabledetails.table_name; 
    dbms_output.put_line(tabledetails.table_name); 
    select num_rows 
     into countrecords 
     from all_tables 
    where owner not like 'SYS%' 
     and table_name = tablename; 

    for fieldsdetails in (select * from user_tab_columns where table_name = tablename) loop 
     fieldname := fieldsdetails.column_name; 
     dbms_output.put_line(fieldname); 
     execute immediate 'SELECT NVL(count(*),0) FROM ' || tablename || ' WHERE ' || fieldname || ' is not null ' 
     into tempnonblank; 
     dbms_output.put_line('TABLENAME :' || tablename || ' column name :' || fieldname || ' count :' || tempnonblank); 
    end loop; 
    end loop; 
end proc_data_table_details;