(原创)Oracle编程技巧点滴
上一篇 / 下一篇 2008-06-03 10:35:23 / 个人分类:Oracle
#rp8v^.~+B0 前段时间发现自己的ORACLE实在懂的太少,除了写后台存储过程,触发器,动态试图等都是一些基本运算与查找,
p!r.g
FF0也就没接触到别的ORACLE开发方面的知识,在有空的时间进行了一次恶补,这也是本人最近所研究的一些点滴。希望
`[1I+_-O\)G0在大家开发ORACLE中能带来一定的参考。Linux宝库'Zi7R2f`&u)i
(一)以前记得如果把一个一对多的关系记录集放到一个临时表或者是具体的业务表中,会怎么去做?一般情况下就
Q6QgVE0是写一个FOR循环下将记录放到表中,不能直接把这个记录集放到这个表中,所有这样的效率很低。解决办法就是使用
~s#{|+JP0INSERT ALL.
o` [7B2lD*S0 比如现在有一个员工表(A(employee_id,employee_name,department_id,addr,.....)),一个部门表(B(department_id,Linux宝库lD-`ba/J fn1ty,g
department_name,......)),现在要求将部门名称为"事业部"下的所有员工都存储到一个临时表(C(employee_id,employee_name,
l'_rn,B0}a0Fj0department_name))中,这时可以这样来执行
&K'd
|)p5Z|o;~0f]0[sql]
)q'DdkAXF0insert all whenLinux宝库&J*moU/l`
(department_name = '事业部') then into CLinux宝库]UmtT5E
]
values
$[@*ac9tt^gY0 (department_id, employee_name, department_name)
d]6wk+ta~0 select A.department_id, A.employee_name, B.department_name
8b3oNWMe2u&UMdN0 from A, B
gCJ8}]#o(b3c/s0 where a.department_id = b.department_id
ZpiO-vq#JxeY#@*v0 and B. department_name = '事业部';Linux宝库Fy*]
^R7l#|f"|(QIK
[/sql]
7UP$j8d%E0注:这里的VALUES顺序一定要和表C的字段顺序一样,否则将会出错。
^%a,S+t@z5p_0 (二)在ORACLE中类似C/C++操作文件方法。Linux宝库f"M8~#QM7p)o2C
/**************************************************************************Linux宝库l P(e0v%Hi9Oo-b
parameter:textContext in varchar2 日志内容Linux宝库yl|,V)D`3~;s vPY
desc: ·写日志,把内容记到服务器指定目录下
2M2a-knWL0·必须配置Utl_file_dir初始化参数,并保证日志路径与Utl_file_dir路径一致或者是其中一个Linux宝库3e,x;C\N(vzx^F
****************************************************************************/Linux宝库-TPo;m#}
CREATE OR REPLACE PROCEDURE sp_Write_log(text_context VARCHAR2)
0W$Y4t:T1DCr} n0IS
6FE0T'CDF0file_handle utl_file.file_type;Linux宝库4\7AJx)skI2H4LH
Write_content VARCHAR2(1024);
;^&{T6r}0Write_file_name VARCHAR2(50);
^0AQ:g-ftE%U0BEGIN
^V*TawN$U3Y?0--open file
%fv*~i7cU0write_file_name := 'db_alert.log';
6|6|1B^ CK.x0file_handle := utl_file.fopen('/u01/logs',write_file_name,'a');
8rCoB|
l-[6@2N0write_content := to_char(SYSDATE,'yyyy-mm-dd hh24:mi:ss')||'||'||text_context;
_+h?
j9M2y8B2W0--write file
)G)m1Ad-C ?0IF utl_file.is_open(file_handle) THEN
qn%VbV%X0utl_file.put_line(file_handle,write_content);
+Ar8d|4@}d/rh0END IF;Linux宝库,BS:yO*n,c)O3D
--close file
yn\"o#Y:}*U4HQ0utl_file.fclose(file_handle);
Pg6vr8GaT
Jc*n&q0EXCEPTIONLinux宝库
Nb#} Kp-kise
WHEN OTHERS THENLinux宝库ak[;fuwK'a0|
BEGIN
*y7s M;u5sL2B0IF utl_file.is_open(file_handle) THEN
$Jf1@YY*})\0utl_file.fclose(file_handle);Linux宝库1FE WL,T
END IF;Linux宝库,`l4Vn)N
EXCEPTION
.cP R2KjtFAL9^0WHEN OTHERS THEN
[:{2yRl%y0NULL;Linux宝库U+ot-stU[!bj3A
END;
@9}
D!f*[nb5Kc0END sp_Write_log;Linux宝库1S,N+LP/m|.r
(三)用ORALCE来发送邮件Linux宝库DY:i*IN7EEF
/****************************************************************************Linux宝库m&nj7t5V
n
parameter: Rcpter in varchar2 接收者邮箱Linux宝库7g5Ml
Yf
Mail_Content in Varchar2 邮件内容Linux宝库#e9WxSH'a[h
desc: ·发送邮件到指定邮箱Linux宝库1D};T9\3[Y-`k6sl8c
·只能指定一个邮箱,如果需要发送到多个邮箱,需要另外的辅助程序Linux宝库*Ew$y5k\9d]f([E
****************************************************************************/Linux宝库f8|
Lh%R
CREATE OR REPLACE PROCEDURE sp_send_mail( rcpter IN VARCHAR2,Linux宝库&Ly?Vy
mail_content IN VARCHAR2)Linux宝库~,]\G@
IS
4k&NJPd\3}&B0conn utl_smtp.connection;
VSGf?-k9]
w0--write title
[sV~(l J!k{+m5\0PROCEDURE send_header(NAME IN VARCHAR2, HEADER IN VARCHAR2) ASLinux宝库3K2\;]K
]4DB
BEGINLinux宝库.mH1r~C#Li
utl_smtp.write_data(conn, NAME||': '|| HEADER||utl_tcp.CRLF);Linux宝库/y%pN,]7r8Ve4C
END;
X9})G}H0BEGINLinux宝库8uaMW
XpHE#?'_
--opne connectLinux宝库)Dp%Y'M0G2?0P&|k&U
conn := utl_smtp.open_connection('smtp.com');Linux宝库A;z3{6GXAtpX
utl_smtp.helo(conn, 'oracle');Linux宝库}/`K(S,[xSX
utl_smtp.mail(conn, 'oracle info');
XY7Z r2L0utl_smtp.rcpt(conn, Rcpter);
J_nDYjf0utl_smtp.open_data(conn);
ea1j%^/N#|0--write titleLinux宝库)_H.W(wS?E2Q.T B8ML/U
send_header('From', 'Oracle Database');Linux宝库(h%t,Wn7^6Y
send_header('To', '"Recipient" <'||rcpter||'>');
]?NIaDJI*w0send_header('Subject', 'DB Info');Linux宝库fKC lX
--write mail contentLinux宝库xz%n:CROdY
utl_smtp.write_data(conn, utl_tcp.crlf || mail_content);
0tF{0v_Z0--close connectLinux宝库P4y[F4sJ;z [
utl_smtp.close_data(conn);Linux宝库~V7r7[2Sc
utl_smtp.quit(conn);