a我考网

 找回密码
 立即注册

QQ登录

只需一步,快速开始

扫一扫,访问微社区

查看: 313|回复: 0

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

[复制链接]
发表于 2012-8-4 14:06:19 | 显示全部楼层 |阅读模式
1、Oracle存储过程实例
' n4 T. X* X0 _' ACREATE OR REPLACE PROCEDURE proc_page
5 r% }& v$ I3 @( }8 N(
3 a  Z$ J+ G$ d9 ?, B9 W0 R' c       p_tblName IN VARCHAR," X7 z. B% j" d
       p_fields IN VARCHAR,# c4 Y, P8 n" M, N. d
       p_order IN VARCHAR,
$ ^2 j' i5 b( W. h4 Q& D4 f% i1 Z       p_pageSize IN INT := 10,% A' ?9 _0 w7 ~1 @
       p_pageIndex IN INT DEFAULT 1,% b% @( _7 s0 u, \4 h: \0 T
       p_rowCount OUT INT,) D" G* J/ t1 ^+ o0 w& |
       p_returnDesc OUT VARCHAR,
$ g) |3 D5 L) E/ N       p_sel_cur OUT sys_refcursor   /*在oracle中不能像mssql那样直接返回结果集查询结果必须以游标形式返回*/
0 H( m$ M. L  v1 Y% M% P)
9 c9 \, s; ^5 j$ H4 s3 y* rAS& X7 u6 E6 _8 ~$ I1 d, r
       /*AS 到 Begin部分用于声明我们在存储过程中可能用到的变量*/
( R) b8 C  }$ z6 F8 h2 [  K       v_sqlCount VARCHAR(200);2 |9 d2 D# T+ j+ a' O
       v_sql VARCHAR(300);0 K& L$ }9 _6 i$ ^6 t7 o4 x
       v_fields VARCHAR(300);: T9 y$ l- S9 E% p1 j
BEGIN
9 \6 M! C. O1 Q* {% }& p       IF(length(trim(p_tblName)) = 0) THEN  ^5 B- b2 n; y$ Q+ c" U' y8 Z8 a
               p_returnDesc := '表名必须输入!';3 D" W+ F* s2 j" c
               RETURN;  
1 u' @# O2 B+ J5 S! u  _: c, }/ @       END IF;7 Q" a/ C$ n% ?; v1 P

