收藏 分销(赏)

oracle存储过程超详细使用基础手册.doc

上传人:w****g 文档编号:2511528 上传时间:2024-05-31 格式:DOC 页数:57 大小:184.04KB
下载 相关 举报
oracle存储过程超详细使用基础手册.doc_第1页
第1页 / 共57页
oracle存储过程超详细使用基础手册.doc_第2页
第2页 / 共57页
oracle存储过程超详细使用基础手册.doc_第3页
第3页 / 共57页
oracle存储过程超详细使用基础手册.doc_第4页
第4页 / 共57页
oracle存储过程超详细使用基础手册.doc_第5页
第5页 / 共57页
点击查看更多>>
资源描述

1、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) isbegindbms_output.putline(The input date is:|to_date(workDate, yyyy-mm-dd);end test;2、变量赋值变量名 := 值;E.g:

2、create or replace procedure test(workDate in Date) isx number(4,2);beginx := 1;end test;3、判定语句:if 比较式 then begin end; end if;E.gcreate or replace procedure test(x in number) isbeginif x 0 thenbeginx := 0 - x;end;end if;if x = 0 thenbeginx: = 1;end;end if;end test;4、For 循环For . in . LOOP-实施语句end LOOP

3、;(1)循环遍历游标create or replace procedure test() asCursor cursor is select name from student; name varchar(20);beginfor name in cursor LOOPbegindbms_output.putline(name);end;end LOOP;end test;(2)循环遍历数组create or replace procedure test(varArray in myPackage.TestArray) as-(输入参数varArray 是自定义数组类型,定义方法见标题6)i

4、number;begini := 1; -存放过程数组是起始位置是从1开始,和java、C、C+等语言不一样。因为在Oracle中本是没有数组概念,数组其实就是一张-表(Table),每个数组元素就是表中一个统计,所以遍历数组时就相当于从表中第一条统计开始遍历for i in 1.varArray.count LOOPdbms_output.putline(The No. | i |record in varArray is: |varArray(i);end LOOP;end test;5、While 循环while 条件语句 LOOPbeginend;end LOOP;E.gcreate

5、or replace procedure test(i in number) asbeginwhile i 10 LOOPbegini:= 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) isx array

6、;beginx := 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类型数据,其实

7、其为一张存放Info数据类型Table而已,及TestArray 就是一张表,有两个字段,一个是name,一个是y。需要注意是此处使用了Index by binary_integer 编制该Table索引项,也能够不写,直接写成:type TestArray istable of info,假如不写话使用数组时就需要进行初始化:varArray myPackage.TestArray; varArray := new myPackage.TestArray();end TestArray;7.游标使用 Oracle中Cursor是很有用,用于遍历临时表中查询结果。其相关方法和属性也很多,现仅就

8、常见使用方法做一二介绍:(1)Cursor型游标(不能用于参数传输)create or replace procedure test() iscusor_1 Cursor is select std_name from student where .; -Cursor使用方法1 cursor_2 Cursor;beginselect class_name into cursor_2 from class where .; -Cursor使用方法2可使用For x in cursor LOOP . end LOOP; 来实现对Cursor遍历end test;(2)SYS_REFCURSOR型游

9、标,该游标是Oracle以预先定义游标,可作出参数进行传输create or replace procedure test(rsCursor out SYS_REFCURSOR) iscursor SYS_REFCURSOR; name varhcar(20);beginOPEN cursor FOR select name from student where . -SYS_REFCURSOR只能经过OPEN方法来打开和赋值LOOPfetch cursor into name-SYS_REFCURSOR只能经过fetch into来打开和遍历 exit when cursor%NOTFOUN

10、D; -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),字段为:std

11、Id,parctice,comment经过存放过程自动计算出每位学生总成绩和平均成绩,同时,假如学生在课外课程中取得评价为A,就在总成绩上加20分。create or replace procedure autocomputer(step in number) isrsCursor SYS_REFCURSOR;commentArray myPackage.myArray;math number;article number;language number;music number;sport number;total number;average number;stdId varchar(30

12、);record myPackage.stdInfo;i number;begini := 1;get_comment(commentArray); -调用名为get_comment()存放过程获取学生课外评分信息OPEN rsCursor for select stdId,math,article,language,music,sport from student t where t.step = step;LOOPfetch rsCursor into stdId,math,article,language,music,sport; exit when rsCursor%NOTFOUND;

