在linux环境下,我执行一个sh脚本后,将会去自动执行一个sql脚本(sql脚本的内容是创建目录,并在目录中创建csv文件,然后将sql查询结果,放入csv文件中,在这个过程前后使用了dbms_output.put_line 将内容写入日志文件),
同时sql脚本的运行信息写入一个日志文件。
现在问题是我看不懂,dbms_output.put_line如何写入日志文件的,请大家帮忙解释一下。谢谢!
下面是sh脚本,sql脚本内容
sh (在解释每句话的作用请同时解释两个尖括号的作用). ~/.bash_profile
sqlplus 123/123@ORA10G <../sqls/term.sql >../logs/term.logsql脚本(因为太长,写主要的信息,请帮忙解释什么时候什么信息开始往日志文件写东西, I.RESULT 是什么)set serveroutput on;
CREATE or replace DIRECTORY D_OUTPUT AS '/ora10g/data';
declare
V_FILE UTL_FILE.FILE_TYPE;
V_BUFFER VARCHAR2(32767);
BEGIN
dbms_output.put_line('start at :' || TO_CHAR(SYSDATE, 'YYYY-MM-DD HH24:MM:SS'));
V_FILE := UTL_FILE.FOPEN('D_OUTPUT', '数据文件|| TO_CHAR(SYSDATE, 'YYYY_MM_DD') || '.csv', 'w', 32767);V_BUFFER := '1,2,3';
UTL_FILE.PUT_LINE(V_FILE, V_BUFFER);
FOR I IN 
(select a || ',' || b || ',' || c RESULT from table where date >= date'2010-01-01') LOOP
UTL_FILE.PUT_LINE(V_FILE, I.RESULT);
END LOOP;
UTL_FILE.FCLOSE(V_FILE);
dbms_output.put_line('end at :' || TO_CHAR(SYSDATE, 'YYYY-MM-DD HH24:MM:SS'));
END;
/日志文件部分内容(请帮忙解释数字是怎么生成的?大小有没有限制?写数字这块是关于oracle的哪方面内容?)
SQL*Plus: Release 9.2.0.4.0 - Production on Wed Jan 26 17:01:57 2011Copyright (c) 1982, 2002, Oracle Corporation.  All rights reserved.
Connected to:
Oracle Database 10g Enterprise Edition Release 10.2.0.4.0 - 64bit Production
With the Partitioning, OLAP, Data Mining and Real Application Testing optionsSQL> SQL> 
Directory created.SQL>   2    3    4    5    6    7    8    9   10   11   12   13   14   15   16   17   18   19   20   21   22   23   24   25   26   27   28   29   30   31   32   33   34   35   36   37   38   39   40   41   42   43   44   45   46   47   48   49   50   51   52   53   54   55   56   57   58   59   60   61   62   63   64   65   66   67   68   69   70   71   72   73   74   75   76   77   78   79 
start at :2011-01-26 17:01:32
end at :2011-01-26 17:01:28PL/SQL procedure successfully completed.SQL> Disconnected from Oracle Database 10g Enterprise Edition Release 10.2.0.4.0 - 64bit Production
With the Partitioning, OLAP, Data Mining and Real Application Testing options

解决方案 »

  1.   

    两个括号是shell的语法,<代表的是以右边的文件作为输入,>代表将执行的结果输出到右边的文件。这个日志信息的输出完全不是oracle的作用。
      

  2.   

    谢谢你能帮我解释尖括号的信息
    我有点疑问你说的日志输出不是oracle的作用,但是我发现日志内容中有部分的内容都是
    sqlplus 连接后输出的内容和dbms_output.put_line 输出的内容呢?
    如果可以的话能帮我再帮我也解释一下sh脚本的第一句话吗? 
      

  3.   

    sqlplus 123/123@ORA10G <../sqls/term.sql >../logs/term.log
    这句话就会把控制台信息输出到日志文件中
      

  4.   

    脚本部分内容解决了,谢谢大家!
    还有重要的部分,就是日志文件里面的数字如何生成的?
    因为我现在碰到的问题是数字在那里不动了(sql查询结果数据量在200万以上),日志也没写完,但是好像CSV里面的数据已经写完了,因为数据是否写完,我平时都是通过日志文件的提示,才能确认数据正确的。
    大家能给解释一下吗? 或者给指明一下日志里面数字这块是关于哪方面的内容?
      

  5.   

    很明显,那数字是SQL语句里,PL/SQL块的行数。分解一下
    SQL> 
    set serveroutput on;SQL> 
    CREATE or replace DIRECTORY D_OUTPUT AS '/ora10g/data';
    Directory created.SQL> 
    declare
    V_FILE UTL_FILE.FILE_TYPE;
    V_BUFFER VARCHAR2(32767);
    BEGIN
    ........
    -- 这里的PL/SQL 输入时,会输出行号至于数字不动了,那就是PL/SQL在执行中了。 
    另外,你说的文件已经写完,但PL/SQL还没执行完,是有可能的。具体机制不是太清楚,但会有一定延时。
    再补充一下,如果是写文件,而且数据量在200W以上,不建议用循环游标方式,考虑直接查询输出。
      

  6.   

    我的脚本执行完两天天了,日志还在那里卡,应该不是延时。可能写日志的进程被杀掉了
    我想要输出是查询结果,就像在PLSQL Develorper将数据导出EXECLE那样的格式,上面第一行是标题,下面是数据。
    要是不循环的话,如何做才能让每行的数据换行呢?
    还有一点也不明白,为什么日志里面先写入了数字, 而不先写入begin 后面的
    dbms_output.put_line('start at :' || TO_CHAR(SYSDATE, 'YYYY-MM-DD HH24:MM:SS'));
    输出内容。
    那个时候SQL还没执行...
      

  7.   

    把卡住的日志发一下吧感觉不太可能,你想,按上面的逻辑,输出到文件,也会打印 start end 时间
    如果start end 任何一个缺了,就表示异常了,没理由输出文件内容正确。
    难道,在输出完最后一行 -> 打印 end 之间出现问题? 这机率太小了吧。最好的办法,是再调试一下,空数据量试一下逻辑、少数据量试一下结果。
    都没问题,再全量调试,看能不能通过。先不考虑修改循环了,先解决眼前的问题吧。
      

  8.   

    我上面给出是正常日志,卡的日志文件只有数字,没有后面的开始时间和结束时间, 就卡在数字那里,异常信息也没有。
    这是卡的那个日志全部内容SQL*Plus: Release 9.2.0.4.0 - Production on Wed Jan 26 17:01:57 2011
    Copyright (c) 1982, 2002, Oracle Corporation.  All rights reserved.
    Connected to:
    Oracle Database 10g Enterprise Edition Release 10.2.0.4.0 - 64bit Production
    With the Partitioning, OLAP, Data Mining and Real Application Testing options
    SQL> SQL> 
    Directory created.SQL>   2    3    4    5    6    7    8    9   10   11   12   13   14   15   16   17   18   19   20   21   22   23   24   25   26   27   28   29   30   31   32   33   34   35   36   37   38   39   40   41   42   43   44   45   46   47   48   49   50   51   52   53   54   55   56   57   58   59   60   61   62   63   64   65   66   67   68   69   70   71   72   73   74   75   76   77   78   79   80   81   82   83   84   85   86   87   88   89   90   91   92   93   94   95   96   97   98   99  100  101  102  103  104  105  106  107  108  109  110  111  112  113  114  115  116  117  118  119  120  121  122  123  124  125  126  127  128  129  130  131  132  133  134  135  136  137  138  139  140  141  142  143  144  145  146  147  148  149  150  151  152  153  154  155  156  157  158  159  160  161  162  163  164  165  166  167  168  169  170  171  172  173  174  175  176  177  178  179  180  181  182  183  184  185  186  187  188  189  190  191  192  193  194  195  196  197  198  199  200  201  202  203  204  205  206  207  208  209  210  211  212  213  214  215  216  217  218  219  220  221  222  223  224  225  226  227  228  229  230  231  232  233  234  235  236  237  238  239  240  241  242  243  244  245  246  247  248  249  250  251  252  253  254  255  256  257  258  259  260  261  262  263  264  265  266  267  268  269  270  271  272  273  274  275  276  277  278  279  280  281  282  283  284  285  286  287  288  289  290  291  292  293  294  295  296  297  298  299  300  301  302  303  304  305  306  307  308  309  310  311  312  313  314  315  316  317  318  319  320  321  322  323  324  325  326 
      

  9.   

    还有一个情况,就是我在批量执行sh的时候才会出现卡,而且写入对应的日志文件中有的卡有的正常
    这些脚本每个月批量运行一次,而且每个月的数据都会增加,之前都是正常的
    在元旦之后就出现卡的现象
    比如./a1.sh &
        ./a2.sh &
        ./a3.sh &
    ...
    单独执行没有卡的现象。
      

  10.   

    我是在远端的linux机子上执行的,还能做别的操作,没有死机. 
      

  11.   

    --第一句是要这个解释吗?
     /etc/profile: 此文件为系统的每个用户设置环境信息,当用户第一次登录时,该文件被执行.
    并从/etc/profile.d目录的配置文件中搜集shell的设置.
    /etc/bashrc: 为每一个运行bash shell的用户执行此文件.当bash shell被打开时,该文件被读取.
    ~/.bash_profile: 每个用户都可使用该文件输入专用于自己使用的shell信息,当用户登录时,该
    文件仅仅执行一次!默认情况下,他设置一些环境变量,执行用户的.bashrc文件.
    ~/.bashrc: 该文件包含专用于你的bash shell的bash信息,当登录时以及每次打开新的shell时,该
    该文件被读取.
    ~/.bash_logout: 当每次退出系统(退出bash shell)时,执行该文件.