Oracle存储过程总结【转】

 

代码
 Oracle存储过程总结(一、基本应用) 收藏 
1 、创建存储过程 

create   or   replace   procedure  test(var_name_1  in  type,var_name_2 out type)  as

-- 声明变量(变量名 变量类型)

begin

-- 存储过程的执行体

end  test;

打印出输入的时间信息

E.g:

create   or   replace   procedure  test(workDate  in  Date)  is

begin

dbms_output.putline(
& apos;The input date  is : & apos; || to_date(workDate, & apos;yyyy - mm - dd & apos;));

end  test;

2 、变量赋值

变量名 :
=  值;

E.g:

create   or   replace   procedure  test(workDate  in  Date)  is

number ( 4 , 2 );

 
begin

 x :
=   1

end  test;

3 、判断语句:

if  比较式  then   begin   end end   if ;

E.g

create   or   replace   procedure  test(x  in   number is

begin

        
if  x  > 0   then

         
begin

        x :
=   0   -  x;

        
end

    
end   if ;

    
if  x  =   0   then  

       
begin

        x: 
=   1 ;

    
end

    
end   if

end  test;

4 For  循环

For  ...  in  ... LOOP 

-- 执行语句 

end  LOOP; 

(
1 )循环遍历游标

create   or   replace   procedure  test()  as

Cursor   cursor   is   select  name  from  student; name  varchar ( 20 );

begin

for  name  in   cursor  LOOP 

begin

 dbms_output.putline(name);  

end

end  LOOP;

end  test;

(
2 )循环遍历数组

 
create   or   replace   procedure  test(varArray  in  myPackage.TestArray)  as

-- (输入参数varArray 是自定义的数组类型,定义方式见标题6)

number ;

begin  

i :
=   1 ;   -- 存储过程数组是起始位置是从1开始的,与java、C、C++等语言不同。因为在Oracle中本是没有数组的概念的,数组其实就是一张

-- 表(Table),每个数组元素就是表中的一个记录,所以遍历数组时就相当于从表中的第一条记录开始遍历

for  i  in   1 ..varArray. count  LOOP      

dbms_output.putline(
& apos;The No. & apos; ||  i  ||   & apos;record  in  varArray  is : & apos; || varArray(i));   

 
end  LOOP; 

end  test;

5 While  循环

while  条件语句 LOOP 

begin

end

end  LOOP;

E.g

create   or   replace   procedure  test(i  in   number as

begin

while  i  <   10  LOOP 

begin     

 i:
=  i  +   1 ;

end

end  LOOP;

 
end  test;

6 、数组

首先明确一个概念:Oracle中本是没有数组的概念的,数组其实就是一张表(
Table ),每个数组元素就是表中的一个记录。

使用数组时,用户可以使用Oracle已经定义好的数组类型,或可根据自己的需要定义数组类型。

(
1 )使用Oracle自带的数组类型

x array; 
-- 使用时需要需要进行初始化

e.g:

create   or   replace   procedure  test(y out array)  is

 x array;  

 
begin

x :
=  new array();

y :
=  x;

end  test;

(
2 )自定义的数组类型 (自定义数据类型时,建议通过创建Package的方式实现,以便于管理)

E.g (自定义使用参见标题4.
2 create   or   replace  package myPackage  is

  
--  Public type declarations   type info is record(     name varchar(20),     y number);

  type TestArray 
is   table   of  info  index   by  binary_integer;    -- 此处声明了一个TestArray的类型数据,其实其为一张存储Info数据类型的Table而已,及TestArray 就是一张表,有两个字段,一个是

name,一个是y。需要注意的是此处使用了Index 
by  binary_integer 编制该Table的索引项,也可以不写,直接写成:type TestArray  is  

table   of  info,如果不写的话使用数组时就需要进行初始化:varArray myPackage.TestArray; varArray : =  new myPackage.TestArray();

end  TestArray;

7 .游标的使用 Oracle中Cursor是非常有用的,用于遍历临时表中的查询结果。其相关方法和属性也很多,现仅就常用的用法做一二介绍:

(
1 )Cursor型游标(不能用于参数传递)

create   or   replace   procedure  test()  is    

cusor_1 
Cursor   is   select  std_name  from  student  where   ...;   -- Cursor的使用方式1   cursor_2 Cursor;

begin

select  class_name  into  cursor_2  from  class  where  ...;   -- Cursor的使用方式2

可使用For x 
in   cursor  LOOP ....  end  LOOP; 来实现对Cursor的遍历

end  test;

(
2 )SYS_REFCURSOR型游标,该游标是Oracle以预先定义的游标,可作出参数进行传递

create   or   replace   procedure  test(rsCursor out SYS_REFCURSOR)  is

cursor  SYS_REFCURSOR; name varhcar( 20 );

begin

OPEN   cursor   FOR   select  name  from  student  where  ...  -- SYS_REFCURSOR只能通过OPEN方法来打开和赋值

LOOP

 
fetch   cursor   into  name    -- SYS_REFCURSOR只能通过fetch into来打开和遍历 exit when cursor%NOTFOUND;              --SYS_REFCURSOR中可使用三个状态属性:                                         ---%NOTFOUND(未找到记录信息) %FOUND(找到记录信息)                                         ---%ROWCOUNT(然后当前游标所指向的行位置)

 dbms_output.putline(name); 

end  LOOP;

rsCursor :
=   cursor

end  test;

下面写一个简单的例子来对以上所说的存储过程的用法做一个应用:

现假设存在两张表,一张是学生成绩表(studnet),字段为:stdId,math,article,language,music,sport,total,average,step                   一张是学生课外成绩表(out_school),字段为:stdId,parctice,comment

通过存储过程自动计算出每位学生的总成绩和平均成绩,同时,如果学生在课外课程中获得的评价为A,就在总成绩上加20分。

create   or   replace   procedure  autocomputer(step  in   number is

rsCursor SYS_REFCURSOR;

commentArray myPackage.myArray;

math 
number ;

article 
number ;

language 
number ;

music 
number ;

sport 
number ;

total 
number ;

average 
number ;

stdId 
varchar ( 30 );

record myPackage.stdInfo;

number ;

begin

i :
=   1 ;

get_comment(commentArray); 
-- 调用名为get_comment()的存储过程获取学生课外评分信息

OPEN  rsCursor  for   select  stdId,math,article,language,music,sport  from  student t  where  t.step  =  step;

LOOP 

fetch  rsCursor  into  stdId,math,article,language,music,sport;  exit   when  rsCursor % NOTFOUND;

total :
=  math  +  article  +  language  +  music  +  sport;

for  i  in   1 ..commentArray. count  LOOP 

 record :
=  commentArray(i);    

if  stdId  =  record.stdId  then   

 
begin      

 
if  record.comment  =   & apos;A & apos;  then      

  
begin          

 total :
=  total  +   20 ;   

   
go   to   next -- 使用go to跳出for循环       

  
end ;     

end   if ;  

end ;  

end   if

end  LOOP;

<< continue >>   average : =  total  /   5 ;

 
update  student t  set  t.total = total  and  t.average  =  average  where  t.stdId  =  stdId; 

end  LOOP;

end ;

end  autocomputer;

-- 取得学生评论信息的存储过程

create   or   replace   procedure  get_comment(commentArray out myPackage.myArray)  is

rs SYS_REFCURSOR; 

record myPackage.stdInfo; 

stdId 
varchar ( 30 ); 

comment 
varchar ( 1 ); 

number ;

begin

open  rs  for   select  stdId,comment  from  out_school

i :
=   1 ;

LOOP

 
fetch  rs  into  stdId,comment;  exit   when  rs % NOTFOUND; 

record.stdId :
=  stdId;

 record.comment :
=  comment; 

recommentArray(i) :
=  record; 

i:
= +   1

end  LOOP;

end  get_comment;

-- 定义数组类型myArray 

create   or   replace  package myPackage  is   begin

type stdInfo 
is  record(stdId  varchar ( 30 ),comment  varchar ( 1 ));

type myArray 
is   table   of  stdInfo  index   by  binary_integer;

end  myPackage;

 

字符串函数操作



项目中有涉及存储过程对字符串的处理,所以就将在网上查找到的资料汇总,做一个信息拼接式的总结。

以下信息均来自互联网,贴出来一则自己保存以待以后使用,一则供大家分享。

字符函数——返回字符值

这些函数全都接收的是字符族类型的参数(CHR除外)并且返回字符值.

除了特别说明的之外,这些函数大部分返回VARCHAR2类型的数值.

字符函数的返回类型所受的限制和基本数据库类型所受的限制是相同的。

字符型变量存储的最大值:

 VARCHAR2数值被限制为2000字符(ORACLE 8中为4000字符)

 CHAR数值被限制为255字符(在ORACLE8中是2000)

 long类型为2GB

 Clob类型为4GB

1 、CHR

语法:  chr(x)

功能:返回在数据库字符集中与X拥有等价数值的字符。CHR和ASCII是一对反函数。经过CHR转换后的字符再经过ASCII转换又得到了原来的字

符。

使用位置:过程性语句和SQL语句。


2 、CONCAT

语法: CONCAT(string1,string2)

功能:返回string1,并且在后面连接string2。

使用位置:过程性语句和SQL语句。


3 、INITCAP

语法:INITCAP(string)

功能:返回字符串的每个单词的第一个字母大写而单词中的其他字母小写的string。单词是用.空格或给字母数字字符进行分隔。不是字母的

字符不变动。

使用位置:过程性语句和SQL语句。


4 LTRIM

语法:
LTRIM (string1,string2)

功能:返回删除从左边算起出现在string2中的字符的string1。String2被缺省设置为单个的空格。数据库将扫描string1,从最左边开始。当

遇到不在string2中的第一个字符,结果就被返回了。LTRIM的行为方式与RTRIM很相似。

使用位置:过程性语句和SQL语句。

5 、NLS_INITCAP

语法:NLS_INITCAP(string
[ ,nlsparams ]

功能:返回字符串每个单词第一个字母大写而单词中的其他字母小写的string,nlsparams

指定了不同于该会话缺省值的不同排序序列。如果不指定参数,则功能和INITCAP相同。Nlsparams可以使用的形式是:

‘NLS_SORT
= sort’

这里sort制订了一个语言排序序列。

使用位置:过程性语句和SQL语句。

6 、NLS_LOWER

语法:NLS_LOWER(string
[ ,nlsparams ]

功能:返回字符串中的所有字母都是小写形式的string。不是字母的字符不变。

      Nlsparams参数的形式与用途和NLS_INITCAP中的nlsparams参数是相同的。如果nlsparams没有被包含,那么NLS_LOWER所作的处理和

LOWER相同。

使用位置;过程性语句和SQL语句。

7 、NLS_UPPER

语法:nls_upper(string
[ ,nlsparams ]

功能:返回字符串中的所有字母都是大写的形式的string。不是字母的字符不变。nlsparams参数的形式与用途和NLS_INITCAP中的相同。如果

没有设定参数,则NLS_UPPER功能和UPPER相同。

使用位置:过程性语句和SQL语句。

8 REPLACE

语法:
REPLACE (string,search_str [ ,replace_str ]

功能:把string中的所有的子字符串search_str用可选的replace_str替换,如果没有指定replace_str,所有的string中的子字符串

search_str都将被删除。REPLACE是TRANSLATE所提供的功能的一个子集。

使用位置:过程性语句和SQL语句。

9 、RPAD

语法:RPAD(string1,x
[ ,string2 ]

功能:返回在X字符长度的位置上插入一个string2中的字符的string1。如果string2的长度要比X字符少,就按照需要进行复制。如果string2

多于X字符,则仅string1前面的X各字符被使用。如果没有指定string2,那么使用空格进行填充。X是使用显示长度可以比字符串的实际长度

要长。RPAD的行为方式与LPAD很相似,除了它是在右边而不是在左边进行填充。

使用位置:过程性语句和SQL语句。

10 RTRIM
语法:  
RTRIM (string1, [ ,string2 ]

功能:  返回删除从右边算起出现在string1中出现的字符string2. string2被缺省设置为单个的空格.数据库将扫描string1,从右边开始.当遇

到不在string2中的第一个字符,结果就被返回了RTRIM的行为方式与LTRIM很相似.

使用位置:过程性语句和SQL语句。

11 SOUNDEX

语法:  
SOUNDEX (string)

功能:  返回string的声音表示形式.这对于比较两个拼写不同但是发音类似的单词而言很有帮助.

使用位置:过程性语句和SQL语句。

12 、SUBSTR

语法:  SUBSTR(string,a
[ ,b ]

功能:  返回从字母为值a开始b个字符长的string的一个子字符串.如果a是0,那么它就被认为从第一个字符开始.如果是正数,返回字符是从左

边向右边进行计算的.如果b是负数,那么返回的字符是从string的末尾开始从右向左进行计算的.如果b不存在,那么它将缺省的设置为整个字符

串.如果b小于1,那么将返回NULL.如果a或b使用了浮点数,那么该数值将在处理进行以前首先被却为一个整数.

使用位置:过程性语句和SQL语句。

13 、TRANSLATE

   语法:  TRANSLATE(string,from_str,to_str)

   功能:  返回将所出现的from_str中的每个字符替换为to_str中的相应字符以后的string. TRANSLATE是REPLACE所提供的功能的一个超集.

如果from_str比to_str长,那么在from_str中而不在to_str中而外的字符将从string中被删除,因为它们没有相应的替换字符. to_str不能为空

.Oracle把空字符串认为是NULL,并且如果TRANSLATE中的任何参数为NULL,那么结果也是NULL.

使用位置:过程性语句和SQL语句。


14 UPPER

语法: 
UPPER (string)

功能: 返回大写的string.不是字母的字符不变.如果string是CHAR数据类型的,那么结果也是CHAR类型的.如果string是VARCHAR2类型的,那么

结果也是VARCHAR2类型的.

使用位置: 过程性语句和SQL语句。


字符函数——返回数字

这些函数接受字符参数回数字结果.参数可以是CHAR或者是VARCHAR2类型的.尽管实际下许多结果都是整数值,但是返回结果都是简单的NUMBER

类型的,没有定义任何的精度或刻度范围.

16 ASCII

语法:  
ASCII (string)

功能: 数据库字符集返回string的第一个字节的十进制表示.请注意该函数仍然称作为ASCII.尽管许多字符集不是7位ASCII.CHR和ASCII是互为

相反的函数.CHR得到给定字符编码的响应字符. ASCII得到给定字符的字符编码.

使用位置: 过程性语句和SQL语句。

17 、INSTR

语法:  INSTR(string1, string2
[ a,b ]

功能:  得到在string1中包含string2的位置. string1时从左边开始检查的,开始的位置为a,如果a是一个负数,那么string1是从右边开始进行

扫描的.第b次出现的位置将被返回. a和b都缺省设置为1,这将会返回在string1中第一次出现string2的位置.如果string2在a和b的规定下没有

找到,那么返回0.位置的计算是相对于string1的开始位置的,不管a和b的取值是多少.

使用位置: 过程性语句和SQL语句。

18 、INSTRB

语法:  INSTRB(string1, string2
[ a,[b ] ])

功能:  和INSTR相同,只是操作的对参数字符使用的位置的是字节.

使用位置: 过程性语句和SQL语句。

19 、LENGTH

语法:  LENGTH(string)

功能:  返回string的字节单位的长度.CHAR数值是填充空格类型的,如果string由数据类型CHAR,它的结尾的空格都被计算到字符串长度中间.

如果string是NULL,返回结果是NULL,而不是0.

使用位置: 过程性语句和SQL语句。

20 、LENGTHB

语法:  LENGTHB(string)

功能:  返回以字节为单位的string的长度.对于单字节字符集LENGTHB和LENGTH是一样的.

使用位置: 过程性语句和SQL语句。

21 、NLSSORT

语法: NLSSORT(string
[ ,nlsparams ]

功能: 得到用于排序string的字符串字节.所有的数值都被转换为字节字符串,这样在不同数据库之间就保持了一致性. Nlsparams的作用和

NLS_INITCAP中的相同.如果忽略参数,会话使用缺省排序.

使用位置: 过程性语句和SQL语句。

 

本文来自CSDN博客,转载请标明出处:http:
// blog.csdn.net / squirrelRao / archive / 2008 / 07 / 15 / 2654748 .aspx

 

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值