【问题标题】:how to print line by line out in oracle stored procedureoracle存储过程中如何逐行打印
【发布时间】:2016-02-09 06:18:33
【问题描述】:

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

    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;

【问题讨论】:

  • begin 语句/关键字丢失。

标签: sql oracle stored-procedures plsql


【解决方案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;

【讨论】:

    【解决方案2】:

    尝试将代码分成几个部分。这样,您将缩小搜索范围。 Becoz 您要做的是对何时打印做出分析决定。 或者,如果您想在每次赋值后打印,您可以将 PL/SQL 代码解析为一个变量,然后循环遍历它,直到找不到下一个 ':='。然后在循环内,找到';'的下一个位置和子串 thr。追加 dbms_output.print_line(preceeding_part_of_assignment) 然后再次追加剩余的字符串。 相反,您可以只使用调试。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2013-04-13
      • 2010-12-23
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-06-19
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多