zoukankan      html  css  js  c++  java
  • 【转】DBMS_OUTPUT包学习

    原文链接 http://www.blogjava.net/decode360/archive/2009/06/06/282867.html

    虽然一直在使用DBMS_OUTPUT.PUT_LINE,但是说实话没有仔细研究过DBMS_OUTPUT包中的其他方法和函数的用法,所以这次特地来研究一下。
     先简单的讲解一下这个包的所有procedure的含义及作用:
     
    -----------------------
        1、enable:在serveroutput on的情况下,用来使dbms_output生效(默认即打开)
        2、disable:在serveroutput on的情况下,用来使dbms_output失效
        3、put:将内容写到内存,等到put_line时一起输出
        4、put_line:不用多说了,输出字符
        5、new_line:作为一行的结束,可以理解为写入buffer时的换行符
        6、get_line:获取没有输出的buffer中的信息
        7、get_lines:以数组形式来获取所有buffer中的信息
     
     
        需要注意以下几点:
    -----------------------
        1set serveroutput on:如果要在sqlplus中看到dbms_output的输出,
    则必须设置该参数值为on
        2、每行能容纳的最大值是32767bytes
        3、buffer的默认值是20000bytes,可设置的最小值为2000bytes,最大值为1000000bytes
     
     
     
        来看一下Package中自带的说明:
    ----------------------- 
     
    create or replace package sys.dbms_output as
     
    -- DE-HEAD     <- tell SED where to cut when generating fixed package
     
      ------------
      --  OVERVIEW
      --
      --  These procedures accumulate information in a buffer (via "put" and
      --  "put_line") so that it can be retrieved out later (via "get_line" or
      --  "get_lines").  If this package is disabled then all
      --  calls to this package are simply ignored.  This way, these routines
      --  are only active when the client is one that is able to deal with the
      --  information.  This is good for debugging, or SP's that want to want
      --  to display messages or reports to sql*dba or plus (like 'describing
      --  procedures', etc.).  The default buffer size is 20000 bytes.  The
      --  minimum is 2000 and the maximum is 1,000,000.
     
      -----------
      --  EXAMPLE
      --
      --  A trigger might want to print out some debugging information.  To do
      --  do this the trigger would do
      --    dbms_output.put_line('I got here:'||:new.col||' is the new value');
      --  If the client had enabled the dbms_output package then this put_line
      --  would be buffered and the client could, after executing the statement
      --  (presumably some insert, delete or update that caused the trigger to
      --  fire) execute
      --    begin dbms_output.get_line(:buffer, :status); end;
      --  to get the line of information back.  It could then display the
      --  buffer on the screen.  The client would repeat calls to get_line
      --  until status came back as non-zero.  For better performance, the
      --  client would use calls to get_lines which can return an array of
      --  lines.
      --
      --  SQL*DBA and SQL*PLUS, for instance, implement a 'SET SERVEROUTPUT
      --  ON' command so that they know whether to make calls to get_line(s)
      --  after issuing insert, update, delete or anonymous PL/SQL calls
      --  (these are the only ones that can cause triggers or stored procedures
      --  to be executed).
     
      ------------
      --  SECURITY
      --
      --  At the end of this script, a public synonym (dbms_output) is created
      --  and execute permission on this package is granted to public.
     
      ----------------------------
      --  PROCEDURES AND FUNCTIONS
      --
      procedure enable (buffer_size in integer default 20000);
      pragma restrict_references(enable,WNDS,RNDS);
      --  Enable calls to put, put_line, new_line, get_line and get_lines.
      --    Calls to these procedures are noops if the package has
      --    not been enabled.  Set default amount of information to buffer.
      --    Cleanup data buffered from any dead sessions.  Multiple calls to
      --    enable are allowed.
      --  Input parameters:
      --    buffer_size
      --      Amount of information, in bytes, to buffer.  Varchar2, number and
      --      date items are stored in their internal representation.  The
      --      information is stored in the SGA. An error is raised if the
      --      buffer size is exceeded.  If there are multiple calls to enable,
      --      then the buffer_size is generally the largest of the values
      --      specified, and will always be >= than the smallest value
      --      specified.  Currently a more accurate determination is not
      --      possible.  The maximum size is 1,000,000, the minimum is 2000.
     
      procedure disable;
      pragma restrict_references(disable,WNDS,RNDS);
      --  Disable calls to put, put_line, new_line, get_line and get_lines.
      --    Also purge the buffer of any remaining information.
     
      procedure put(a varchar2);
      pragma restrict_references(put,WNDS,RNDS);
      --  Put a piece of information in the buffer.  When retrieved by
      --    get_line(s), the number and date items will be formated with
      --    to_char using the default formats. If you want another format
      --    then format it explicitly.
      --  Input parameters:
      --    a
      --      Item to buffer
     
      procedure put_line(a varchar2);
      pragma restrict_references(put_line,WNDS,RNDS);
      --  Put a piece of information in the buffer followed by an end-of-line
      --    marker.  When retrieved by get_line(s), the number and date items
      --    will be formated with to_char using the default formats.  If you
      --    want another format then format it explicitly. get_line(s) return
      --    "lines" as delimited by "newlines". So every call to put_line or
      --    new_line will generate a line that will be returned by get_line(s).
      --  Input parameters:
      --    a
      --      Item to buffer
      --  Errors raised:
      --    -20000, ORU-10027: buffer overflow, limit of <buf_limit> bytes.
      --    -20000, ORU-10028:line length overflow, limit of 32767 bytes per line.
     
      procedure new_line;
      pragma restrict_references(new_line,WNDS,RNDS);
      --  Put an end-of-line marker.  get_line(s) return "lines" as delimited
      --    by "newlines".  So every call to put_line or new_line will generate
      --    a line that will be returned by get_line(s).
     
      procedure get_line(line out varchar2, status out integer);
      pragma restrict_references(get_line,WNDS,RNDS);
      --  Get a single line back that has been buffered.  The lines are
      --    delimited by calls to put_line or new_line.  The line will be
      --    constructed taking all the items up to a newline, converting all
      --    the items to varchar2, and concatenating them into a single line.
      --    If the client fails to retrieve all lines before the next put,
      --    put_line or new_line, the non-retrieved lines will be discarded.
      --    This is so if the client is interrupted while selecting back
      --    the information, there will not be junk left over which would
      --    look like it was part of the NEXT set of lines.
      --  Output parameters:
      --    line
      --      This line will hold the line - it may be up to 32767 bytes long.
      --    status
      --      This will be 0 upon successful completion of the call.  1 means
      --      that there are no more lines.
     
      type chararr is table of varchar2(32767) index by binary_integer;
      procedure get_lines(lines out chararr, numlines in out integer);
      pragma restrict_references(get_lines,WNDS,RNDS);
      --  Get multiple lines back that have been buffered.  The lines are
      --    delimited by calls to put_line or new_line.  The line will be
      --    constructed taking all the items up to a newline, converting all
      --    the items to varchar2, and concatenating them into a single line.
      --    Once get_lines is executed, the client should continue to retrieve
      --    all lines because the next put, put_line or new_line will first
      --    purge the buffer of leftover data.  This is so if the client is
      --    interrupted while selecting back the information, there will not
      --    be junk left over.
      --  Input parameters:
      --    numlines
      --      This is the maximum number of lines that the caller is prepared
      --      to accept.  This procedure will not return more than this number
      --      of lines.
      --  Output parameters:
      --    lines
      --      This array will line will hold the lines - they may be up to 32767
      --      bytes long each.  The array is indexed beginning with 0 and
      --      increases sequentially.  From a 3GL host program the array begins
      --      with whatever is the convention for that language.
      --    numlines
      --      This will be the number of lines actually returned.  If it is
      --      less than the value passed in, then there are no more lines.
     
      --FIXED_ONLYTYPE dbmsoutput_linesarray IS VARRAY(2147483647) OF
      --FIXED_ONLY     VARCHAR2(32767);
      procedure get_lines(lines out dbmsoutput_linesarray, numlines in out integer);
      --  get_lines overload with dbmsoutput_linesarray varray type for lines.
      --  It is recommended that you use this overload in a 3GL host program to
    
      --  execute get_lines from a PL/SQL anonymous block.
      pragma restrict_references(get_lines,WNDS,RNDS);
     
      pragma TIMESTAMP('2000-06-22:11:21:00');
     
    end;
     
    -- CUT_HERE    <- tell sed where to chop off the rest
     
     
     
     
     
     
        下面举几个例子来说明一些不常用的方法的使用:
     
        例子1:(put和new_line)
    -----------------------
    SQL> set serveroutput on
    SQL> begin
      2    dbms_output.put_line('three names will be written.');
      3    dbms_output.put('j'); --增加至buffer
      4    dbms_output.new_line; --回车
      5    dbms_output.put('s'); --增加至buffer
      6    dbms_output.new_line; --回车
      7    dbms_output.put('t'); --增加至buffer
      8    dbms_output.new_line; --回车
      9    dbms_output.put_line('over.'); --与之前所有一起输出
    10  end;
    11  /
     
    three names will be written.
    j
    s
    t
    over.
     
    PL/SQL procedure successfully completed
     
     
     
        例子2:(put_line)
    -----------------------
    SQL> set serveroutput off;
    SQL> create table t(a int,b int,c int);
     
    Table created
    SQL> insert into t values(111111,222222,333333);
     
    1 row inserted
    SQL> insert into t values(444444,555555,666666);
     
    1 row inserted
    SQL> insert into t values(777777,888888,999999);
     
    1 row inserted
    SQL> create table tt(a int,b varchar2(100));
     
    Table created
    SQL> declare
      2      msg       varchar2(120);
      3      cursor t_cur is select * from t order by a;
      4      v_line    varchar2(100);
      5      v_status  integer := 0;
      6  begin
      7      dbms_output.enable;
      8      for i in t_cur loop
      9          msg := i.a || ',' || i.b || ',' || i.c;
    10          dbms_output.put_line(msg);
    11      end loop;
    12  
    13      dbms_output.get_line(v_line,v_status);
    14      while v_status = 0 loop
    15          insert into tt values(v_status, v_line);
    16          dbms_output.get_line(v_line,v_status);
    17      end loop;
    18  end;
    19  /
     
    PL/SQL procedure successfully completed
     
    SQL> select * from tt;
     
      A B
    --- ------------------------------
      0 111111,222222,333333
      0 444444,555555,666666
      0 777777,888888,999999
     
        注:使用get_line时不能用put_line输出,因为put_line之后会将buffer清空。
    (当然在serveroutput off的情况下put_line是不影响buffer的)
     
     
     
        例子3:(put_lines)
    -----------------------
    SQL> set serveroutput on
    SQL> declare
      2    v_data      dbms_output.chararr;
      3    v_numlines  number;
      4  begin
      5    -- enable the buffer first.
      6    dbms_output.enable(1000000);
      7  
      8    dbms_output.put_line('line one');
      9    dbms_output.put_line('line two');
    10    dbms_output.put_line('line three');
    11  
    12    v_numlines := 3;
    13    dbms_output.get_lines(v_data, v_numlines);
    14    for v_counter in 1..v_numlines loop
    15      dbms_output.put_line(v_data(v_counter));
    16    end loop;
    17  end;
    18  /
     
    line one
    line two
    line three
     
    PL/SQL procedure successfully completed
     
     
        注意数组使用的格式。
  • 相关阅读:
    继承和多态
    访问限制
    返回函数
    类和实例
    requests
    函数的参数
    代码块的快速放置
    19进阶、基于TSP的直流电机控制设计
    18进阶、TLC语言
    17高级、Simulink代码生成技术详解
  • 原文地址:https://www.cnblogs.com/ihongyan/p/4166039.html
Copyright © 2011-2022 走看看