版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
本文格式为Word版,下载可任意编辑——SybaseIQ存储过程学习笔记
实践:
SYBASEIQ存储过程学习笔记
1.存储过程
存储过程将过程化的SQL语句存储在数据库中,供所有程序使用。存储过程中可以包含控制语句,如LOOP循环语句、IF和CASE这样的条件语句。存储过程通过CALL语句进行调用,使用变量传入参数和返回结果。可以返回结果集,也可以调用其他的存储过程。
2.存储过程和函数的区别
自定义函数是只能返回单一值的特定的存储过程。函数不修改传入的参数,但是可以使其用于查询和其他SQL语句之中。
3.存储过程的调试
参见附录CDebuggingLogicintheDatabase
4.存储过程概要
?常用的存储过程?创立存储过程?修改存储过程?调用存储过程?删除存储过程
?存储过程的访问控制?返回值
?常用的存储过程
sp_iqprocedure
此存储过程可以显示系统和用户自定义的存储过程sp_iqprogram
显示存储过程的参数信息,包括结果集变量和SQLSTATE/SQLCODE错误值
?创立存储过程
CREATEPROCEDUREnew_dept(INidINT,INnameCHAR(35),INhead_idINT)BEGINEND
INSERTINTODBA.department
(dept_id,dept_name,dept_head_id)
VALUES
(id,name,head_id);
1
?修改存储过程
使用SQL语句ALTERPROCEDURE,将整个新的存储过程包含其中。必需重新给修改后的存储过程赋予用户权限。
?调用存储过程
2
CALLnew_dept(210,‘EasternSales’,902);
?删除存储过程
DROPPROCEDUREnew_dept
?存储过程的访问控制
见注(2)
?返回值
可以通过三种方式传回值:使用OUT或者INOUT返回值;返回结果集;使用RETURN语句返回单值。
3
?使用OUT和INOUT返回值
CREATEPROCEDUREAverageSalary(OUTavgsalNUMERIC(20,3))BEGIN
SELECTAVG(salary)INTOavgsalFROMemployee;END
?返回结果集
CREATEPROCEDURESalaryList(INdepartment_idINT)
4
RESULT(\1
复合语句,放在BEGIN和END之间;复合语句可以相互嵌套;复合语句用于将多个语句组合成一个单元,其中的SQL语句用分号分隔;除了最终一个分号,其他都是必需的;复合语句中声明的局部变量只在复合语句中可;可以在BEGIN后面加上ATOMIC,将复合语句声明为原子性,此时就不可使用COMMIT、ROLLBACK和ROLLBACKTOSAVEPOINT.2
必需赋予EXECUTE权限才可以执行此存储过程,GRANTEXECUTEONnew_deptTOanother_user;REVOKEEXECUTEONnew_deptFROManother_user3
调用之前,可以先声明一个变量保存结果,语句如下CREATEVARIABLEAverageNUMERIC(20,3)4
存储过程还可以返回多个同类型的结果集,必需在客户端中启用返回多个结果集的支持。例:CREATEPROCEDUREListPeople()RESULT(lnameCHAR(36),fnameCHAR(36))BEGINSELECTemp_lname,emp_fnameFROMemployee;SELECTlname,fname
BEGIN
SELECTemp_id,salaryFROMemployee
WHEREemployee.dept_id=department_id;END
假使在存储过程中一个语句动态的创立了一个临时表,然后从里面选取结果集,为了避免如“Columnnotfound〞这样的错误,必需使用EXECUTEIMMEDIATEWITHRESULTSETON这样的语法。例:
CREATEPROCEDUREp1(IN@tvarchar(30))BEGIN
EXECUTEIMMEDIATE
5
'SELECT*INTO#resultSetFROM'||@t;EXECUTEIMMEDIATEWITHRESULTSETON'SELECT*FROM#resultSet';
END
5.自定义函数
?创立自定义函数
CREATEFUNCTIONfullname(firstnameCHAR(30),lastnameCHAR(30))RETURNSCHAR(61)BEGIN
6
DECLAREnameCHAR(61);
SETname=firstname||''||lastname;RETURN(name);END
和存储过程存在3个差异
?参数不需要IN、OUT和INOUT,所有参数默认是IN?RETURNS语句指明要返回的值?RETURN语句用来返回值
?调用函数
7
SELECTfullname(emp_fname,emp_lname)FROMemployee;
?删除函数FROMcustomer;SELECTlast_name,first_nameFROMcontact;END5
动态的创立了临时表RESULTSET6
和CreateVariable不同之处在于只在BEGINEND中声明,而创立的变量在整个连接中都存在,知道连接断开或者DropVariable之后7
凡是授予了EXECUTE权限的用户都可以使用函数
DROPFUNCTIONfullname
?授予权限
GRANTEXECUTEONfullnameTOanother_user
REVOKEEXECUTEONfullnameFROManother_user
6.BATCH概要以及BATCH中可以使用的SQL语句
?什么是BATCH
由一些分号分隔的SQL语句,
8
?例1:INSERT
INTOdepartment(dept_id,dept_name)VALUES(220,'EasternSales');
UPDATEemployeeSETdept_id=220WHEREdept_id=200ANDstate='MA';
COMMIT;
?例2:BEGIN
IFNOTEXISTS(
SELECT*FROMSYSTABLE
WHEREtable_name='t1')THENCREATETABLEt1(
firstcolINTPRIMARYKEY,secondcolCHAR(30));ELSE
MESSAGE'Tablet1alreadyexists';ENDIFEND
7.控制语句
ControlstatementCompoundstatements8
SyntaxBEGIN[ATOMIC]dbisqlandbatchesAlistofsemicolon-separatedstatements,suchastheabove,isparsedbydbisqlbeforeitissenttotheserver.Inthiscase,dbisqlsendseachstatementindividuallytotheserver,notasabatch.Unlessyouhavesuchparsingcodeinyourapplication,thestatementsaresentandtreatedasabatch.PuttingaBEGINandENDaroundasetofstatementscausesdbisqltotreatthemasabatch.
statement-listEND
Conditionalexecution:IF
IFconditionTHENstatement-listELSEIFconditionTHENstatement-listELSE
statement-listENDIF
CASEexpressionWHENvalueTHENstatement-listWHENvalueTHENstatement-listELSE
statement-listENDCASE
WHILEconditionLOOPstatement-listENDLOOP
FORloop-name
AScursor-name
CURSORFORselectstatementDO
Statement-listENDFORLEAVElabel
CALLprocname(arg,...)
Conditionalexecution:CASE
Repetition:WHILE,LOOP
Repetition:FORcursorloop
Break:LEAVECALL
?使用复合语句
见注(1)
?复合语句中的声明
局部变量的声明应当紧接着BEGIN语句,可以声明如下几种类型的局部变量:?变量?游标?临时表
?异常(错误标识符)
?原子复合语句
见注(1)
8.存储过程的结构
?存储过程中的可用SQL语句
可以使用的SQL语句:
??????
SELECT,UPDATE,DELETE,INSERT,andSETVARIABLETheCALLstatementtoexecuteotherproceduresControlstatements(see“Controlstatements〞)
Cursorstatements(see“Usingcursorsinprocedures〞)
Exceptionhandlingstatements(see“Usingexceptionhandlersinprocedures〞)TheEXECUTEIMMEDIATEstatement
不可以使用的SQL语句:
??
CONNECTstatementDISCONNECTstatement
?存储过程声明参数类型
???
INOUTINOUT
?存储过程传参
CREATEPROCEDURESampleProc(...
CREATEVARIABLEV1INT;CREATEVARIABLEV2INT;CREATEVARIABLEV3INT;
v2、v3有默认值,可省略CALLSampleProc(V1);
CALLSampleProc(var1=V1,var3=V3);
INOUTvar1INTDEFAULT1,INOUTvar2intDEFAULT2,INOUTvar3intDEFAULT3)
?函数传参
?函数中可以设置默认参数,但是不能像存储过程那样通过变量名指定的方式传
入参数
?参数是传的值,非引用参数?OUT、INOUT不可用?无法返回结果集
9.返回值
?使用RETURN一个值
?使用存储过程参数返回值
?SETV1=V2
?SELECTV2INTOV1
?返回单个或者返回多个结果集
?在RESULT中声明的变量的数量必需匹配得上SELECT语句中的数量。假使类型
不匹配,会做自动转换。
?RESULT语句是CREATEPROCEDURE的一部分,不需要分隔符?SELECT语句中的名称不需要和RESULT中的进行匹配
?要让dbisql显示返回的多个结果集,必需开多个结果集返回的开关
?除非是视图上面返回的结果集,是可以修改结果集的,但是需要有对底层表操作
的权限
?返回可变结果集
RESULT语句是可选的,假使省略RESULT语句,那么就可以返回一个可变的结果集。但是,假使不需要可变结果集的话,那么就最好加上一条RESULT语句,这样可以得到更好的性能。
10.使用游标
?游标概要
1)为要执行的SELECT语句声明一个游标,或者使用DECLARE在存储过程中声明一
个游标
2)使用OPEN开启游标
3)使用FETCH一次获取一个结果集
4)RowNotFound的告警信号表示到达了行尾5)使用CLOSE关闭游标
游标会在事务的末尾自动关闭,使用WITHHOLD可以阻止关闭,直到显式关闭。存储过程sp_iqcursorinfo可以显示所有在服务器上面开启着的游标。
?游标的位置
游标可以放在三个位置上:某行/第一行前面/最终一行后面
新开一个游标时,位置处于第一行前面。使用FETCH命令,可以移动游标,如FETCHABSOLUTE、FETCHFIRST和FETCHLAST;或者使用FETCHRELATIVE、FETCHPRIOR和FETCHNEXT进行相对移动。NEXT是在FETCH命令中隐含的参数。
在UPDATE和DELETE语句中,假使游标在首行前或者末行后,那么进行操作时会出现Nocurrentrow的错误。
?在SELECT语句中使用游标
?废话版
CREATEPROCEDURETopCustomerValue
(OUTTopCompanyCHAR(36),OUTTopValueINT)BEGIN
--1.声明一个异往往量DECLAREerr_notfound
9
EXCEPTIONFORSQLSTATE'02000';--2.声明两个变量存储公司名和值DECLAREThisNameCHAR(36);DECLAREThisValueINT;
--3声明一个ThisCompnay的游标DECLAREThisCompanyCURSORFORSELECTcompany_name,
CAST(sum(sales_order_items.quantity*product.unit_price)ASINTEGER)ASvalueFROMcustomer
INNERJOINsales_order
INNERJOINsales_order_itemsINNERJOINproductGROUPBYcompany_name;--4.初始化TopValue的值SETTopValue=0;--5.开启游标OPENThisCompany;--6.循环CompanyLoop:LOOP
FETCHNEXTThisCompany
INTOThisName,ThisValue;IFSQLSTATE=err_notfoundTHENLEAVECompanyLoop;ENDIF;
IFThisValue>TopValueTHENSETTopCompany=ThisName;SETTopValue=ThisValue;ENDIF;
ENDLOOPCompanyLoop;--7.关闭游标CLOSEThisCompany;END
?精简版
CREATEPROCEDURETopCustomerValue2(9
详见Errorsandwarningsinprocedures
OUTTopCompanyCHAR(36),OUTTopValueINT)BEGIN
--InitializetheTopValuevariableSETTopValue=0;--DotheForLoopCompanyLoop:
FORCompanyForASThisCompanyCURSORFOR
SELECTcompany_nameASThisName,
CAST(sum(sales_order_items.quantity*product.unit_price)ASINTEGER)ASThisValueFROMcustomer
INNERJOINsales_order
INNERJOINsales_order_itemsINNERJOINproductGROUPBYThisNameDO
IFThisValue>TopValueTHENSETTopCompany=ThisName;SETTopValue=ThisValue;ENDIF;
ENDFORCompanyLoop;END
11.存储过程中的错误和警告
出现错误时,则是更新SQLSTATE和SQLCODE,然后返回;出现警告时,更新了上述两个变量后,继续执行。
声明异常:
DECLARE变量名EXCEPTIONFORSQLSTATE‘02000’
抛出异常:SIGNAL变量名
异常处理:
CREATEPROCEDUREInnerProc()BEGIN
DECLAREcolumn_not_found
EXCEPTIONFORSQLSTATE'52023';MESSAGE'HellofromI
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- GB/T 46824-2025农村房屋用水泥基免拆底模钢筋桁架楼承板
- 2025年乌审旗苏里格现代煤化工产业研究院招聘备考题库及一套答案详解
- 天津2025年民生银行天津分行社会招聘备考题库完整答案详解
- 2026年户外运动租赁合同
- 2026年医院LIS系统接口开发合同
- 2026年医院信息管理系统升级合同
- 2026年摄影作品使用合同
- 2026年合规管理体系认证代理合同
- 资源买断合同(标准版)
- 银联企业服务(上海)有限公司2026年度招聘备考题库参考答案详解
- 2025四川航天川南火工技术有限公司招聘考试题库及答案1套
- 广东广电网络2026届秋季校园招聘185人备考题库完整答案详解
- 2025年度皮肤科工作总结及2026年工作计划
- (一诊)成都市2023级高三高中毕业班第一次诊断性检测物理试卷(含官方答案)
- 四川省2025年高职单招职业技能综合测试(中职类)汽车类试卷(含答案解析)
- 2024江苏无锡江阴高新区招聘社区专职网格员9人备考题库附答案解析
- 2025西部机场集团航空物流有限公司招聘笔试考试备考试题及答案解析
- 植入类器械规范化培训
- 水泥罐安全操作规程标准
- 腰椎间盘突出症中医分级诊疗指南(2025版版)
- 空分考试试题及答案
评论
0/150
提交评论