PL/SQL语法以及程序编写介绍一、PL/SQL介绍PL/SQL是一种高级数据库程序设计语言,该语言专门用于在各种环境下对Oracle数据库进行访问。PL/SQL语言实现了将过程结构与OracleSQL的无缝集成,从而为用户提供了一种功能强大的结构化程序设计语言。二、引入PL/SQL的原因PL/SQL语言可以将第四代语言的强大功能和灵活性与第三代语言的过程结构的优势融为一体。三、PL/SQL内容PL/SQL是在SQL语言中扩充了面向过程语言中使用的程序结构,如:变量和类型(即可以予定义也可以由用户定义)控制语句(如IF-THEN-ELSE)和循环过程和函数对象类型和方法(PL/SQL8.0版本以上)四、变量的声明在PL/SQL中声明变量与其他语言不太一样,它采用从右往左的方式声明。C语言声明变量方式:intv_id;PL/SQL声明变量方式:v_idnumber;五、变量的赋值不能用”=”应该用”:=”,即形式为v_id:=5;六、数据类型PL/SQL主要用于数据库编程,所以其所有数据类型跟oracle数据库里的字段类型是一一对应的,常用的数据类型大体上有数字型、布尔型、字符型和日期型。数字型用来存储整型或者浮点型数值。范围为1E-130~10E125,其声明方式为:number[(precision,scale)]其中(precision,scale)是可选的,precision表示所有数字的个数,scale表示小数点右边数字的个数。实际数据定义在oralce中的数据7456123.89NUMBER7456123.89NUMBER(9)7456123.89NUMBER(9,2)7456123.89NUMBER(9,1)7456123.89NUMBER(6)7456123.89NUMBER(7,-2)7456123.89NUMBER(7,2)7456123.8974561247456123.897456123.9溢出7456100溢出布尔型布尔型BOOLEAN,用于逻辑判断,只有TRUE,FALSE两种值。字符型主要说明字符类型的存储格式。主要包括char、varchar2和long等几种类型。CHAR:用于描述定长的字符型数据,长度=2000字节。如果实际值不够定义的长度,系统将以空格填充。v_charchar(10):=‘abcde’;Length(v_char)=10VARCHAR2:用于描述变长的字符型数据,长度=4000字节。它的声明方式如下VARCHAR2(L),L为字符串长度,没有缺省值。v_charvarchar2(10):=‘abcde’;Length(v_char)=5NCHAR:来存储Unicode字符集的定长字符型数据,长度=1000字节。它的声明方式与CHAR相同。NVARCHAR2:用来存储Unicode字符集的变长字符型数据,长度=1000字节。它的声明方式与VARCHAR2相同。LONG:用来存储最大长度为2GB的变长字符数据。日期型DATE:用于存储日期与时间信息。虽然日期信息也可以用字符型变量或者数字型变量来表示,但是DATE型变量有它特有的属性。每一个DATE型的数据都存储了以下信息:年、月、日、小时、分钟以秒。TO_DATE函数TO_DATE函数可以将一个字符型变量按照程序员的要求转换成日期型变量。假设有一DATE类型变量v_date,现在用to_date函数将v_date赋值为2006年4月6日V_date:=to_date(‘2006-04-06’,’yyyy-mm-dd’);V_date:=to_date(‘2006-04-0610:10:10’,’yyyy-mm-ddhh24:mi:ss’);V_date:=to_date(‘20060406’,’yyyymmdd’);V_date:=to_date(‘2006/04/06’,’yyyy/mm/dd’);V_date:=to_date(‘20060406101010’,’yyyymmddhh24miss’);V_date:=to_date(‘2006/04/0610,10,10’,’yyyy/mm/ddhh24,mi,ss’);七、条件逻辑在PL/SQL中,可以使用命令if,else和elsif来控制可执行命令段的命令流。下面列出了可用的条件逻辑命令的格式(循环条件除外)格式1:if条件then命令elsif条件then命令else命令endif;格式2:if条件thenif条件then命令endif;else命令endif;总的说来除了格式上与C略有区别,其它都是一样的例:判断通过映射关系,将邮编信息填入到i_addr_zipcode字段中去ifi_area_id=1theni_addr_zipcode:='325200';elsifi_area_id=2theni_addr_zipcode:='325400';elsifi_area_id=3theni_addr_zipcode:='325800';elsifi_area_id=4theni_addr_zipcode:='325100';elsifi_area_id=5theni_addr_zipcode:='325600';elsifi_area_id=6theni_addr_zipcode:='325700';elsifi_area_id=7theni_addr_zipcode:='325300';elsifi_area_id=8theni_addr_zipcode:='325500';elsei_addr_zipcode:='325000';endif;area_idaddr_zipcode13252002325400332580043251005325600632570073253008325500其他325000八、循环在一个单独的PL/SQL代码块中可以使用循环处理多个记录。PL/SQL支持三种类型的循环。简单循环一个重复运动的循环,直到碰到循环中的exit或者exitwhen语句时才结束循环WHILE循环一个重复运行的循环,直到满足条件才退出FOR循环一个重复运行指定遍数的循环例:一个简单循环举例…i_variable:=10;i_sum:=0;loopi_sum:=i_sum+i_variable;i_variable:=i_variable–1;exitwheni_variable0;endloop;例:用while循环来完成上例…i_variable:=10;i_sum:=0;whilei_variable0loopi_sum:=i_sum+i_variable;i_variable:=i_variable–1;endloop;…例:用for循环来完成简单循环…i_variable:=10;i_sum:=0;fori_variablein0..10loopi_sum:=i_sum+i_variable;i_variable:=i_variable–1;endloop;…九、游标当查询返回结果超过一行时,就需要一个显式游标,也就是我们常说的游标。常用的游标要在程序中使用游标,大致需要以下几个步骤:1)定义游标2)打开游标3)从游标中提取数据4)关闭游标例:…i_cust_namevarchar2(20);i_cust_idnumber(13);cursorcur_cust_infoisselectname,cust_idfromcustwherests=’A’;--abegin…opencur_cust_info;--bloopfetchcur_cust_infointoi_cust_name,i_cust_id;--cexitwhencur_cust_info%notfound;…endloop;closecur_cust_info;--d…end;带参数的游标与存储过程和函数相似,可以将参数传递给游标并在查询中使用。这对于处理在某种条件下打开游标的情况非常有用例:…i_cust_namevarchar2(20);i_cust_idnumber(13);i_stsvarchar2(10):=‘A’;cursorcur_cust_info(p_stsvarchar2)isselectname,cust_idfromcustwherests=p_sts;--abegin…opencur_cust_info(i_sts);--bloopfetchcur_cust_infointoi_cust_name,i_cust_id;--cexitwhencur_cust_info%notfound;…endloop;closecur_cust_info;--d…end;REFCURSOR…i_cust_namevarchar2(20);i_cust_idnumber(13);typecur_refisrefcursor;cur_cust_infocur_ref;--abegin…opencur_cust_infoforselectname,cust_idfromcustwherests=‘A’;--bloopfetchcur_cust_infointoi_cust_name,i_cust_id;--cexitwhencur_cust_info%notfound;…endloop;closecur_cust_info;--d…end;十、PL/SQL程序编写块的介绍PL/SQL程序基本结构是块(BLOCK)所有的PL/SQL程序都是由块组成的,这些块之间还可以相互嵌套。通常,程序中的每一块都实现一个逻辑操作,从而把不同的任务进行分割,由不同的块来实现。块的结构DECLARE/*Declarativesection-PL/SQLvariables,types,cursors,andlocalsubprogramsgohere.*/--声明部分BEGIN/*Executablesection-proceduralandSQLstatementsgohere.Thisisthemainsectionoftheblockandtheonlyonethatisrequired.*/--执行部分EXCEPTION/*Exception-handlingsection-error-handlingstatementsgohere.*/--出错部分END;Declare--声明部分l_servidnumber(12);begin--执行部分forrecin(select*fromtemp_ctzj_sts_cmpwhereserv_id_97isnull)loopbeginselectserv_idfromserv_acc_nbrwherenxx_nbr=rec.nxx_nbrandline_nbr=rec.line_nbrandsts=‘A')whererownum=1;exceptionwhenno_data_foundthennull;end;beginupdatetemp_ctzj_sts_cmpsetserv_id_97=to_char(l_servid)wherenxx_nbr=rec.nxx_nbrandline_nbr=rec.line_nbr;exceptionwhenothersthendbms_output.put_line(i_servid);end;i_servid:=null;endloop;exception--出错部分whenothersthenrollback;dbms_output.put_line(SQLERRM);end;过程与函数PL/SQL的过程和函数的运行方式非常类似于其他第3代程序设计语言使用的过程和函数。它们之间具有许多共同的特征属性。总体来说,过程和函数统称为子程序。创建过程语句的语法如下所示:CREATE[ORREPLACE]PROCEDUREp