我正在执行存储过程,但它在某些时候失败了, 当前的错误代码无法帮助我找到错误的位置和确切位置 我想知道它究竟在哪里失败,所以想要在执行时逐行输出。 例如:
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 :(得分: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;
答案 1 :(得分:0)
尝试将代码分解为少量代码。这样您就可以缩小搜索范围。 Becoz你要做的是做一个关于什么时候打印的分析决定。 或者,如果你想在每个值赋值后打印,你可以将PL / SQL代码解析为变量,然后循环它直到下一个&#39;:=&#39;还没有找到。然后在循环中找到下一个位置&#39 ;;&#39;和子串thr。附加dbms_output.print_line(preceeding_part_of_assignment),然后再次追加剩余的字符串。 相反,你可以使用debug。