您好,欢迎访问三七文档
PL/SQL语言基础PL/SQL语言基础PL/SQL语言基础背景程序结构操作符流程控制异常处理过程与函数游标程序包触发器PL/SQL语言基础背景:结构化查询语言(StructuredQueryLanguage,简称SQL)是用来访问关系型数据库一种通用语言,属于第四代语言(4GL),其执行特点是非过程化,即不用指明执行的具体方法和途径,而是简单地调用相应语句来直接取得结果即可。显然,这种不关注任何实现细节的语言对于开发者来说有着极大的便利。然而,有些复杂的业务流程要求相应的程序来描述,这种情况下4GL就有些无能为力了。PL/SQL的出现正是为了解决这一问题,PL/SQL是一种过程化语言,属于第三代语言,它与C、C++、Java等语言一样关注于处理细节,可以用来实现比较复杂的业务逻辑。本文主要介绍PL/SQL的编程基础,以使入门者对PL/SQL语言有一个总体认识和基本把握。PL/SQL语言基础程序结构:声明部分(declarativesection)执行部分(executablesection)异常处理部分(exceptionsection)block_1Declare声明部分Begin执行部分Exception异常处理部分Endblock_1;块与块的签套ORDBMSPL/SQL:注释:单行注释(--),多行注释(/**/)标识符标识符由一个字母开始,后面同可跟随任意多的字母,数字,货币符号($),下划线(_),#等符号组成.不允许使用空格,斜线(/),短横线(-),&,%.最大长度为30个字符.字符集•大写字母A-Z和小写字母a-b•数字0-9•符号(,),+,-,*,/,,,=,!,~,^,;,:,.,’,@,”,#,$,_,|,{,},?,[,]•制表符,空格符,回车符等非显示的空间符号.ORDBMSPL/SQL:操作符与其他程序设计语言相同,PL/SQL有一系列操作符。操作符分为下面几类:算术操作符关系操作符比较操作符逻辑操作符ORDBMSPL/SQL:变量和类型变量declarevar_name[CONSTANT]data_type[NOTNULL][:=value_expression]只能在块内部访问例:declarepro_idinteger;declarepro_namevarchar2(10);declarecol1tmp_tab.col1%type---类型emp%rowtyperecord(typenameisrecord(nt,,))table(typenameistableofpro%type)---数组ORDBMSPL/SQL:数据类型:NUMBER(p,s)CHAR(n)VARCHAR2(n)BOOLEAN(TRUE,FALSE,NULL)DATETIMESTAMP(s)INTERVALYEAR(y)TOMONTHINTERVALDAY(d)TOSECOND(s)SECONDLOB%TYPE%ROWTYPERECORDTABLEORDBMSPL/SQL:条件逻辑语法:IFcondition1THENstatements1ELSIFcondition2THENstatements2ELSEstatements3ENDIF;ORDBMSPL/SQL:CASE结构CASEWHEN条件表达式1THEN语句段1WHEN条件表达式2THEN语句段2……ELSE语句段NENDCASE;ORDBMSPL/SQL:循环1.简单循环须显示结束循环2.while循环直到条件不满足时结束循环3.for循环循环预先确定的次数ORDBMSPL/SQL:简单循环[循环标签]LOOPstatementENDLOOP[循环标签];跳出循环:EXIT[循环标签]EXIT[循环标签]WHEN条件表达式ORDBMSPL/SQL:while循环[循环标签]WHILE条件表达式LOOP语句段ENDLOOP[循环标签];ORDBMSPL/SQL:for循环[循环标签]FOR循环变量IN[REVERSE]初始表达式..终值表达式LOOP语句段ENDLOOP[循环标签];ORDBMSPL/SQL:循环嵌套WHILE条件1LOOP语句段11WHILE条件2LOOP语句段2ENDLOOP;语句段12ENDLOOP;ORDBMSPL/SQL:循环嵌套LOOP语句段11WHILE条件1LOOP语句段2ENDLOOP;语句段12EXITWHEN条件2ENDLOOP;ORDBMSPL/SQL:循环嵌套FOR计数器IN上界…下界LOOP语句段11LOOP语句段2EXITWHEN条件1ENDLOOP;语句段12ENDLOOP;ORDBMSPL/SQL:GOTO语句语法:GOTO标签NULL语句语法:NULL(表示什么也不执行)ORDBMSPL/SQL:常见异常Dup_val_on_index错误码:ORA-00001描述:向有唯一性索引约束的列插入重复值Invalid_number错误码:ORA-01722描述:将字符串转换成数DUP_VAL_ON_INDEX错误码:-1描述:给唯一约束列插入重复的值ORDBMSPL/SQL:常见异常Zero_divide错误码:ORA-01476描述:用0除某个数Value_error错误码:ORA-06502描述:算术、转换、截断或大小约束错误NO_DATA_FOUND错误码:+100描述:数据不存在ORDBMSPL/SQL:常见异常TOO_MANY_ROWS错误码:-1422描述:SELECTINTO语句返回了多行INVALID_NUMBER错误码:-1722描述:字符串转换为数字时失败CASE_NOT_FOUND错误码:-6592描述:在CASE语句中不包含必须的WHERE子句,并且没有包含ELSE子句ORDBMSPL/SQL:常见异常语法:EXCEPTIONWHEN异常错误名称1[OR异常错误名称2…]THEN语句段1WHEN异常错误名称3[OR异常错误名称4…]THEN语句段2….WHENOTHERSTHEN语句段3END;ORDBMSPL/SQL:自定义异常自定义异常必须要声明,并且必须要用RAISE语句显式地引发.如:declaree_my_errorEXCEPTION;IF条件THEN语句;RAISEe_my_errorORDBMSPL/SQL:存储过程语法:Create[orreplace]procedureproc_name[(para_name[in|out|inout]type[,…..])]is|as声明部分begin执行部分;EXCEPTION异常处理部分endproc_name;(提示:声明变量variablev_nametype,传递变量‘:v_name’)ORDBMSPL/SQL:存储过程的调用variablea1varchar2(16);variablea2number;executequery_emp(7788,:a1,:a2);或declarev_a1emp.ename%type;v_a2emp.sal%type;beginquery_emp(v_name=v_a1,v_sal=v_a2,v_no=5678);end;ORDBMSPL/SQL:存储过程的查看selecttextfromuser_sourcewherename='QUERY_EMP';删除Dropprocedurequery_emp;ORDBMSPL/SQL:函数函数用于计算和返回特定的数据.可以将经常需要进行的计算写成函数.函数的调用是表达式的一部分,而过程的调用是一条PL/SQL语句.语法:create[orreplace]functionfun_name([para_name[in|out|inout)type[,….]])returntypeis|as声明部分beginstatement;endfun_name;ORDBMSPL/SQL:函数createorreplacefunctionget_salary_by_deptno(v_dept_noinemp.deptno%type,v_emp_cntoutnumber)returnnumberisv_sumnumber(10,2);beginselectsum(sal),count(*)intov_sum,v_emp_cntfromempwheredeptno=v_dept_no;returnv_sum;endget_salary_by_deptno;ORDBMSPL/SQL:调用函数variablea1number;variablea2number;execute:a1:=get_salary_by_deptno(10,:a2);printa1;printa2ORDBMSPL/SQL:调用函数declarev_a1emp.deptno%type;v_a2number;v_sumnumber(10,2);beginv_sum:=get_salary_by_deptno(v_dept_no=10,v_emp_cnt=v_a1);ifv_a1=0thendbms_output.put_line('该部门无人');elsedbms_output.put_line('该部门工资总和:'||v_sum||'人数'||v_a1);endif;end;ORDBMSPL/SQL:函数的查看selecttextfromuser_sourcewherename='GET_SALARY_BY_DEPTNO‘删除dropfunctionget_salary_by_deptno;ORDBMSPL/SQL:游标(CURSOR)可以一次访问一行记录类似于指针针对有多行记录的结果集游标的属性cursor_name%isopen游标是否打开cursor_name%found游标是否有记录cursor_name%notfound游标是否遍历完成cursor_name%rowcount记录数使用步骤1.声明游标语法:DECLARECURSORcur_nameISselect_statementORDBMSPL/SQL:使用步骤1.声明游标(续)例:DECLAREvar_empnoemp.empno%typevar_enameemp.ename%typeCURSORemp_cursorISselectempno,enamefromemporderbyempno;注意:声明游标的时候,select语句并不会被执行。放在语句块的声明段中ORDBMSPL/SQL:使用步骤2.打开游标例:OPENemp_cursor;注意:这一步真正执行select语句,放在块语句的可执行段中ORDBMSPL/SQL:使用步骤3.从游标中获取记录使用FETCH语句,将列的值读取到指定变量中一次FETCH读取一条记录语法:FETCHcursor_nameINTOvar[,var…….];例:FETCHemp_cursorINTOvar_empno,var_enameORDBMSPL/SQL:使用步骤3.从游标中获取记录(续)如果需要遍历整个结果集,则必须通过循环执行FETCH语句使用cursor_name%NOTFOUND布尔变量来判断是否已遍历完结果集,为真时代表遍历结束,应停止循环例:LOOPFETCHemp_cursorINTOvar_empno,var_ename;EXITWHENemp_cursor%NOTFOUNDENDLOOP;ORDBMSPL/SQL:使用步骤4.关闭游标释放游标所占用的系统资源例:CLOSEemp_cursorORDBMSPL/SQL:游标与FOR循环FORvar_nameINcursor_nameLOOP………ENDLOOP;ORDBMSPL/SQL:触发器执行INSERT、UP
本文标题:PLSQL语言基础
链接地址:https://www.777doc.com/doc-3514617 .html