13、total := math + article + language + music + sport;for i in mentArray.count LOOPrecord := commentArray(i);if stdId = record.stdId thenbeginif ment = 'A' thenbegintotal := total + 20;go to next; -使用go to跳出for循环 end;end if;end;end if;end LOOP; average := total / 5;update student t set t.tota

14、l=total and t.average = average where t.stdId = stdId;end LOOP;end;end autocomputer;-取得学生评论信息存放过程create or replace procedure get_comment(commentArray out myPackage.myArray) isrs SYS_REFCURSOR;record myPackage.stdInfo;stdId varchar(30);comment varchar(1);i number;beginopen rs for select stdId,comment

15、 from out_schooli := 1;LOOPfetch rs into stdId,comment; exit when rs%NOTFOUND;record.stdId := stdId;ment := comment;recommentArray(i) := record;i:=i + 1;end LOOP;end get_comment;-定义数组类型myArraycreate or replace package myPackage is begintype stdInfo is record(stdId varchar(30),comment varchar(1);type

16、 myArray is table of stdInfo index by binary_integer;end myPackage;项目中有包含存放过程对字符串处理,所以就将在网上查找到资料汇总,做一个信息拼接式总结。以下信息均来自互联网,贴出来一则自己保留以待以后使用,一则供大家分享。字符函数返回字符值这些函数全全部接收是字符族类型参数(CHR除外)而且返回字符值.除了尤其说明之外,这些函数大部分返回VARCHAR2类型数值.字符函数返回类型所受限制和基础数据库类型所受限制是相同。字符型变量存放最大值:VARCHAR2数值被限制为字符(ORACLE 8中为4000字符)CHAR数值被限制为

17、255字符(在ORACLE8中是)long类型为2GBClob类型为4GB1、CHR语法: chr(x)功效:返回在数据库字符集中和X拥有等价数值字符。CHR和ASCII是一对反函数。经过CHR转换后字符再经过ASCII转换又得到了原来字符。使用位置:过程性语句和SQL语句。2、CONCAT语法: CONCAT(string1,string2)功效:返回string1,而且在后面连接string2。使用位置:过程性语句和SQL语句。3、INITCAP语法:INITCAP(string)功效:返回字符串每个单词第一个字母大写而单词中其它字母小写string。单词是用.空格或给字母数字字符进行分隔

18、。不是字母字符不变动。使用位置:过程性语句和SQL语句。4、LTRIM语法:LTRIM(string1,string2)功效:返回删除从左边算起出现在string2中字符string1。String2被缺省设置为单个空格。数据库将扫描string1,从最左边开始。当碰到不在string2中第一个字符,结果就被返回了。LTRIM行为方法和RTRIM很相同。使用位置:过程性语句和SQL语句。5、NLS_INITCAP语法:NLS_INITCAP(string,nlsparams)功效:返回字符串每个单词第一个字母大写而单词中其它字母小写string,nlsparams指定了不一样于该会话缺省值不一

19、样排序序列。假如不指定参数,则功效和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(str

20、ing,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所提供功效一个子集。使用

21、位置:过程性语句和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

22、中出现字符string2. string2被缺省设置为单个空格.数据库将扫描string1,从右边开始.当遇到不在string2中第一个字符,结果就被返回了RTRIM行为方法和LTRIM很相同.使用位置:过程性语句和SQL语句。11、SOUNDEX语法: SOUNDEX(string)功效: 返回string声音表示形式.这对于比较两个拼写不一样不过发音类似单词而言很有帮助.使用位置:过程性语句和SQL语句。12、SUBSTR语法: SUBSTR(string,a,b)功效: 返回从字母为值a开始b个字符长string一个子字符串.假如a是0,那么它就被认为从第一个字符开始.假如是正数,返回字

23、符是从左边向右边进行计算.假如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_

24、str中而外字符将从string中被删除,因为它们没有对应替换字符. to_str不能为空.Oracle把空字符串认为是NULL,而且假如TRANSLATE中任何参数为NULL,那么结果也是NULL.使用位置:过程性语句和SQL语句。14、UPPER语法: UPPER(string)功效: 返回大写string.不是字母字符不变.假如string是CHAR数据类型,那么结果也是CHAR类型.假如string是VARCHAR2类型,那么结果也是VARCHAR2类型.使用位置: 过程性语句和SQL语句。字符函数返回数字这些函数接收字符参数回数字结果.参数能够是CHAR或是VARCHAR2类型.尽管

25、实际下很多结果全部是整数值,不过返回结果全部是简单NUMBER类型,没有定义任何精度或刻度范围.16、ASCII语法: ASCII(string)功效: 数据库字符集返回string第一个字节十进制表示.请注意该函数仍然称作为ASCII.尽管很多字符集不是7位ASCII.CHR和ASCII是互为相反函数.CHR得到给定字符编码响应字符. ASCII得到给定字符字符编码.使用位置: 过程性语句和SQL语句。17、INSTR语法: INSTR(string1, string2a,b)功效: 得到在string1中包含string2位置. string1时从左边开始检验,开始位置为a,假如a是一个负

26、数,那么string1是从右边开始进行扫描.第b次出现位置将被返回. a和b全部缺省设置为1,这将会返回在string1中第一次出现string2位置.假如string2在a和b要求下没有找到,那么返回0.位置计算是相对于string1开始位置,不管a和b取值是多少.使用位置: 过程性语句和SQL语句。18、INSTRB语法: INSTRB(string1, string2a,b)功效: 和INSTR相同,只是操作对参数字符使用位置是字节.使用位置: 过程性语句和SQL语句。19、LENGTH语法: LENGTH(string)功效: 返回string字节单位长度.CHAR数值是填充空格类型,

27、假如string由数据类型CHAR,它结尾空格全部被计算到字符串长度中间.假如string是NULL,返回结果是NULL,而不是0.使用位置: 过程性语句和SQL语句。20、LENGTHB语法: LENGTHB(string)功效: 返回以字节为单位string长度.对于单字节字符集LENGTHB和LENGTH是一样.使用位置: 过程性语句和SQL语句。21、NLSSORT语法: NLSSORT(string,nlsparams)功效: 得到用于排序string字符串字节.全部数值全部被转换为字节字符串,这么在不一样数据库之间就保持了一致性. Nlsparams作用和NLS_INITCAP中相

28、同.假如忽略参数,会话使用缺省排序.使用位置: 过程性语句和SQL语句。oracle 存放过程基础语法1.基础结构 CREATE OR REPLACE PROCEDURE 存放过程名字( 参数1 IN NUMBER, 参数2 IN NUMBER) IS变量1 INTEGER :=0;变量2 DATE;BEGINEND 存放过程名字2.SELECT INTO STATEMENT 将select查询结果存入到变量中,能够同时将多个列存放多个变量中,必需有一条 统计,不然抛出异常(假如没有统计抛出NO_DATA_FOUND) 例子: BEGIN SELECT col1,col2 into 变量1,变

29、量2 FROM typestruct where xxx; EXCEPTION WHEN NO_DATA_FOUND THEN xxxx; END; .3.IF 判定 IF V_TEST=1 THEN BEGIN do something END; END IF;4.while 循环 WHILE V_TEST=1 LOOP BEGINXXXX END; END LOOP;5.变量赋值 V_TEST := 123;6.用for in 使用cursor . IS CURSOR cur IS SELECT * FROM xxx; BEGINFOR cur_result in cur LOOPBEGI

30、NV_SUM :=cur_result.列名1+cur_result.列名2END;END LOOP; END;7.带参数cursor CURSOR C_USER(C_ID NUMBER) IS SELECT NAME FROM USER WHERE TYPEID=C_ID; OPEN C_USER(变量值); LOOPFETCH C_USER INTO V_NAME;EXIT FETCH C_USER%NOTFOUND; do something END LOOP; CLOSE C_USER;8.用pl/sql developer debug 连接数据库后建立一个Test WINDOW 在窗

31、口输入调用SP代码,F9开始debug,CTRL+N单步调试相关oracle存放过程若干问题备忘1.在oracle中,数据表别名不能加as,如:selecta.appnamefromappinfoa;- 正确selecta.appnamefromappinfoasa;- 错误可能,是怕和oracle中存放过程中关键字as冲突问题吧2.在存放过程中,select某一字段时,后面必需紧跟into,假如select整个统计,利用游标话就另当别论了。selectaf.keynodeintoknfromAPPFOUNDATIONafwhereaf.appid=aidandaf.foundationid=

32、fid;-有into,正确编译selectaf.keynodefromAPPFOUNDATIONafwhereaf.appid=aidandaf.foundationid=fid;-没有into,编译报错,提醒:CompilationError:PLS-00428:anINTOclauseisexpectedinthisSELECTstatement3.在利用select.into.语法时,必需先确保数据库中有该条统计,不然会报出no data found异常。 能够在该语法之前,先利用select count(*) from 查看数据库中是否存在该统计,假如存在,再利用select.into

33、.4.在存放过程中,别名不能和字段名称相同,不然即使编译能够经过,但在运行阶段会报错selectkeynodeintoknfromAPPFOUNDATIONwhereappid=aidandfoundationid=fid;-正确运行selectaf.keynodeintoknfromAPPFOUNDATIONafwhereaf.appid=appidandaf.foundationid=foundationid;-运行阶段报错,提醒ORA-01422:exactfetchreturnsmorethanrequestednumberofrows5.在存放过程中,相关出现null问题假设有一个表

34、A,定义以下:createtableA(idvarchar2(50)primarykeynotnull,vcountnumber(8)notnull,bidvarchar2(50)notnull-外键);假如在存放过程中,使用以下语句:selectsum(vcount)intofcountfromAwherebid=xxxxxx;假如A表中不存在bid=xxxxxx统计,则fcount=null(即使fcount定义时设置了默认值,如:fcount number(8):=0仍然无效,fcount还是会变成null),这么以后使用fcount时就可能有问题,所以在这里最好先判定一下:iffcou

35、ntisnullthenfcount:=0;endif;这么就一切ok了。6.Hibernate调用oracle存放过程this.pnumberManager.getHibernateTemplate().execute(newHibernateCallback().publicObjectdoInHibernate(Sessionsession)throwsHibernateException,SQLException.CallableStatementcs=session.connection().prepareCall(callmodifyapppnumber_remain(?);cs.

36、setString(1,foundationid);cs.execute();returnnull;);oracle存放过程语法总结及练习-1.存放过程之ifclear;create or replace procedure mydel(in_a in integer)asbeginif in_a100 thendbms_output.put_line(小于100.);elsif in_a301;end loop;end;/set serveroutput on;beginmydel(2);end;/-1.存放过程之loop2clear;create or replace procedure

37、mydel(in_a in integer)asa integer;begina:=0;while a300 loopdbms_output.put_line(a);a:=a+1;end loop;end;/set serveroutput on;beginmydel(2);end;-1.存放过程之loop3clear;create or replace procedure mydel(in_a in integer)asa integer;beginfor a in 0.300loopdbms_output.put_line(a);end loop;end;/set serveroutput

38、 on;beginmydel(2);end;/clear;select ename,cc:=(casewhen comm=null then sal*12;else (sal+comm)*12;end case from emp order by salpersal;-clear;create or replace procedure getstudentcomments(i_studentid in int,o_comments out varchar)asexams_sat int;avg_mark int;tmp_comments varchar(100);beginselect cou

39、nt(examid) into exams_sat from studentexamwhere studentid=i_studentid;if exams_sat=0 thentmp_comments:=n/a-this student did not attend the exam!;elseselect avg(mark) into avg_mark from studentexamwhere studentid=i_studentid;casewhen avg_mark50 then tmp_comments:=very bad;when avg_mark60 then tmp_comments:=bad;when avg_mark70 then tmp_comments:=good;end case;end if;o_comments:=tmp_comments;end;/set serveroutput on;declarepp ments%type;begingetstudentcomments(8,pp);dbms_output.put_line(pp);end;/-delete from emp where empno6000;clear;create or replace procedure insertdata(in_num in integer)as

展开阅读全文
部分上传会员的收益排行 01、路***(¥15400+),02、曲****(¥15300+),
03、wei****016(¥13200+),04、大***流(¥12600+),
05、Fis****915(¥4200+),06、h****i(¥4100+),
07、Q**(¥3400+),08、自******点(¥2400+),
09、h*****x(¥1400+),10、c****e(¥1100+),
11、be*****ha(¥800+),12、13********8(¥800+)。
相似文档                                   自信AI助手自信AI助手
搜索标签

当前位置:首页 > 考试专区 > 中考

移动网页_全站_页脚广告1

关于我们      便捷服务       自信AI       AI导航        获赠5币

©2010-2025 宁波自信网络信息技术有限公司  版权所有

客服电话:4008-655-100  投诉/维权电话:4009-655-100

gongan.png浙公网安备33021202000488号   

icp.png浙ICP备2021020529号-1  |  浙B2-20240490  

关注我们 :gzh.png    weibo.png    LOFTER.png 

客服