如何在oracle存储过程中逐行打印

时间:2016-02-09 06:18:33

标签: sql oracle stored-procedures plsql

我正在执行存储过程,但它在某些时候失败了, 当前的错误代码无法帮助我找到错误的位置和确切位置 我想知道它究竟在哪里失败,所以想要在执行时逐行输出。 例如:

    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;

2 个答案:

答案 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。