在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
同时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
解决方案 »
- 关于oracle函数的写法,新手求助~~
- 4000W大数据量的读取与写入的应用
- sql分页
- 请教:扇入、扇出的概念是什么?
- 表之间数据同步问题
- 求sql语句的写法
- 创建数据库的时候,创建到60%的时候出现ORA-02084????这样错误提示(急啊,在线)
- 如何得到有多少个数据库?和每个库下的表
- 当我选“登陆到ORACLE MANAGER SERVER”后,输入正确的用户名和密码后,总提示请验证已输入ORACLE MANAGERMENT SERVER的正确主机名和状态
- ★★ 在linux中怎么启动OEM,已经添加了资料档案库,用什么命令。★★
- 正常使用的数据库服务器,Oracle 服务启动失败
- win7提示7601副本,安装不上oracle
我有点疑问你说的日志输出不是oracle的作用,但是我发现日志内容中有部分的内容都是
sqlplus 连接后输出的内容和dbms_output.put_line 输出的内容呢?
如果可以的话能帮我再帮我也解释一下sh脚本的第一句话吗?
这句话就会把控制台信息输出到日志文件中
还有重要的部分,就是日志文件里面的数字如何生成的?
因为我现在碰到的问题是数字在那里不动了(sql查询结果数据量在200万以上),日志也没写完,但是好像CSV里面的数据已经写完了,因为数据是否写完,我平时都是通过日志文件的提示,才能确认数据正确的。
大家能给解释一下吗? 或者给指明一下日志里面数字这块是关于哪方面的内容?
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以上,不建议用循环游标方式,考虑直接查询输出。
我想要输出是查询结果,就像在PLSQL Develorper将数据导出EXECLE那样的格式,上面第一行是标题,下面是数据。
要是不循环的话,如何做才能让每行的数据换行呢?
还有一点也不明白,为什么日志里面先写入了数字, 而不先写入begin 后面的
dbms_output.put_line('start at :' || TO_CHAR(SYSDATE, 'YYYY-MM-DD HH24:MM:SS'));
输出内容。
那个时候SQL还没执行...
如果start end 任何一个缺了,就表示异常了,没理由输出文件内容正确。
难道,在输出完最后一行 -> 打印 end 之间出现问题? 这机率太小了吧。最好的办法,是再调试一下,空数据量试一下逻辑、少数据量试一下结果。
都没问题,再全量调试,看能不能通过。先不考虑修改循环了,先解决眼前的问题吧。
这是卡的那个日志全部内容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
这些脚本每个月批量运行一次,而且每个月的数据都会增加,之前都是正常的
在元旦之后就出现卡的现象
比如./a1.sh &
./a2.sh &
./a3.sh &
...
单独执行没有卡的现象。
/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)时,执行该文件.