版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
1、GBase 8s数据库平台 PL/SQL手册目录PL/SQL语法指南.- 1 -1.PL/SQL基础.- 1 -1.1.词法单元.- 1 -1.1.1.分隔符(Delimiters) .- 1 -1.1.2.标识符(Identifiers) .- 2 -1.1.3.文字(Literals).- 4 -1.1.4.注释(Comments) .- 5 -1.2.声明.- 6 -1.2.1.变量.- 6 -1.2.2.常量.- 7 -1.2.3.常量和变量的初始化.- 7 -1.2.4.使用NOT NULL.- 8 -1.2.5.使用%TYPE属性.- 9 -1.2.6.使用%ROWTYPE属性 .
2、- 10 -1.2.7.使用限制.- 10 -1.2.8.初始化为空值的变量.- 10 -1.2.9.具有初始值的变量和常量声明.- 11 -1.2.10.变量默认初始化为NULL .- 11 -1.2.11.声明与列相同类型的变量.- 11 -1.2.12.将相同类型的变量声明为另一个变量.- 12 -1.3.引用标识符.- 12 -1.4.命名约定.- 12 -1.4.1.作用域.- 12 -1.4.2.大小写敏感.- 13 -1.4.3.名称解析.- 13 -1.5.标识符范围.- 13 -1.5.1.标识符的范围和可见性.- 15 -1.5.2.带有块标签的重新声明的全局标识符.- 1
3、6 -1.5.3.具有子程序名的限定标识符.- 17 -1.5.4.相同的范围内的重复标识符.- 18 -1.5.5.在不同的单元中声明相同的标识符.- 18 -1.5.6.在相同的范围内使用相同名称的标签和子程序.- 19 -1.5.7.带有多个和重复标签的块.- 19 -1.6.给变量赋值.- 20 -1.6.1.用赋值语句给变量赋值.- 20 -1.6.2.用SELECT INTO语句给变量赋值.- 21 -1.6.3.IN OUT子程序参数给变量赋值 .- 21 -1.6.4.给BOOLEAN变量赋值 .- 22 -1.7.表达式.- 22 -1.7.1.连接运算符.- 23 -1.7
4、.2.操作优先级.- 23 -1.7.3.逻辑运算符.- 25 -1.7.4.短路计算.- 32 -1.7.5.比较运算符.- 32 -1.7.6.布尔表达式.- 35 -1.7.7.Case表达式.- 36 -2.数据类型.- 39 -2.1.CHAR和VARCHAR2空白填充差异 .- 39 -2.2.输出BOOLEAN值 .- 40 -2.3.SQL语句通过BOOLEAN函数调用PL/SQL函数.- 40 -2.4.PLS_INTEGER计算引发溢出异常.- 41 -2.5.防止PLS_INTEGER溢出.- 41 -2.6.违反SIMPLE_INTEGER子类型的约束 .- 42 -3
5、.控制语句.- 42 -3.1.条件控制.- 42 -3.1.1.IF THEN语句 .- 43 -3.1.2.IF THEN ELSE语句.- 43 -3.1.3.嵌套IF THEN ELSE语句.- 44 -3.1.4.IF THEN ELSIF语句.- 45 -3.1.5.IF THEN ELSIF语句模拟简单的CASE语句.- 45 -3.1.6.简单的CASE语句.- 46 -3.1.7.搜索CASE语句.- 46 -3.1.8.在CASE语句中EXCEPTION替代ELSE子句.- 47 -3.2.循环控制.- 47 -3.2.1.循环与退出循环.- 47 -3.2.2.基本LOO
6、P语句中的CONTINUE语句 .- 48 -3.2.3.基本LOOP语句中的CONTINUE WHEN语句.- 49 -3.2.4.FOR LOOP语句.- 49 -3.2.5.反向FOR LOOP语句.- 50 -3.2.6.FOR LOOP语句中模拟STEP子句 .- 51 -3.2.7.FOR LOOP语句尝试更改索引值.- 51 -3.2.8.FOR LOOP语句索引的外部语句引用.- 51 -3.2.9.FOR LOOP语句索引与变量名称相同.- 52 -3.2.10.FOR LOOP语句引用与索引相同名称的变量.- 52 -3.2.11.具有相同的索引名称的嵌套FOR LOOP语
7、句.- 53 -3.2.12.FOR LOOP语句边界.- 53 -3.2.13.在运行时指定FOR LOOP语句边界.- 54 -3.2.14.在FOR LOOP语句中的EXIT WHEN语句 .- 54 -3.2.15.在内部FOR LOOP语句中的EXIT WHEN语句 .- 54 -3.2.16.在内部FOR LOOP语句中的CONTINUE WHEN语句.- 55 -3.2.17.WHILE LOOP语句 .- 55 -3.3.顺序控制.- 56 -3.3.1.GOTO语句.- 56 -3.3.2.错误的标签位置(Incorrect Label Placement) .- 57 -3
8、.3.3.GOTO 语句转到 Labeled NULL 语句.- 57 -3.3.4.GOTO语句将控制转移到封闭块.- 57 -3.3.5.GOTO语句不能将控件转换为IF语句 .- 58 -3.3.6.NULL 语句 Showing No Action.- 58 -3.3.7.在子程序创建期间,NULL语句作为占位符 .- 59 -3.3.8.简单CASE语句的ELSE子句中的NULL语句 .- 59 -4.集合与记录.- 60 -4.1.集合.- 60 -4.1.1.集合的类型.- 60 -4.1.2.集合类型定义和变量声明.- 61 -4.1.3.初始化.- 63 -4.1.4.引用.
9、- 64 -4.1.5.赋值.- 65 -4.1.6.比较.- 66 -4.1.7.集合的方法.- 67 -4.2.记录.- 86 -4.2.1.类型定义和变量声明.- 86 -4.2.2.使用%ROWTYPE .- 86 -4.3.引用.- 88 -4.4.初始化.- 88 -4.5.赋值.- 89 -4.6.比较.- 91 -4.7.操作记录.- 91 -5.静态SQL .- 93 -5.1.静态SQL介绍 .- 93 -5.1.1.简单的一个例子.- 93 -5.1.2.伪列.- 94 -5.2.游标概述.- 95 -5.2.1.隐式游标.- 95 -5.2.2.显式游标.- 97 -5
10、.3.处理结果集.- 104 -5.3.1.SELECT INTO语句处理结果集.- 105 -5.3.2.FOR LOOP语句处理结果集.- 106 -5.3.3.OPEN-FETCH-CLOSE .- 108 -5.3.4.处理带有子查询的结果集.- 108 -5.4.游标变量.- 110 -5.4.1.创建游标变量.- 110 -5.4.2.Open and Close .- 111 -5.4.3.Fetch .- 112 -5.4.4.游标变量赋值.- 113 -5.4.5.游标查询中的变量.- 114 -5.4.6.游标变量的属性.- 116 -5.4.7.子函数的参数.- 116
11、-6.动态SQL .- 117 -6.1.使用EXECUTE IMMEDIATE .- 117 -6.2.使用游标语法.- 119 -7.错误处理.- 119 -7.1.PL/SQL运行时的错误处理概述.- 119 -7.2.预定义异常.- 120 -7.3.自定义异常.- 121 -7.3.1.声明异常.- 121 -7.3.2.PL/SQL异常的作用域规则.- 122 -7.3.3.定义自己的错误消息.- 124 -7.4.如何抛出异常.- 125 -7.5.异常如何传播.- 125 -7.6.重新抛出异常.- 127 -7.7.处理抛出的异常.- 128 -7.7.1.在声明部分抛出的异
12、常.- 129 -7.7.2.处理在异常处理程序中抛出的异常.- 130 -7.7.3.GOTO语句和异常处理.- 130 -PL/SQL语法指南本文描述GBase 8s PL/SQL语法,包括PL/SQL支持的数据类型,变量声明、赋值语法,顺序、选择、循环分支语法,集合、记录对象的使用,静态SQL、动态SQL语法以及错误处理等。GBase 8s 当前版本所支持的 PL/SQL 语法与Oracle完全一致,原Oracle存储过程可直接迁移,当前版本支持之外的语法,后续会不断完善。本资料主要针对以下用户:数据库用户数据库管理员数据库安全性管理员数据库应用程序员本文档假设您具有以下背景:具有计算机
13、、操作系统和操作系统提供的实用程序的工作知识使用过关系数据库或接触过数据库概念具有一些计算机编程经验PL/SQL基础词法单元它有自己特定的元素,如下所示:分隔符(Delimiters)标识符(Identifiers)文字(Literals)注释(Comments)分隔符(Delimiters)分隔符用于标记词法元素之间的分割,可以是一个字符,也可以是由多个字符组合组成的,都有特殊的意义,例如“+”。MeaningDelimiter+Addition operator:=Assignment operator=Association operator%Attribute indicatorCha
14、racter string delimiter.Component indicator|Concatenation operator/Division operator*Exponentiation operator(Expression or list delimiter (begin)Expression or list delimiter (end):Host variable indicator,Item separatorLabel delimiter (end)/*Multiline comment delimiter (begin)*/Multiline comment deli
15、miter (end)*Multiplication operatorQuoted identifier delimiter.Range operator=Relational operator (equal)Relational operator (not equal)!=Relational operator (not equal)=Relational operator (not equal)=Relational operator (not equal)Relational operator (greater than)=Relational operator (greater tha
16、n or equal)Remote access indicator-Single-line comment indicator;Statement terminator-Subtraction or negation operator标识符(Identifiers)标识符用于命名PL/SQL语法单元,包括:常量变量异常游标关键字标签保留字类型标识符中的每个字符都是有意义的,例如lastname和last_name是不同的。必须通过一个或多个空白或者一个标点符号来分隔相邻的标识符。标识符的大小写是不敏感的。例如lastname、Lastname、LASTNAME是相同的。保留字和关键字PL/S
17、QL中有一些具有特殊意义的标识符,被称作保留字和关键字。不能使用保留字做为用户定义的标识符。可以用关键字作为用户定义的标识符。用户自定义保留字PL/SQL标识符的长度限制,请参照GBase 8s语法。用户标识符:以字符开头可以包含字母、数字和$,#,_字符不能为保留字Xt2 phone#credit_limit LastName oracle$number money$tree SN#try_again_例如以下是可接受的标识符:PL/SQL不容许在标识符中使用分隔符,如下所示:mine&yours - ampersand (&) is not alloweddebit-amount - hy
18、phen (-) is not allowed on/off - slash (/) is not alloweduser id - space is not allowedlastname LastName LASTNAMEPL/SQL对标识符不区分大小写,PL/SQL认为下面命名是相同的。例子每个字符都是有意义的。例如,PL/SQL考虑以下是不同的。例子。lastname last_name- 易懂- 难懂cost_per_thousandcpt为了让PL/SQL程序更加易读,取名要有意义。例如文字(Literals)文字就是一个数字、字符、字符串、或布尔值。它本身是数据不是对数据的引用。
19、文字也不是用标识符来标识,当然也不是计算出来的。例,123,abc是字面量,而1+2不是。变量分为数值变量、字符变量、字符串变量和布尔变量。字符串和字符文字是大小敏感的空白字符也被考虑0和9不同于数值0-9,然而可系统以将他们转换为整数,所以可以应用于算术表达式中有0个字符的文字的值为NULL,成为空字符串,他与BOOLEAN的NULL是不同的数值算术表达式中可以使用两种数字变量:整数和浮点数,可以参照GBase8s语法。030 6 -14 0 +32767整数:浮点数6.6667 0.0 -12.0 3.14159 +8300.00 0.5 25.0字符字符变量是由单引号()括起的单个字符。
20、字符变量包括PL/SQL字符集中的所有可打印字符:字母,数字、空格和特殊符号。具体可以参照GBase8s语法。Z % 7 z (PL/SQL在字符变量中区分大小写。例如,PL/SQL的变量Z和z是不同的。另外,字符变量09不是等同于整型变量,但可以在算术表达式中使用,因为它们隐式转换为整数。字符串字符串由零个或多个字符组成的序列,用单引号括起来,可以参照GBase8s语法。全部除空字符串()外的字符串文本具有数据类型CHAR。Hello, world! XYZ Corporation 10-NOV-91He said Life is like licking honey from a thor
21、n. $1,000,000PL/SQL在字符串变量中区分大小写。例如,baker和Baker不同的。Im a string, youre a string.要表示字符串中的撇号,可以写两个单引号,即不等于写双引号:布尔布尔变量是预定义的值TRUE、FALSE和NULL。NULL代表缺少、未知或不适用的值。记住,布尔文字是值,而不是字符串。Date and Time 变量根据数据类型的不同,日期时间文本有多种格式,可以参照GBase8s语法。注释(Comments)PL/SQL编译器忽略注释。向程序添加注释可以增强可读性。通常,使用注释来描述每个代码段的用途,也可以将代码通过注释禁用。单行注释D
22、ECLAREhowmany NUMBER; num_tables NUMBER;BEGIN- Begin processing开始于-,一直到行为结束,例子如下所示:SELECT COUNT(*) INTO howmany FROM USER_OBJECTSWHERE OBJECT_TYPE = TABLE; - Check number of tables num_tables := howmany; - Compute some other valueEND;多行注释DECLAREsome_condition BOOLEAN; pi NUMBER := 3.1415926;radius N
23、UMBER := 15; area NUMBER;BEGIN/* Perform some simple tests and assignments */ IF 2 + 2 = 4 THENsome_condition := TRUE;/* We expect this THEN to always be performed */ END IF;/* The following line computes the area of a circle using pi, which is the ratio between the circumference and diameter.After
24、the area is computed, the result is displayed. */ area := pi * radius*2;DBMS_OUTPUT.PUT_LINE(The area is: | TO_CHAR(area); END;注释可以用多行, /*注释内容*/,例子如下所示:声明PL/SQL程序将值存储在变量和常量中。当程序执行时变量的值可以更改,但常量的值不能更改。声明为值分配存储空间,指定其数据类型,并命名存储位置,以便后续可以引用它。变量变量声明需要指定变量名称和数据类型。对于大多数据类型,声明变量也可以指定初始值。变量名称必须是有效的用户定义标识符。数据类型
25、可以是任何PL/SQL数据类型。数据类型可以是简单地(SCALAR),也可以是复合的。赋值运算符后面的表达式可以任意复杂,并且可以引用以前初始化的变量。每次执行程序时,都会初始化变量。DECLARE例如:birthday DATE;emp_count SMALLINT := 0; pi REAL := 3.14159;radius REAL := 1;area REAL := pi * radius*2; BEGINNULL; END;DECLAREpart_number NUMBER(6);- SQL data type part_name VARCHAR2(20);- SQL data t
26、ypein_stock BOOLEAN;- PL/SQL-only data typepart_price NUMBER(6,2);- SQL data type part_description VARCHAR2(50); - SQL data typeBEGINNULL; END;例如:常量声明常量时,需要将关键字CONSTANT放在类型说明符之前。常量必须在其声明中初始化。这个下面的例子声明命名了实数类型的常量,并指定了DECLAREcredit_limit CONSTANT REAL := 5000.00; max_days_in_year CONSTANT INTEGER := 36
27、6; urban_legend CONSTANT BOOLEAN := FALSE;BEGINNULL; END;一个不可更改的值5000给常数。常量和变量的初始化在变量的声明中初始化时可选的。除非指定NO NULL。在常量中初始化时必须的。常量不指定初始值,默认就为NULL。使用:=和DEFAULT关键字进行初始化。后边跟表达DECLAREhours_worked INTEGER := 40; employee_count INTEGER := 0; pi CONSTANT REAL := 3.14159;式,表达式可以包含前面已经声明的常量或已经初始化的变量。radius REAL :=
28、1;area REAL := (pi * radius*2); BEGINNULL; END;-Result-counter is NULLDBMS_OUTPUT.PUT_LINE(counter is NULL.); END IF;END;- NULL + 1 is still NULL- initial value is NULL by defaultDECLAREcounter INTEGER; BEGINcounter := counter + 1;IF counter IS NULL THENDECLAREblood_type CHAR DEFAULT O;- Same as blo
29、od_type CHAR := O; hours_worked INTEGER DEFAULT 40; - Typical valueemployee_count INTEGER := 0;- No typical value BEGINNULL; END;使用NOT NULL声明可以强制使用NOT NULL约束,这会阻止分配空值给变量。因为变量默认初始化为空,所以指定NOT NULL的声明还必须指定默认值。例子,DECLAREacct_id INTEGER(4) NOT NULL := 9999; a NATURALN := 9999;b POSITIVEN := 9999;c SIMPLE
30、_INTEGER := 9999; BEGINNULL; END;DECLAREnull_string VARCHAR2(80) := TO_CHAR();把任意长度为0的字符串看做NULL,包含字符函数和BOOLEAN的返回值address VARCHAR2(80);zip_code VARCHAR2(80) := SUBSTR(address, 25, 0); name VARCHAR2(80);valid BOOLEAN := (name != ); BEGINNULL; END;-都是NULL使用%TYPE属性%TYPE可以用来声明与先前声明的变量或者列具有同样数据类型的变量,而不需要
31、知道具体数据类型。referencing_item referenced_item%TYPE;如果被引用的成员改变了,声明的引用成员随之改变。引用成员从被引用成员继承了:数据类型和大小约束(除了被引用衬衣是表或视图的列)引用成员不继承别引用成员的初始值,如果引用成员被指定了NOT NULL约束,那就必须在声明时指定初始值。variable_name table_name.column_name%TYPE;DECLAREsurname employees.last_name%TYPE; BEGINDBMS_OUTPUT.PUT_LINE(surname= | surname); END;-Res
32、ult:-surname=DECLAREname VARCHAR(25) NOT NULL := Smith;surname name%TYPE := Jones; BEGINDBMS_OUTPUT.PUT_LINE(name= | name); DBMS_OUTPUT.PUT_LINE(surname= | surname);END;-Result:-name=Smith-surname=Jones使用%ROWTYPE属性%ROWTYPE属性允许您声明表示表中某行的记录。对于引用的表或视图中的每一列,记录都有一个字段相同的名称和数据类型。要引用记录中的字段,请使用record_名称.字段名。
33、记录字段不继承约束或默认值对应的列。如果引用的项表或视图更改,则声明将自动更新variable_name table_name%TYPE;语法例如:DECLAREemp_rec emp%ROWTYPE; CURSOR c1 ISSELECT deptno, dname, loc FROM dept; dept_rec c1%ROWTYPE;BEGINNULL END;使用限制maxi INTEGER := 2 * mini; - not allowed mini INTEGER := 15;不允许向前引用。下面的声明是不合法的下面的声明也是不允许的j, k SMALLINT ; - not a
34、llowed初始化为空值的变量所有变量都被初始化为NULL。DECLAREnull_string VARCHAR2(80) := TO_CHAR(); address VARCHAR2(80);zip_code VARCHAR2(80) := SUBSTR(address, 25, 0); name VARCHAR2(80);valid BOOLEAN := (name != ); BEGINNULL; END;具有初始值的变量和常量声明将初始值分配给它声明的常量和变量。ares初始值依赖于前面声明的常数pi和先前初始化的变量radius。DECLAREhours_worked INTEGER
35、 := 40; employee_count INTEGER := 0; pi CONSTANT REAL := 3.14159;radius REAL := 1;area REAL := (pi * radius*2); BEGINNULL; END;变量默认初始化为NULL在本例中,默认情况下, counter 变量的初始值为NULL。该示例使用“IS NOT NULL Operator”来显示NULL与0不同。DECLAREcounter INTEGER; - initial value is NULL by default BEGINcounter := counter + 1; -
36、NULL + 1 is still NULL IF counter IS NULL THENDBMS_OUTPUT.PUT_LINE(counter is NULL.); END IF;END;-Result:-counter is NULL声明与列相同类型的变量在本例中,surname变量继承了变量name的数据类型、大小和 NOT NULL约束。因DECLAREsurname employees.last_name%TYPE; BEGINDBMS_OUTPUT.PUT_LINE(surname= | surname); END;为 surname 没有继承名称的初始值,所以它的声明需要一个
37、初始值(不能超过25个字符)。-Result:-surname=将相同类型的变量声明为另一个变量在本例中,surname变量继承了变量name的数据类型、大小和 NOT NULL约束。因为 surname 没有继承name的初始值,所以它的声明需要一个初始值(不能超过25个字符)。DECLAREname VARCHAR(25) NOT NULL := Smith;surname name%TYPE := Jones; BEGINDBMS_OUTPUT.PUT_LINE(name= | name); DBMS_OUTPUT.PUT_LINE(surname= | surname);END;-Re
38、sult:-name=Smith-surname=Jones引用标识符使用标识符时,可以是简单的名称和使用限定符的名称。可以使用简单名称来引用一个标识符。DELCLAREa integer;BEGINa:=1; END;Unit_name.simple_identifier_name如果在已经命名的单元里声明的标识符,则可以使用限定名来引用他。使用方法如下命名约定作用域同一作用域内声明的标识符必须是唯一的。即使是数据类型不同,变量名或参数名也不能相同。例如:valid_id BOOLEAN ;valid_id VARCHAR2(5); - not allowed duplicate ident
39、ifier大小写敏感zip_code INTEGER ;ZIP_CODE INTEGER ; - same as zip_code与所有标识符一样,常量、变量和参数的名称是大小写不敏感的名称解析在有二义性的SQL语句中,数据库列的名称优先于局部变量和形参。例如,如果在WHERE子句中使用使用名字相同的变量和列,SQL将这两个名称都视为具有相同名称的列。下面的DELETE语句会从EMP表中删除所有雇员的信息。而不是只删除KING的雇员。DECLAREename VARCHAR2(10) := KING; BEGINDELETE FROM empWHERE ename = ename; END D
40、ECLAREename VARCHAR2(10) := KING; BEGINDELETE FROM empWHERE ename = main.ename; END可通过改变变量的名字或者加入标签避免,例如:标识符范围对标识符的引用可以通过作用域和可见度来进行解析。作用域:引用标识符的程序单元区域。可见度:一个标识符只有在他的作用域内才能可见。可以在作用域内不使用限定词而直接引用。如下图:声明的标识符对于所在块就是本地的,对于子块就是全局的。如果全局标识符在子块中重新定义,那么两个变量在子块的作用域都是存在的,但只有本地标识符是可见的,如果这时候想引用全局标识符,就要加限定符。虽然不能再同一
41、块中两次声明同一标识符, 但可以在不同的块中声明同一标识符。这两个标识符是相互独立的,互不影响。但一个块中不能引用另一同级别块中的变量。因为对他而言,同级块中的标识符既不是本地也不是全局的。-Outer block:DECLAREa CHAR; - Scope of a (CHAR) begins b REAL; - Scope of b beginsBEGIN- Visible: a (CHAR), b- First sub-block:DECLAREa INTEGER; - Scope of a (INTEGER) begins c REAL; - Scope of c beginsBEG
42、IN- Visible: a (INTEGER), b, c NULL;END; - Scopes of a (INTEGER) and c end- Second sub-block:DECLAREd REAL; - Scope of d begins BEGIN- Visible: a (CHAR), b, d NULL;END; - Scope of d ends- Visible: a (CHAR), bEND; - Scopes of a (CHAR) and b end - label DECLAREbirthdate DATE := TO_DATE(09-AUG-70, DD-M
43、ON-YY); BEGINDECLAREbirthdate DATE := TO_DATE(29-SEP-70, DD-MON-YY); BEGINIF birthdate = outer.birthdate THEN DBMS_OUTPUT.PUT_LINE (Same Birthday);ELSEDBMS_OUTPUT.PUT_LINE (Different Birthday); END IF;END; END;-Result:-Different Birthday标识符的范围和可见性这个示例展示了几个标识符的范围和可见性。第一个子块重新声明全局标识符a。为了引用全局变量a,第一个子块必须
44、使用外部块的名称来限定它,但是外部块没有名称。因此,第一个子块不能引用全局变量a;它只能引用其局部变量a,因为子块在同一层,第一个子块不能引用d,第二个子块不能引用c。- Outer block:DECLAREa CHAR;- Scope of a (CHAR) begins b REAL;- Scope of b beginsBEGIN- Visible: a (CHAR), b- First sub-block:DECLAREa INTEGER; - Scope of a (INTEGER) begins c REAL;- Scope of c beginsBEGIN- Visible:
45、a (INTEGER), b, c NULL;END;- Scopes of a (INTEGER) and c end- Second sub-block:DECLAREd REAL;- Scope of d begins BEGIN- Visible: a (CHAR), b, d NULL;END;- Scope of d ends- Visible: a (CHAR), bEND;- Scopes of a (CHAR) and b end带有块标签的重新声明的全局标识符这个示例将外部块标记为OUTER。因此,在子块重新声明全局变量birthdate之后,它可以通过限定它的名称和块标签
46、来引用这个全局变量。子块也可以通过它的简单名称引用它的局部变量birthdate。 - label DECLAREbirthdate DATE := TO_DATE(09-AUG-70, DD-MON-YY); BEGINDECLAREbirthdate DATE := TO_DATE(29-SEP-70, DD-MON-YY); BEGINIF birthdate = outer.birthdate THEN DBMS_OUTPUT.PUT_LINE (Same Birthday);ELSEDBMS_OUTPUT.PUT_LINE (Different Birthday); END IF;E
47、ND;END;-Result:-Different Birthday具有子程序名的限定标识符在本例中,过程check_credit声明了一个变量rating和一个函数check_rating。函数重新声明变量。然后,函数通过使用过程名对全局变量进行引用。CREATE OR REPLACE PROCEDURE check_credit (credit_limit NUMBER) AS rating NUMBER := 3;FUNCTION check_rating RETURN BOOLEAN IS rating NUMBER := 1;over_limit BOOLEAN; BEGINIF c
48、heck_credit.rating = credit_limit THEN - reference global variable over_limit := FALSE;ELSEover_limit := TRUE;rating := credit_limit; - reference local variable END IF;RETURN over_limit; END check_rating;BEGINIF check_rating THEN DBMS_OUTPUT.PUT_LINE(Credit rating over limit ( | TO_CHAR(credit_limit
49、) | ). | Rating: | TO_CHAR(rating);ELSEDBMS_OUTPUT.PUT_LINE(Credit rating OK. | Rating: | TO_CHAR(rating); END IF;END;BEGINcheck_credit(1); END;-Result:-Credit rating over limit (1). Rating: 3相同的范围内的重复标识符您不能在同一个PL/SQL单元中两次声明相同的标识符。如果您这样做,当您引用重复标识符时,会出现错误,如本例所示。DECLAREid BOOLEAN;id VARCHAR2(5); - dup
50、licate identifier BEGINid := FALSE; END;-Result:-id := FALSE;ERROR at line 5:ORA-06550: line 5, column 3:PLS-00371: at most one declaration for ID is permitted ORA-06550: line 5, column 3:PL/SQL: Statement ignored在不同的单元中声明相同的标识符您可以在两个不同的单元中声明相同的标识符。由标识符表示的两个对象是不同的。改变一个不会影响另一个,正如这个例子所显示的。在相同的范围内,给标签和
51、子程序唯一的名称以避免混乱和意外的结果。DECLARE PROCEDURE p ISx VARCHAR2(1); BEGINx := a; - Assign the value a to x DBMS_OUTPUT.PUT_LINE(In procedure p, x = | x);END;PROCEDURE q ISx VARCHAR2(1); BEGINx := b; - Assign the value b to x DBMS_OUTPUT.PUT_LINE(In procedure q, x = | x);END; BEGINp;q;END;-Result:-In procedure
52、p, x = a-In procedure q, x = b在相同的范围内使用相同名称的标签和子程序在本例中,echo是一个块和一个子程序的名称。块和子程序都声明一个名为x的变量。在子程序中,echo.x是指局部变量x,而不是全局变量x。 DECLAREx NUMBER := 5;PROCEDURE echo AS x NUMBER := 0;BEGINDBMS_OUTPUT.PUT_LINE(x = | x);DBMS_OUTPUT.PUT_LINE(echo.x = | echo.x); END;BEGINecho; END;-Result:-x = 0-echo.x = 0带有多个和重复
53、标签的块这个例子有两个标签用于外部块,compute_ratio和another_label。第二个标签再次出现在内部块中。在内部块中,another_label.denominator是指局部变量的denominator,而不是全局变量的denominator,这导致了ZERO_DIVIDE的误差。 DECLAREnumeratorNUMBER := 22; denominatorNUMBER := 7;BEGIN DECLAREdenominatorNUMBER := 0; BEGINDBMS_OUTPUT.PUT_LINE(Ratio with compute_ratio.denomin
54、ator = ); DBMS_OUTPUT.PUT_LINE(numerator/compute_ratio.denominator); DBMS_OUTPUT.PUT_LINE(Ratio with another_label.denominator = ); DBMS_OUTPUT.PUT_LINE(numerator/another_label.denominator); EXCEPTIONWHEN ZERO_DIVIDE THENDBMS_OUTPUT.PUT_LINE(Divide-by-zero error: cant divide | numerator | by | denom
55、inator); WHEN OTHERS THENDBMS_OUTPUT.PUT_LINE(Unexpected error.); END another_label;END compute_ratio;-Result:-Ratio with compute_ratio.denominator =-3.14285714285714285714285714285714285714-Ratio with another_label.denominator =-Divide-by-zero error: cannot divide 22 by 0给变量赋值有3中方式赋值:使用赋值语句将表达式赋值给变
56、量使用SELECT INTO 或 FETCH语句赋值给变量将变量传递给子程序的OUT或IN OUT 参数在子程序里赋值。声明变量时,可以将默认值赋给该变量或声明后使用赋值语句。赋值运算符(:=) 后面的表达式可以任意复杂。默认情况下,变量初始化为空。除非显式初始化变量,否则其值为未知的。用赋值语句给变量赋值这个例子声明了几个变量(为一些变量指定初始值),然后使用赋值语句将表达式的值DECLARE - You can assign initial values here wagesNUMBER;hours_worked NUMBER := 40; hourly_salaryNUMBER := 2
57、2.50; bonusNUMBER := 150;countryVARCHAR2(128);counterNUMBER := 0;赋给它们。TYPE commissions IS TABLE OF NUMBER INDEX BY PLS_INTEGER;comm_tabcommissions;BEGIN- You can assign values here toowages := (hours_worked * hourly_salary) + bonus; country := France;country := UPPER(Canada); done := (counter 100);
58、valid_id := TRUE;emp_rec1.first_name := Antonio; emp_rec1.last_name := Ortiz; emp_rec1 := emp_rec2; comm_tab(5) := 20000 * 0.15;END;BOOLEAN; BOOLEAN;employees%ROWTYPE;employees%ROWTYPE;done valid_id emp_rec1emp_rec2用SELECT INTO语句给变量赋值本例使用SELECT INTO语句将employee_id为100的雇员的工资的10%赋值给变量 bonus。DECLAREbonu
59、s NUMBER(8,2); BEGINSELECT salary * 0.10 INTO bonus FROM employeesWHERE employee_id = 100; END;DBMS_OUTPUT.PUT_LINE(bonus = | TO_CHAR(bonus);-Result:-bonus = 2400IN OUT子程序参数给变量赋值这个示例将变量new_sal传递给过程adjust_salary。该过程将一个值赋给相应的形式参DECLAREemp_salary NUMBER(8,2);PROCEDURE adjust_salary ( empNUMBER,数sal。由于s
60、al是一个 IN OUT 参数,变量new_sal在过程结束后保留了赋值。sal IN OUTNUMBER,adjustment NUMBER) IS BEGINsal := sal + adjustment; END;BEGINSELECT salary INTO emp_salary FROM employeesWHERE employee_id = 100;DBMS_OUTPUT.PUT_LINE(Before invoking procedure, emp_salary: | emp_salary); adjust_salary (100, emp_salary, 1000);DBMS
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 2026年一级注册建筑师考试题库300道附参考答案【能力提升】
- 2026年一级造价师考试题库300道及完整答案【有一套】
- 2025年商丘学院辅导员招聘考试真题汇编附答案
- 一汽集团信息技术部长IT部门考试题库含答案
- 软件开发团队主管面试题及答案
- 2026年心理咨询师之心理咨询师二级技能考试题库含答案(培优b卷)
- 2026年一级建造师之一建工程法规考试题库500道及答案【夺冠系列】
- 2026年高校教师资格证之高等教育法规考试题库含答案(综合题)
- 2026年县乡教师选调考试《教师职业道德》题库附参考答案【培优b卷】
- 政府机关单位出纳员招聘及考核内容
- 农商行法律培训课件
- 部编版小学二年级语文上册教学反思集体备课计划
- 执法用手机管理办法
- 双重管理安全员管理办法
- 2019-2025年中国鲜切水果行业市场调查研究及投资前景预测报告
- 染色体核型分析报告解读要点
- 2025年中国泵行业市场白皮书
- (高清版)DB1303∕T 357-2023 鲜食核桃果实主要病虫害防治技术规程
- 无人机集群技术-智能组网与协同 课件全套 第1-8章 绪论- 无人机集群任务分配
- 天然牙-种植体联合支持下颌覆盖义齿的三维有限元分析
- 智圆行方的世界-中国传统文化概论知到课后答案智慧树章节测试答案2025年春暨南大学
评论
0/150
提交评论