a我考网

 找回密码
 立即注册

QQ登录

只需一步,快速开始

扫一扫,访问微社区

查看: 327|回复: 0

[考试辅导] Oracle数据库存储过程

[复制链接]
发表于 2012-8-4 14:06:19 | 显示全部楼层 |阅读模式
1、Oracle存储过程实例" ]) S/ a( }. i1 u/ X$ k  p
CREATE OR REPLACE PROCEDURE proc_page6 g, G/ Q( C$ G( W, K  Q
(
& E( u& `) W# U5 p       p_tblName IN VARCHAR,
- z4 f2 [% f* N- i# i       p_fields IN VARCHAR,
6 s7 S5 X  X# O2 n4 j" C& e       p_order IN VARCHAR,& F# @5 e* N1 J: d* V* `
       p_pageSize IN INT := 10,
% v0 X, a' d# V( Y' n1 f& J3 v, r       p_pageIndex IN INT DEFAULT 1,
/ W% t4 R# O/ N' H' R       p_rowCount OUT INT,+ m6 t8 j4 a: g( O# h9 D
       p_returnDesc OUT VARCHAR,
4 e8 D, _7 E/ [4 A; y: y1 B       p_sel_cur OUT sys_refcursor   /*在oracle中不能像mssql那样直接返回结果集查询结果必须以游标形式返回*/
+ K$ l# Q" _& t- T8 ~)
7 G8 d1 o, X% wAS
% S" b3 y  H3 Y  x6 ]+ H) n       /*AS 到 Begin部分用于声明我们在存储过程中可能用到的变量*/
* b4 m8 d# ~: u! o* h       v_sqlCount VARCHAR(200);! A/ K! ^9 I9 i. i' t( j! P
       v_sql VARCHAR(300);) [1 a( r: b' m% h  w
       v_fields VARCHAR(300);, R4 o/ ~9 _6 k7 r' d
BEGIN
5 G; y, H/ ^. H  J3 h0 F       IF(length(trim(p_tblName)) = 0) THEN
( [' s0 B2 Q$ ?4 ^/ o               p_returnDesc := '表名必须输入!';
4 F5 J6 o6 N2 L8 V' m, W               RETURN;  
) y8 M' ~+ Z9 n+ ~: h# b, |" _       END IF;; R1 V" u8 o6 `
/ r0 L, W6 S: m# S- y4 x, S
/ O6 F1 {2 r) h4 S% S
       v_sqlCount := 'select count(*) from '||p_tblName;: \2 R! u5 T' Q
       /**动态执行sql语句并将执行结果保存到一个变量中*/
# j0 ^4 i9 W+ }  S" X       execute immediate v_sqlCount INTO p_rowCount;
: l$ |1 w  `! o; T) ?3 ~5 N# w- R; L2 R
+ {5 A  B8 }( W6 f0 `
       /**执行分页查询*/& Z. k% ?- {1 |3 P' W6 U
       IF(TRIM(p_fields)='*') Then$ q$ `( E& r' j) {
                v_fields := p_tblName||'.'||p_fields;- A6 a$ I2 W* I" }$ ]6 k
       END IF;7 P3 D) d7 y( `3 a# V
       IF(TRIM(p_fields)!='*') Then
0 f1 I% n' e( }  c% X) D% N% Z                v_fields := p_fields;# E. e- i4 ?, a& W, ^% z, f5 `, k
       END IF;2 N/ s" d0 M: x% s  g6 ~9 s# a

! ~! b4 h- ~2 f  p6 b/ t. o, O* u5 Z* D3 u* L6 Q" {
       v_sql := 'select * from (select '||v_fields||',rownum rn from '||p_tblName||' where rownum  ';
0 E( g. \; x7 A" I/ V$ c       v_sql := v_sql || (p_pageIndex-1)*p_pageSize;
' N. X. ?' t( Y3 ]; V! d/ X       DBMS_OUTPUT.put_line(v_sql);9 a9 o* i0 d( t2 U, i' }" u! |
       OPEN p_sel_cur FOR v_sql;  /**将查询结果放入游标中*/
- E, W) r( T  s, i2 @3 p, xEND;- L) v/ x6 I2 x
2、MySQl存储过程实例----(对比Oracle): i- C  y9 }8 Q3 s
drop procedure if exists proc_page;( `" B8 f9 M! E7 F8 G  \6 s7 V
/**更改执行标识符,默认情况是分号,此处我们将其更改为$$*/0 |6 l7 X0 |; z
delimiter $$( F) h5 M1 y' b2 O8 I( ?) k
CREATE PROCEDURE proc_page
" x+ y6 Q1 s& h(
, f! k8 O) F8 h/ b4 \# p7 @p_tblName VARCHAR(255),0 E  n7 l9 N0 X7 d: D
p_fields VARCHAR(255),
$ j" v5 ^' Z+ V$ Ap_order VARCHAR(255),6 V7 U# P6 K5 Z
p_pageSize INT,2 B) [8 c; ^( l; a
p_pageIndex INT,
7 V) A% F3 m3 c, t- T- |p_where VARCHAR(300),5 k* s$ Z3 t6 j" T( r
OUT p_returnDesc VARCHAR(500),' `' [/ x6 a, c* ]( w* W: e4 D
OUT p_rowCount INT
. b% S' v6 E& J  Z" B; L/ `* Z)8 s. h0 d- A2 m4 B
BEGIN1 }) K1 u+ h7 w6 c$ o
      /** 参数检查*/
2 J* z/ {1 \! Z& hIF(LENGTH(LTRIM(RTRIM(p_tblName))) = 0) THEN! I" R- h( g0 E/ R( E6 r" X
  SET p_returnDesc :=  '请输入表名!';
0 y2 T  C# ~4 E1 l/ O- X" I7 A6 {END IF;& L5 K2 W1 _( J' K2 D
/**统计记录总数*/
0 |9 [8 Z' H+ z1 }% N# u  SET @count_sql  := concat('select count(*)  into @t_rowcount  from ',p_tblName);
& |! I5 B8 D9 fIF(LENGTH(LTRIM(RTRIM(p_where))) > 0) THEN" c( H( I* h- m$ u6 a2 f: k$ W
  SET @count_sql := concat(@count_sql,'  where  ',p_where);
/ F. l# R" i; f# R% uEND IF;
% f; e% J# M0 [$ }  g- ?0 |/**执行动态语句*/; e  [" f/ B" s* a
PREPARE stmt_count From @count_sql;/ p0 x8 b; r; M3 p1 X
EXECUTE stmt_count;8 G# J5 p& @, T4 c# e
DEALLOCATE PREPARE stmt_count;1 q- H; ~, Z: c* i* l( V' e
/**将用户变量的值赋给输出变量*/
4 \7 T: v/ J7 y% P* mSET p_rowCount := @t_rowcount;- V2 q& c8 R+ V2 l+ X2 h
/**获取分页数据*/
2 \8 Y3 ^, X" I2 W& A& v( ASET @sql := concat('select  ',p_fields,'  from ',p_tblName);1 q5 L, |& N" z- Z+ y" @1 d
IF(LENGTH(LTRIM(RTRIM(p_where))) > 0) THEN* |7 _" p; y- o- R% r# f* H
  SET @sql := concat(@sql,'  where  ',p_where);
3 j* \. D# t& V" |% @END IF;
0 ^0 }; @9 w+ p# FSET @sql := concat(@sql,' limit ',(p_pageIndex-1)*p_pageSize,' , ',p_pageSize);
' p4 |3 j) R1 B/ a. c: j# {
. `5 O) V' y. W6 b' O
) @3 Q9 l8 n! w: P. E8 r: D8 {PREPARE stmt_page FROM @sql;6 k3 s7 Y5 a1 |+ t4 E7 n
execute stmt_page;
/ h/ @& q( }$ A3 J$ pDEALLOCATE PREPARE stmt_page;) v/ g) a8 h  e) U! t3 e
END;3 q( }3 y2 C* U# Z1 Q
$$
, G) _8 N# m9 t* f4 c% Tdelimiter ;
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

Archiver|手机版|小黑屋|Woexam.Com ( 湘ICP备18023104号 )

GMT+8, 2024-6-18 19:22 , Processed in 0.182515 second(s), 21 queries .

Powered by Discuz! X3.4 Licensed

© 2001-2017 Comsenz Inc.

快速回复 返回顶部 返回列表