plsql 用户完全手册.doc
《plsql 用户完全手册.doc》由会员分享,可在线阅读,更多相关《plsql 用户完全手册.doc(300页珍藏版)》请在淘文阁 - 分享文档赚钱的网站上搜索。
1、第一章 PL/SQL一览一、理解PL/SQL的主要特性了解PL/SQL最好的方法就是从简单的实例入手。下面的程序是用于处理一个网球拍订单的。首先声明一个NUMBER类型的变量来存放现有的球拍数量。然后从数据表inventory中把球拍的数量检索出来。如果数量大于零,程序就会更新inventory表,并向purchase_record表插入一条购买记录,如果数量不大于零,程序会向purchase_record表插入一条脱销(out-of-stock)记录。 DECLAREqty_on_handNUMBER(5);BEGINSELECTquantityINTOqty_on_handFROMinve
2、ntoryWHEREproduct=TENNISRACKETFORUPDATEOFquantity;IFqty_on_hand0THEN-checkquantityUPDATEinventorySETquantity=quantity-1WHEREproduct=TENNISRACKET;INSERTINTOpurchase_recordVALUES(Tennisracketpurchased,SYSDATE);ELSEINSERTINTOpurchase_recordVALUES(Outoftennisrackets,SYSDATE);ENDIF;COMMIT;END; 在PL/SQL中,可
3、以使用SQL语句来操作Oracle中的数据,并使用流程控制语句来处理数据。我们还可以声明常量和变量,定义函数和过程并捕获运行时错误。因此,PL/SQL是一种把SQL对数据操作的优势和过程化语言数据处理优势结合起来的语言。 1、块结构PL/SQL是一种块结构的语言,它的基本组成单元是一些逻辑块,而这些块又能嵌套任意数量子块。通常,每一个逻辑块都承担一部分工作任务,PL/SQL这种将问题分而治之(divide-and-conquer)的方法称为逐步求精(stepwise refinement)。块能够让我们把逻辑相关的声明和语句组织起来,声明的内容对于块来说是本地的,在块结构退出时它们会自动销毁。
4、 如下图所示,一个块分为三个部分:声明,处理,异常控制。其中,只有处理部分是必需的。首先程序处理声明部分,然后被声明的内容就可以在执行部分使用,当异常发生时,就可以在异常控制部分中对抛出的异常进行捕捉、处理。我们还可以在处理部分和异常控制部分嵌套子块,但声明部分中不可以嵌套子块。不过我们仍可以在声明部分定义本地的子程序,但这样的子程序只能由定义它们的块来调用。2、变量与常量PL/SQL允许我们声明常量和变量,但是常量和变量必须是在声明后才可以使用,向前引用(forward reference)是不允许的。 变量声明 变量可以是任何SQL类型,如CHAR,DATE或NUMBER等,也可以是PL/
5、SQL类型,BOOLEAN或BINARY_INTEGER等。声明方法如下: part_noNUMBER(4);in_stockBOOLEAN; 我们还可以用TABLE、VARRAY和RECORD这些复合类型来声明嵌套表、变长数组(缩写为varray)和记录。 变量赋值 我们可以用三种方式为变量赋值,第一种,直接使用赋值操作符:=: tax:=price*tax_rate;valid_id:=FALSE;bonus:=current_salary*0.10;wages:=gross_pay(emp_id,st_hrs,ot_hrs)-deductions; 第二种,利用数据库中查询的结果为变量赋
6、值: SELECTsal*0.10INTObonusFROMempWHEREempno=emp_id; 第三种,把变量作为一个OUT或IN OUT模式的参数传递给子程序,然后由子程序为其赋值。如下例所示,IN OUT参数可以为被调用的子程序传递初始值然后子程序将更新后的新值返回给调用程序: DECLAREmy_salREAL(7,2);PROCEDUREadjust_salary(emp_idINT,salaryINOUTREAL)IS.BEGINSELECTAVG(sal)INTOmy_salFROMemp;adjust_salary(7788,my_sal);-assignsanewval
7、uetomy_sal 声明常量 声明常量跟声明变量类似,但是要加一个CONSTANT关键字,并在声明时为其赋上初始值。下例中,我们声明一个名为credit_limit的常量: credit_limitCONSTANTREAL:=5000.00; 3、游标Oracle使用工作区(work area)来执行SQL语句,并保存处理信息。PL/SQL可以让我们使用游标来为工作区命名,并访问存储的信息。游标的类型有两种:隐式和显式。PL/SQL会为所有的SQL数据操作声明一个隐式的游标,包括只返回一条记录的查询操作。对于返回多条记录的查询,我们可以显式地声明一个游标来处理每一条记录。如下例: DECLA
8、RECURSORc1ISSELECTempno,ename,jobFROMempWHEREdeptno=20; 由多行查询返回的行集合称为结果集(result set)。它的大小就是满足我们查询条件的行的个数。如下图所示,显式游标指向当前行的记录,这可以让我们的程序每次处理一条记录。 多行查询处理有些像文件处理。例如,一个COBOL程序打开一个文件,处理记录,然后关闭文件。同样,一个PL/SQL程序打开一个游标,处理查询出来的行,然后关闭游标。就像文件指针能标记打开文件中的当前位置一样,游标能标记出结构集的当前位置。 我们可以使用OPEN,FETCH和CLOSE语句来控制游标,OPEN用于打开
9、游标并使游标指向结果集的第一行,FETCH会检索当前行的信息并把游标指移向下一行,当最后一行也被处理完后,CLOSE就会关闭游标。 4、游标FOR循环在大多需要使用显式游标的情况下,我们都可以用一个简单的游标FOR循环来代替OPEN,FETCH和CLOSE语句。首先,游标FOR循环会隐式地声明一个代表当前行的循环索引(loop index)变量。下一步,它会打开游标,反复从结果集中取得数据并放到循环索引的各个域(field)中。当所有行都被处理过以后,它就会关闭游标。下面的例子中,游标FOR循环隐式地声明了一个emp_rec记录: DECLARECURSORc1ISSELECTename,sa
10、l,hiredate,deptnoFROMemp;.BEGINFORemp_recINc1LOOP.salary_total:=salary_total+emp_rec.sal;ENDLOOP;END; 为了使用每一个查询到的行中的每一个字段,我们可以使用点标志(dot notation),它的作用就像一个域选择器。 5、游标变量游标变量的使用方式和游标类似,但更加灵活,因为它不绑定于某个特定的查询,所以可用于打开任何返回类型相兼容的查询语句。游标变量是真正的PL/SQL变量,我们可以为它赋值,把它传递给子程序。如下例,我们把游标变量作为存储过程open_cv的一个参数传进去,程序执行时,可以
11、根据choice值的不同,灵活地打开不同的查询内容。 PROCEDUREopen_cv(generic_cvINOUTgenericcurtyp,choiceNUMBER)ISBEGINIFchoice=1THENOPENgeneric_cvFORSELECT*FROMemp;ELSIFchoice=2THENOPENgeneric_cvFORSELECT*FROMdept;ELSIFchoice=3THENOPENgeneric_cvFORSELECT*FROMsalgrade;ENDIF;.END; 6、属性PL/SQL的变量和游标都有着让我们能够直接引用它们各自的数据类型或结构的属性。数
12、据库字段和表也有类似的属性。%是一个属性的指示符。 %TYPE %TYPE可以提供一个变量或数据库字段的数据类型,这在声明存放数据库值的变量时是非常有用的。假设我们要声明一个存放表books中的字段my_title的字段的变量时,就可以这样使用%TYPE属性: my_titlebooks.title%TYPE; 这样声明my_title有两个优点,第一,我们不必知道title具体类型;第二,如果我们改变了数据库中对该字段的数据类型定义的话,my_title的数据类型会在运行时做出相应的改变。 %ROWTYPE 在PL/SQL中,记录用于将逻辑相关数据组织起来。一个记录是由许多相关域的组合。%R
13、OWTYPE属性返回一个记录类型,其数据类型和数据表的数据结构相一致。这样的记录类型可以完全保存从数据表中查询(SELECT)或从游标/游标变量取出(FETCH)的行记录。 行中的字段和记录中的域对应的名称和数据类型都完全一致。下面的例子中,我们声明一个dept_rec的记录。它的域名称和数据类型与表dept中的字段名称和数据类型就完全一样。 DECLAREdept_recdept%ROWTYPE;-declarerecordvariable 我们可以使用.来引用记录中的域。 my_deptno:=dept_rec.deptno; 假设我们声明了一个用于检索雇员的名字、工资、雇用日期和职称的游
14、标,我们就可以使用%ROWTYPE来声明一个类型相同的记录,如下例: DECLARECURSORc1ISSELECTename,sal,hiredate,jobFROMemp;emp_recc1%ROWTYPE;-declarerecordvariablethatrepresents-arowfetchedfromtheemptable 当我们执行语句 FETCHc1INTOemp_rec; 表emp中ename字段的值就会赋给emp_rec的ename域,sal字段值赋给sal域,依此类推。 7、控制结构流程控制是PL/SQL对SQL的最重要的扩展。PL/SQL不仅能让我们操作Oracle数
15、据,还能让我们使用条件、循环和顺序控制语句来处理数据,如IF-THEN-ELSE,CASE,FOR-LOOP,WHILE-LOOP,EXIT-WHEN和GOTO等。 条件控制 我们经常需要根据环境来采取可选择的行动。IF-THEN-ELSE语句能让我们按照条件来执行一系列语句。IF用于检查条件;THEN决定在条件值为true的情况下执行;ELSE在条件值为false或null的情况才执行。 看一下下面的例子,这个程序用于处理银行事务。在我们从账户3取走$500元之前,它会先确认是否有足够的资金供我们支配。如果余额足够,程序就会更新账户(accounts)表的信息,否则的话,程序会向审核(aud
16、it)表插入一条余额不足的提示信息。 DECLAREacct_balanceNUMBER(11,2);acctCONSTANTNUMBER(4):=3;debit_amtCONSTANTNUMBER(5,2):=500.00;BEGINSELECTbalINTOacct_balanceFROMaccountsWHEREaccount_id=acctFORUPDATEOFbal;IFacct_balance=debit_amtTHENUPDATEaccountsSETbal=bal-debit_amtWHEREaccount_id=acct;ELSEINSERTINTOtempVALUES(ac
17、ct,acct_balance,Insufficientfunds);-insertaccount,currentbalance,andmessageENDIF;COMMIT;END; 要从多个条件值中选出对应的操作时,我们可以使用CASE结构。CASE表达式会计算条件值,然后相应的操作(这个操作有可能是一个完整的PL/SQL块)。 CASEWHENshape=squareTHENarea:=side*side;WHENshape=circleTHENBEGINarea:=pi*(radius*radius);DBMS_OUTPUT.put_line(Valueisnotexactbecaus
18、epiisirrational.);END;WHENshape=rectangleTHENarea:=LENGTH*width;ELSEBEGINDBMS_OUTPUT.put_line(Noformulatocalculateareaofa|shape);RAISEPROGRAM_ERROR;END;ENDCASE; 循环控制 LOOP语句能让我们多次执行一系列语句。LOOP循环以关键字LOOP开头,END LOOP结尾i。下面语句就是最简单的LOOP循环: LOOP-sequenceofstatementsENDLOOP; FOR-LOOP语句可以指定整数的范围,然后范围内每一个数字执行一
19、次。例如,下面的循环将向数据库表插入500个数字和它们的平方根: FORnumIN1.500LOOPINSERTINTOrootsVALUES(num,SQRT(num);ENDLOOP; WHILE-LOOP语句会按照某个条件值执行。每次循环条件值都会被计算一次,如果条件值为true,循环内的语句就会被执行,然后再次回到循环顶部,重新计算条件值。如果条件值为false或是null的话,循环就会停止,控制权被移交给下一语句。 下面的例子中,我们要找出第一个工资高于$2500的且行政级别高于雇员编号7499雇员的员工: DECLAREsalaryemp.sal%TYPE:=0;mgr_numem
20、p.mgr%TYPE;last_nameemp.ename%TYPE;starting_empnoemp.empno%TYPE:=7499;BEGINSELECTmgrINTOmgr_numFROMempWHEREempno=starting_empno;WHILEsalary25000;-exitloopifconditionistrueENDLOOP;-controlresumeshere 顺序控制 GOTO语句能让我们无条件地跳转到一个标签。标签就是一个用双尖括号夹起来的未声明标示符,它必须在一个可执行语句或是PL/SQL块之前。执行时,GOTO语句将控制权交给用标签作了标记的语句或块,
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- plsql 用户完全手册 用户 完全 手册
限制150内