概念、运算符、简单变量、块、%TYPE、%ROWTYPE、复合变量
合集下载
相关主题
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
• 所引用的数据库列的数据类型可以不必知道; • 所引用的数据库列的数据类型可以实时改变,容易保持一致,也不 用修改PL/SQL程序。
%TYPE属性实例1
DECLARE
-- 用%TYPE 类型定义与表相配的字段 TYPE T_Record IS RECORD( T_no employees.employee_id%TYPE, T_name employees.first_name%TYPE, T_sal employees.salary%TYPE ); -- 声明接收数据的变量
PL/Sql中的变量类型
• 简单变量 • 复合(组合)变量 • 外部变量
简单变量 • 简单变量不包括任何组件,只能保存一个值 • 基本类型:
• BINARY_INTEGER:带符号整数。 • NUMBER [(precision, scale)]:小数,高精度实数,整数 • CHAR [(maximum_length)]:定长字符串 • VARCHAR2(maximum_length):可变字符串 • DATE:日期型 • LONG:变长字符串 • CLOB / BLOB / BFILE:存储大的数据对象类型 • BOOLEAN:布尔型
PL/SQL 块类型
• 根据带名称和不带名称以及在数据库中的存储方式可以分为以下 几类: • 匿名块:通常都是动态生成的,只能执行一次,不能存储在数据 库中。 • 带名块:其实就是一种带有标签的匿名块,标签为该块指定一个 名称,带名块也是动态生成的,一般也不能存储在数据库中。 • 子程序:是指可以存储在数据库中的过程和函数以及包体,子程 序被存储在数据库中就不能再被更改,可以被多次执行,用户可 以再外部的程序中通过显示地调用子程序来执行它。 • 触发器:一种存储在数据库中的带名块,触发器在生成后也不再 被更改而且可以被多次执行,当相应的触发事件发生时,触发器 就自动执行。
%TYPE 属性 • 通过%TYPE属性声明一个变量,变量将遵循下面的类型声明: • 一个已经声明过的变量 • 一个数据库中的表的字段定义 • 可以作为%TYPE的前缀的可以是 • 数据库表和列 • 前面声明的变量名称 • 作用:PL/SQL在运行程序时确定变量的数据类型和大小
%TYPE属性 • 定义一个变量,其数据类型与已经定义的某个数据变量(尤其是 表的某一列)的数据类型相一致,这时可以使用%TYPE。 • 使用%TYPE特性的优点在于:
例子 v_sal
c_company_name
emp_cursor e_too_many amount_table_type order_total_table emp_record_type customer_record
声明变量和常量:语法 • 定义的标示符名称应遵循命名规则 • 在声明常量和变量的时候可以为其 设置初始化值,也可以设置
NOT NULL
• • • • • •
可以使用赋值运算符(:=)或者DEFAULT保留字来初始化标识符 在声明时,每行只能声明一个标识符 其中:variable_name:是要声明的变量名称。 CONSTANT:参数表名是一个常量, NOT_NULL:表名声明的变量不能为空。 :=value|default value是给变量赋予初始值。
PLSQL-基本语法1
本章要点 • PL/SQL基本概念 • PL/SQL的变量 • PL/SQL的基本语法 • Oracle各种程序单元 • 使用游标取出多条数据 • 异常处理
PL/SQL概述 • 什么是PL/SQL(Procedure Language & Strutctured Query Language) • PL/SQL是Oracle数据库对SQL语句的扩展,增加了编程语言的特 点 • 数据操作和查询语句被包含在PL/SQL代码的过程性单元中,经过 逻辑判断、循环等操作完成复杂的功能或者计算 • PL/SQL程序的运行是通过Oracle中的一个引擎来进行的,该引擎 可能在服务端,也可能在客户端。 • 引擎执行PL/SQL中的过程性语句,然后将SQL语句发送给数据库 服务器来执行。再将结果返回给执行端。 • PL/SQL是不区分大小写的
编码基本规则 • 代码应该易于维护 • 为源代码添加合适的注释 • 设置代码的大小写规则 • 为标识符和其他的对象设置命名规则 • 通过缩进,提高代码的可读性
声明变量和常量:规范
• • • • • • • 在Pห้องสมุดไป่ตู้/SQL中,每一行只能声明一个变量,如下面就是非法的: DECLARE Firstname,Lastname varchar(15); 改为: DECLARE Firstname varchar2(15); Lastname varchar2(15);
简单变量的声明
v_gender v_count v_total_sal v_order_date CHAR(1); BINARY_INTEGER := 0; NUMBER(9,2) := 0; DATE := SYSDATE + 7;
c_tax_rate v_valid
CONSTANT NUMBER(3,2) := 8.25;(常数) BOOLEAN NOT NULL := TRUE;(非空)
PL/SQL运算符-逻辑运算符
运算符 And Or Not
意义 逻辑与 逻辑或 逻辑非
PL/SQL块的基本结构2
• 一般来说,PL/SQL块中所要使用的变量、类型和游标都是在声明 部分进行的,声明部分以[DECLARE]开始。 • 声明部分一般都是可选的结构,如果不需要声明类型、变量和游 标等,则声明部分可以省略。因此忽略掉后,就是以BEGIN开始 • 执行部分一般使用SQL语句和过程性语句来完成和处理待定的工 作,执行部分是块中唯一不可缺少部分,是以BEGIN开头,以END; 结束的一组语句。 • 异常处理部分是可选语句,可以检查及处理在块中可能发生的错 误,也可以省略。在块中,异常处理部分是以EXCEPTION开始, 应及时捕获异常,处理异常。
PL/SQL的优点 • • • • • • 使一组语句功能形成模块化程序开发 使用过程性语言控制程序结构 可以对程序中的错误进行处理 具有较好的可移植性 集成在数据库中 有助于提高程序性能
注释语句 • 注释代码,可以通过:
• 为注释加两个短划线(- -)作为前缀。 • 把注释放在/* 和*/之间。
Database
PL/SQL块的基本结构1 [DECLARE] – 可选部分-声明部分 • 变量、常量、游标、用户定义异常声明 BEGIN – 必要部分-执行部分 • SQL语句 • PL/SQL语句 [EXCEPTION] – 可选部分-异常部分 • 程序出现异常时,捕捉异常并处理异常 END; – 必要部分
%ROWTYPE属性 • PL/SQL 提供%ROWTYPE操作符, 返回一个记录类型, 其数据类型 和数据库表的数据结构相一致。 • 使用%ROWTYPE特性的优点在于: • 所引用的数据库中列的个数和数据类型可以不必知道; • 所引用的数据库中列的个数和数据类型可以实时改变,容易保持一 致,也不用修改PL/SQL程序。
... v_sal NUMBER (9,2); BEGIN /* 根据员工的月薪计算年薪,计算的公式为 月薪 * 12 = 年薪 */ v_sal := v_sal * 12; --计算年薪 END;
PL/SQL提高了性能
SQL
应用程序
SQL
SQL
SQL
Database
应用程序
SQL IF...THEN SQL ELSE SQL END IF; SQL
PL/SQL块例子
• 下面以一个存储过程(后面讲)为例,该存储过程体现了PL/SQL的块结 构:
declare --定义变量 v_ename varchar2(100); v_sal number(7,2); begin --执行部分 SELECT first_name,salary INTO v_ename,v_sal FROM employees WHERE employee_id = 100; --在控制台显示用户名 dbms_output.put_line('用户名是:'||v_ename||' 工资: '||v_sal); --异常处理 exception when no_data_found then dbms_output.put_line('朋友,你的编号输入有误!'); end;
变量名 v_variableName e_exceptionName t_TypeName p_parameterName c_ConstantName
意义 程序变量 自定义的异常处理标识 自定义类型 存储过程,函数的参数变 量 用CONSTANT限制的变量
代码命名规范的例子 标识符 命名约定 变量 v_name 常量 c_name 游标 name_cursor 异常 e_name TABLE类型 name_table_type TABLE name_table RECORD类型 name_record_type RECORD name_record
END;
%TYPE属性实例2
DECLARE v_empno employees.employee_id%TYPE :=&no;--&no输入参数 Type t_record is record ( v_name employees.first_name%TYPE, v_sal employees.salary%TYPE, v_date employees.hire_date%TYPE); rec t_record; BEGIN SELECT first_name, salary, hire_date INTO rec FROM employees WHERE employee_id=v_empno;--单行 DBMS_OUTPUT.PUT_LINE(Rec.v_name||'---'||Rec.v_sal||'-'||Rec.v_date); END;
v_emp T_Record;
BEGIN SELECT employee_id, first_name, salary INTO v_emp FROM employees WHERE employee_id=200; --只能单行数据 DBMS_OUTPUT.PUT_LINE—输出到控制台 (TO_CHAR(v_emp.t_no)||' '||v_emp.t_name||' TO_CHAR(v_emp.t_sal)); ' ||
Variable_name[CONSTANT] datatype [NOT NULL] [:= | DEFAULT expr];
• 例如:Entry_time DATE; 变量名 类型
作用域和可见性
• 作用域就是从变量声明的开始一直到这个PL/SQL块得结束。总的 来说: • 变量的作用范围是在你所引用的程序单元(块,子程序,包)内, 即从声明变量开始到该块得结束。 • 一个变量(标识)只能在你所引用的名字内是可见的。 • 当一个变量超出了作用范围,PL/SQL引擎就释放用来存放该变量 的空间。 • 在子块中重新定义该变量后,它的作用仅在该块内。
PL/SQL运算符-一般运算符
运算符
意义 加号
+
* / := => .. ||
减号
乘号 除号
赋值号
关系号 范围运算符
字符连接符
PL/SQL运算符-比较运算符
运算符 = <>, !=, ~=, ^= < > <= >= is null Between In
意义 等于 不等于 小于 大于 小于等于 大于等于 是空值 介于两者之间 在一列值中间
PL/SQL环境
PL/SQL Block
PL/SQL 引擎 PL/SQL Block non-SQL Procedural Statement SQL Executor SQL Statement Executor
oracle 数据库
在PL/SQL中处理变量 • • • • 在声明部分声明和初始化变量 在执行部分为变量赋新值,在表达式中使用变量 通过参数把值传递到PL/SQL 块中 通过输出变量或者参数将值传出PL/SQL块
%TYPE属性实例1
DECLARE
-- 用%TYPE 类型定义与表相配的字段 TYPE T_Record IS RECORD( T_no employees.employee_id%TYPE, T_name employees.first_name%TYPE, T_sal employees.salary%TYPE ); -- 声明接收数据的变量
PL/Sql中的变量类型
• 简单变量 • 复合(组合)变量 • 外部变量
简单变量 • 简单变量不包括任何组件,只能保存一个值 • 基本类型:
• BINARY_INTEGER:带符号整数。 • NUMBER [(precision, scale)]:小数,高精度实数,整数 • CHAR [(maximum_length)]:定长字符串 • VARCHAR2(maximum_length):可变字符串 • DATE:日期型 • LONG:变长字符串 • CLOB / BLOB / BFILE:存储大的数据对象类型 • BOOLEAN:布尔型
PL/SQL 块类型
• 根据带名称和不带名称以及在数据库中的存储方式可以分为以下 几类: • 匿名块:通常都是动态生成的,只能执行一次,不能存储在数据 库中。 • 带名块:其实就是一种带有标签的匿名块,标签为该块指定一个 名称,带名块也是动态生成的,一般也不能存储在数据库中。 • 子程序:是指可以存储在数据库中的过程和函数以及包体,子程 序被存储在数据库中就不能再被更改,可以被多次执行,用户可 以再外部的程序中通过显示地调用子程序来执行它。 • 触发器:一种存储在数据库中的带名块,触发器在生成后也不再 被更改而且可以被多次执行,当相应的触发事件发生时,触发器 就自动执行。
%TYPE 属性 • 通过%TYPE属性声明一个变量,变量将遵循下面的类型声明: • 一个已经声明过的变量 • 一个数据库中的表的字段定义 • 可以作为%TYPE的前缀的可以是 • 数据库表和列 • 前面声明的变量名称 • 作用:PL/SQL在运行程序时确定变量的数据类型和大小
%TYPE属性 • 定义一个变量,其数据类型与已经定义的某个数据变量(尤其是 表的某一列)的数据类型相一致,这时可以使用%TYPE。 • 使用%TYPE特性的优点在于:
例子 v_sal
c_company_name
emp_cursor e_too_many amount_table_type order_total_table emp_record_type customer_record
声明变量和常量:语法 • 定义的标示符名称应遵循命名规则 • 在声明常量和变量的时候可以为其 设置初始化值,也可以设置
NOT NULL
• • • • • •
可以使用赋值运算符(:=)或者DEFAULT保留字来初始化标识符 在声明时,每行只能声明一个标识符 其中:variable_name:是要声明的变量名称。 CONSTANT:参数表名是一个常量, NOT_NULL:表名声明的变量不能为空。 :=value|default value是给变量赋予初始值。
PLSQL-基本语法1
本章要点 • PL/SQL基本概念 • PL/SQL的变量 • PL/SQL的基本语法 • Oracle各种程序单元 • 使用游标取出多条数据 • 异常处理
PL/SQL概述 • 什么是PL/SQL(Procedure Language & Strutctured Query Language) • PL/SQL是Oracle数据库对SQL语句的扩展,增加了编程语言的特 点 • 数据操作和查询语句被包含在PL/SQL代码的过程性单元中,经过 逻辑判断、循环等操作完成复杂的功能或者计算 • PL/SQL程序的运行是通过Oracle中的一个引擎来进行的,该引擎 可能在服务端,也可能在客户端。 • 引擎执行PL/SQL中的过程性语句,然后将SQL语句发送给数据库 服务器来执行。再将结果返回给执行端。 • PL/SQL是不区分大小写的
编码基本规则 • 代码应该易于维护 • 为源代码添加合适的注释 • 设置代码的大小写规则 • 为标识符和其他的对象设置命名规则 • 通过缩进,提高代码的可读性
声明变量和常量:规范
• • • • • • • 在Pห้องสมุดไป่ตู้/SQL中,每一行只能声明一个变量,如下面就是非法的: DECLARE Firstname,Lastname varchar(15); 改为: DECLARE Firstname varchar2(15); Lastname varchar2(15);
简单变量的声明
v_gender v_count v_total_sal v_order_date CHAR(1); BINARY_INTEGER := 0; NUMBER(9,2) := 0; DATE := SYSDATE + 7;
c_tax_rate v_valid
CONSTANT NUMBER(3,2) := 8.25;(常数) BOOLEAN NOT NULL := TRUE;(非空)
PL/SQL运算符-逻辑运算符
运算符 And Or Not
意义 逻辑与 逻辑或 逻辑非
PL/SQL块的基本结构2
• 一般来说,PL/SQL块中所要使用的变量、类型和游标都是在声明 部分进行的,声明部分以[DECLARE]开始。 • 声明部分一般都是可选的结构,如果不需要声明类型、变量和游 标等,则声明部分可以省略。因此忽略掉后,就是以BEGIN开始 • 执行部分一般使用SQL语句和过程性语句来完成和处理待定的工 作,执行部分是块中唯一不可缺少部分,是以BEGIN开头,以END; 结束的一组语句。 • 异常处理部分是可选语句,可以检查及处理在块中可能发生的错 误,也可以省略。在块中,异常处理部分是以EXCEPTION开始, 应及时捕获异常,处理异常。
PL/SQL的优点 • • • • • • 使一组语句功能形成模块化程序开发 使用过程性语言控制程序结构 可以对程序中的错误进行处理 具有较好的可移植性 集成在数据库中 有助于提高程序性能
注释语句 • 注释代码,可以通过:
• 为注释加两个短划线(- -)作为前缀。 • 把注释放在/* 和*/之间。
Database
PL/SQL块的基本结构1 [DECLARE] – 可选部分-声明部分 • 变量、常量、游标、用户定义异常声明 BEGIN – 必要部分-执行部分 • SQL语句 • PL/SQL语句 [EXCEPTION] – 可选部分-异常部分 • 程序出现异常时,捕捉异常并处理异常 END; – 必要部分
%ROWTYPE属性 • PL/SQL 提供%ROWTYPE操作符, 返回一个记录类型, 其数据类型 和数据库表的数据结构相一致。 • 使用%ROWTYPE特性的优点在于: • 所引用的数据库中列的个数和数据类型可以不必知道; • 所引用的数据库中列的个数和数据类型可以实时改变,容易保持一 致,也不用修改PL/SQL程序。
... v_sal NUMBER (9,2); BEGIN /* 根据员工的月薪计算年薪,计算的公式为 月薪 * 12 = 年薪 */ v_sal := v_sal * 12; --计算年薪 END;
PL/SQL提高了性能
SQL
应用程序
SQL
SQL
SQL
Database
应用程序
SQL IF...THEN SQL ELSE SQL END IF; SQL
PL/SQL块例子
• 下面以一个存储过程(后面讲)为例,该存储过程体现了PL/SQL的块结 构:
declare --定义变量 v_ename varchar2(100); v_sal number(7,2); begin --执行部分 SELECT first_name,salary INTO v_ename,v_sal FROM employees WHERE employee_id = 100; --在控制台显示用户名 dbms_output.put_line('用户名是:'||v_ename||' 工资: '||v_sal); --异常处理 exception when no_data_found then dbms_output.put_line('朋友,你的编号输入有误!'); end;
变量名 v_variableName e_exceptionName t_TypeName p_parameterName c_ConstantName
意义 程序变量 自定义的异常处理标识 自定义类型 存储过程,函数的参数变 量 用CONSTANT限制的变量
代码命名规范的例子 标识符 命名约定 变量 v_name 常量 c_name 游标 name_cursor 异常 e_name TABLE类型 name_table_type TABLE name_table RECORD类型 name_record_type RECORD name_record
END;
%TYPE属性实例2
DECLARE v_empno employees.employee_id%TYPE :=&no;--&no输入参数 Type t_record is record ( v_name employees.first_name%TYPE, v_sal employees.salary%TYPE, v_date employees.hire_date%TYPE); rec t_record; BEGIN SELECT first_name, salary, hire_date INTO rec FROM employees WHERE employee_id=v_empno;--单行 DBMS_OUTPUT.PUT_LINE(Rec.v_name||'---'||Rec.v_sal||'-'||Rec.v_date); END;
v_emp T_Record;
BEGIN SELECT employee_id, first_name, salary INTO v_emp FROM employees WHERE employee_id=200; --只能单行数据 DBMS_OUTPUT.PUT_LINE—输出到控制台 (TO_CHAR(v_emp.t_no)||' '||v_emp.t_name||' TO_CHAR(v_emp.t_sal)); ' ||
Variable_name[CONSTANT] datatype [NOT NULL] [:= | DEFAULT expr];
• 例如:Entry_time DATE; 变量名 类型
作用域和可见性
• 作用域就是从变量声明的开始一直到这个PL/SQL块得结束。总的 来说: • 变量的作用范围是在你所引用的程序单元(块,子程序,包)内, 即从声明变量开始到该块得结束。 • 一个变量(标识)只能在你所引用的名字内是可见的。 • 当一个变量超出了作用范围,PL/SQL引擎就释放用来存放该变量 的空间。 • 在子块中重新定义该变量后,它的作用仅在该块内。
PL/SQL运算符-一般运算符
运算符
意义 加号
+
* / := => .. ||
减号
乘号 除号
赋值号
关系号 范围运算符
字符连接符
PL/SQL运算符-比较运算符
运算符 = <>, !=, ~=, ^= < > <= >= is null Between In
意义 等于 不等于 小于 大于 小于等于 大于等于 是空值 介于两者之间 在一列值中间
PL/SQL环境
PL/SQL Block
PL/SQL 引擎 PL/SQL Block non-SQL Procedural Statement SQL Executor SQL Statement Executor
oracle 数据库
在PL/SQL中处理变量 • • • • 在声明部分声明和初始化变量 在执行部分为变量赋新值,在表达式中使用变量 通过参数把值传递到PL/SQL 块中 通过输出变量或者参数将值传出PL/SQL块