% p0 V( W' }% M& F" a, U/ n
0 Q$ E* ^8 h" j- G4 Z  i  W       v_sqlCount := 'select count(*) from '||p_tblName;
* g. x: w( f3 Q1 Q  d       /**动态执行sql语句并将执行结果保存到一个变量中*/4 E7 ~: t- ?0 E1 y' @
       execute immediate v_sqlCount INTO p_rowCount;
( ]! n& I8 {9 |) c; T8 ^9 _
  Y' K0 A) }5 M! V# m, p( ]. @4 L, u0 @/ ]2 Y8 P% N
       /**执行分页查询*/* ~2 u+ m3 j  @! ?  D$ J
       IF(TRIM(p_fields)='*') Then4 G# d4 I/ S) _. o2 B3 J% G
                v_fields := p_tblName||'.'||p_fields;4 f* s' x  ~+ n- `
       END IF;( n8 p* R% g) C$ S, F1 `9 ~
       IF(TRIM(p_fields)!='*') Then3 i! h8 ?9 x6 `0 |5 z7 g: z# x
                v_fields := p_fields;
1 v8 P8 L4 l. H; W/ ~! L5 R# F       END IF;6 y# _/ E) h; }" s
! V# }, Q& U6 k; S; W; i

8 ^7 _5 Z3 n. U; `* E       v_sql := 'select * from (select '||v_fields||',rownum rn from '||p_tblName||' where rownum  ';
( m1 |, ]# d- o( v5 T6 g* L       v_sql := v_sql || (p_pageIndex-1)*p_pageSize;0 G2 X2 p4 K, {# _; w, S) T
       DBMS_OUTPUT.put_line(v_sql);( ~# u" ^9 R% c7 B) v# U/ V  s
       OPEN p_sel_cur FOR v_sql;  /**将查询结果放入游标中*/
9 B- H6 h, l6 F; G+ a) CEND;
/ h1 R/ O, F+ W) U: B: F' L2、MySQl存储过程实例----(对比Oracle), `* {) M+ h/ P/ g" P0 A# B! e
drop procedure if exists proc_page;2 ]/ @% {6 w1 T8 q( L# J% A! ^) C
/**更改执行标识符,默认情况是分号,此处我们将其更改为$$*/' i2 i" M# G/ J. S8 q
delimiter $$
5 v+ D0 l2 e4 e$ s/ ~- I8 UCREATE PROCEDURE proc_page- w/ @- \# }6 ~( y, _8 O
(- {8 `9 |, r5 S! A  a
p_tblName VARCHAR(255),
6 h: Q! S2 y- G% \1 p/ H7 |4 np_fields VARCHAR(255),
/ C  m1 n3 h* [4 X/ J' u8 K3 ^p_order VARCHAR(255)," p8 H9 j8 U5 W
p_pageSize INT,5 C7 o  Y- c# S5 E: ]* Y; @/ F
p_pageIndex INT,- Z; G5 p, v( z
p_where VARCHAR(300),
# j" J5 h' c& XOUT p_returnDesc VARCHAR(500),; J4 _7 o4 G. r
OUT p_rowCount INT1 h% I6 [4 C" b; j
)/ O1 A5 t" m' o
BEGIN* m  H/ E2 \* e- l5 S
      /** 参数检查*/
9 }) p  U7 |9 f7 W+ |+ u% q1 S4 h/ EIF(LENGTH(LTRIM(RTRIM(p_tblName))) = 0) THEN
: @8 Q2 ?6 ^. P% M# g8 C& X9 N$ V  SET p_returnDesc :=  '请输入表名!';% }/ S7 Y! A8 Q: X) }
END IF;! s  i( u  e) [. [5 E. s* H
/**统计记录总数*/; ?7 H  Y. m, S  H1 a
  SET @count_sql  := concat('select count(*)  into @t_rowcount  from ',p_tblName);) Q/ A! p* w5 C/ ^" S  T$ [9 q, `/ _
IF(LENGTH(LTRIM(RTRIM(p_where))) > 0) THEN! V( o/ ]) {1 l6 Q7 R* q3 _
  SET @count_sql := concat(@count_sql,'  where  ',p_where);- l% N) W& @: s/ b( e1 F0 V, P
END IF;
' f7 _& a4 i1 h/**执行动态语句*/
( @9 z* s, T- ~PREPARE stmt_count From @count_sql;1 }8 D9 x- F' _4 f! S% m
EXECUTE stmt_count;
" G9 e. c$ U& q2 X8 R6 e; VDEALLOCATE PREPARE stmt_count;
3 s+ c' d# R. h6 Q$ ?/**将用户变量的值赋给输出变量*/
. I6 I8 R: J$ P& T+ T& Z& LSET p_rowCount := @t_rowcount;
  B. i* s9 M+ ]0 [8 |" b: A) Y/**获取分页数据*/
) N0 s. c6 ~# E: YSET @sql := concat('select  ',p_fields,'  from ',p_tblName);
2 C# n. x8 M& B4 T( w* pIF(LENGTH(LTRIM(RTRIM(p_where))) > 0) THEN
5 n% q7 I: w" b% |% t  SET @sql := concat(@sql,'  where  ',p_where);
8 @# n$ ]3 v! p, d* x' I5 ?END IF;. E6 e. \0 q+ p  E5 g, y
SET @sql := concat(@sql,' limit ',(p_pageIndex-1)*p_pageSize,' , ',p_pageSize);3 P) e5 N* a& R

" H* j6 C- r! g" R* t8 I" l8 f/ @) a7 R/ c+ X$ E
PREPARE stmt_page FROM @sql;+ F& W: R& Z3 S/ M1 Y7 ^
execute stmt_page;% @3 n2 `( x6 ?/ Z' D" f) ^$ `
DEALLOCATE PREPARE stmt_page;- I! {$ _- ^: y  A
END;5 u+ u  s1 X( v% a
$$) v+ Q6 u% w' U& R
delimiter ;
回复

使用道具 举报

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

本版积分规则

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

GMT+8, 2024-4-25 08:23 , Processed in 0.205552 second(s), 21 queries .

Powered by Discuz! X3.4 Licensed

© 2001-2017 Comsenz Inc.

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