OUT 型参数,代表既可向子程序传递值,同时子程序也可返回值给主程序。
变量类型
通用数据类型: 数据类型 BINARY_INTEGER 说明 基本数值整型,-2147483647 ----- 2147483647 基本浮点数值型 固定长度的字符型,最大值为32760 可变常字符型,最大长度为32760 二进制型,最大长度为32760 NUMBER[(precision,scale)] CHAR[(maximun_length)] LONG LONG RAW VARCHAR2(maximum_length) 可变长字符型,最大长度为32767 DATE BOOLEAN
程序单元(过程、匿名块和函数)中变量的声明: Identifier [CONSTANT] datatype [NOT NULL] [:= | DEFAULT expr]; 注意:具有初始值的常量和变量被认为是NOT NULL的,一行最多只有
一个常量或是变量的声明 %TYPE类型:
这是一种动态数据类型,在PL/SQL中动态决定器数据类型。它有两大优点:
1. 决定其数据类型的数据库表列的类型未知;
2. 决定其数据类型的数据库表列的类型在运行时是可变的。
为了在PL/SQL中保存某个列的数值,必须确保变量与列具有相同的数据类型和精度,否则,常会造成PL/SQL错误或是精度的丢失。
而%TYPE类型是由某一个预定的变量或时数据库表中列决定的,这样就可以确保数据类型的一致。 例: … … 日期和时间类型 逻辑型(TRUE、FALSE或NULL) l_last_name l_salary t_emp.last_name%TYPE t_emp.base_salary%TYPE
33
Company Confidential - For internal use only
复合数据类型: 5. PL/SQL TABLES :
它有两部分组成:I) BINARY_INTEGER型的Primary Key; 注意:
i. PL/SQL TABLES数据类型并不等同于数据库中的表; ii. iii. iv.
PL/SQL TABLES数据类型类似一个一维数组; PL/SQL TABLES类型包含两个组件; PL/SQL TABLES类型可动态增长。
II) 数据的列范围。
声明如下:
TYPE type_name IS TABLE OF scalar_datatype [NOT NULL] INDEX BY BINARY_INTEGER; identifier type_name; 例:
… TYPE name_table_type IS TABLE OF VARCHAR2(25) INDEX BY BINARY_INTEGER; First_name_table name_table_type; … first_name_table(1):=‘FRANCK‘; 6. PL/SQL RECORDS:
它包含一个或是一个以上的任何范围、记录、PL/SQL TABLES类型的组件。 注意: i.
PL/SQL RECORD数据类型并不等同于数据库中的表中的一条记录;
PL/SQL RECORD数据类型类似一个多维数组; PL/SQL RECORD类型包含多个组件; PL/SQL RECORD类型可动态增长;
PL/SQL RECORD类型方便地从一个表中获取一行数据,以便于PL/SQL的处理。
v. vi. vii. viii.
声明如下:
TYPE type_name IS RECORD (field_name1 field_type [NOT NULL { :=|DEFAULT} expr], (field_name2 field_type [NOT NULL { :=|DEFAULT} expr], …); identifier type_name; Company Confidential - For internal use only
34
例:
… TYPE emp_record_type IS RECORD (last_name varchar(25), base_salary number, manager_id number); employee_record emp_record_type; … employee_record.last_name:=‘FRANCK‘;
LESSON 2数据获取和游标
在本节中,主要讲述如何在PL/SQL中访问数据库、获取数据库数据,同时,介绍游标的使用。 数据获取 SELECT INTO FROM WHERE I. II. III.
select_list variable_name | record_name table condition; INTO 语句是必须的 Select 只有一行数据返回 Select_list 不能为简写( eg. *)
检索的数据列,可以包括SQL表达式、单行函数或是组函数;
是一系列变量,用来存储检索的数据值;
PL/SQL RECORD变量,用来存储检索的数据值; 数据库表;
一系列约束条件,实现数据的检索。
Select_list
Variable_name Record_name Table Condition
一个PL/SQL块并非是一个事务处理单元。Commit、savepoints、和rollback是独立的块,但是可以把这些命令写入在一个PL/SQL块中。PL/SQL块不支持数据定义语言(DDL),例如CREATE TABLE,ALTER TABLE,或是DROP TABLE。PL/SQL也不支持数据控制语言(DCL),例如GRANT或是
REVOKE。但是,可以通过在PL/SQL块中,使用DBMS_SQL包来实现DDL和DCL功能。
35
Company Confidential - For internal use only
使用范例:
FUNCTION sum_emp(v_dep_id IN NUMBER) RETURN NUMBER IS L_sum_salary number; BEGIN SELECT sum(salary) INTO l_sum_salry FROM t_emp WHERE dept_id = v_dept_id; RETURN (L_sum_salary); END; 若有零行或是多于一行数据返回 ,则会触发SELECT的例外:TOO_MANY_ROWS(多于一行数据返回) NO_DATA_FOUND(未检索到一条数据) 在PL/SQL块中,还可以使用其它DML命令: INSERT 插入一行数据到数据库的某个表中去; UPDATE 更新数据库表中的某一行数据; DELETE 从数据库表中删除一行不要数据。 游标
在中使用SQL时,数据库服务器总是在内存区开闭一块空间来存储这段SQL的解析和执行结果,这个区域就称为游标。游标有显式游标和隐式游标两种,当在程序块中使用SQL检索时,PL/SQL就自动创建了一个隐式游标,PL/SQL自动管理这个游标;显式游标是由编程者自行定义和命名。游标建立后,在PL/SQL中有四种属性可使用:
SQL%ROWCOUNT 返回最近的SQL语句检索行数,整型 SQL%FOUND
判断最近的SQL语句执行的结果,若返回一行或多行,则为TRUE,Boolean型
SQL%NOTFOUND 判断最近的SQL语句执行的结果,若未返回一行,则为
TRUE,Boolean型 SQL%ISOPEN
对于隐式游标,值总是FALSE,因为隐式游标在执行后立即自动关闭
显式游标声明:
CURSOR cursor_name IS Select statement……; 同时,显式游标也可以是带参数的,如下:
CURSOR cursor_name(parameter and parameter list) IS Select statement……;
36
Company Confidential - For internal use only
隐式游标例子:
RPOCEDURE del_rows(v_warehouse_id number) IS V_rows_del number; BEGIN DELETE FROM t_onhand WHERE warehouse_id = v_warehouse_id; V_rows_del:=SQL%ROWCOUNT; DBMS_OUTPUT.PUT_LINE(TO_CHAR(v_rows_del)||‘ rows deleted.‘); END;
LESSON 3PL/SQL控制流
在本节中,主要讲述在PL/SQL块中的流程控制。PL/SQL中有两种流程控制结构,一是IF语句的条件控制结构,二是LOOP语句循环控制结构。 IF 语句
IF condition THEN 语句; [ELSEIF condition THEN 语句;] [ELSE 语句;] END IF; 类似于其他结构化程序语言,它是一种条件控制流。 注意: 1. 2. 3. 4.
ELSIF是作为一个单词; END IF是两个单词; 允许多个ELSIF语句; 至多只有一个ELSE语句。
使用范例:
… if v_salary<2000 then return v_salary*0.05; elsif v_salary<3000 then return v_salary*0.1; elsif v_salary<5000 then return v_salary*0.15; else return v_salary*0.2 end if; … Company Confidential - For internal use only 37