pl/sql开发、基础、进阶、高级编程
(第一天)
操纵Oracle数据库对象
-
关系型数据库管理系统热门系统:
- oracle
- Microsoft
- sql server
- access
- mysql
-
关系型数据库管理系统常用功能
- 定义数据库结构:DDL (数据定义语言来定义数据库结构)(data definition language)
- 存取数据库内容:DML(数据操作语言实现对数据库中数据的基本存取、检索、插入、修改、删除等操作)(data manipulation language)
- 数据库运行管理:数据控制功能,安全性,完整性和并发控制
- 数据库建立维护:数据装入、数据库转储、恢复、重组织、监视、分析等功能
- 数据库的传输:实现用户程序与DBMS之间的通信,通常与操作系统协调完成
-
SQL 语言:
- DML数据操纵语言:主要是完成数据的增、删、改和查询的操作
- DDL数据定义语言:主要用来创建或修改表、视图、存储过程及用户等
-
PL/SQL: (procedure language SQL)
- 是在标准的SQL语言上添加了过程化功能的一门程序设计语言
- 基本单元是语句块,在块中可以定义变量、常量、游标、循环结构、函数、过程、异常
2. PL/SQL 基本概念
-
结构化程序设计
- 顺序结构:自上而下依次执行
- 分支结构:if-then-elsif,case-when
- 循环结构:loop、while-loop、for-loop
-
PL/SQL 执行的sql:
-
只能执行DML (数据操纵语言)
-
不能执行DDL(数据定义语言)
begin -- 程序块中不能执行DDL create table books(id int not null,bookname varchar2(100) null); end; -
处理DDL 语句时使用动态SQL:
execute immediate-- 定义SQL DDL语句 v_sqlstr varchar2(200) := 'create table books(id int not null,bookname varchar2(100) null)' ; begin execute immediate v_sqlstr; -- 执行DDL语句 end;
-
-
PL/SQL块结构
块是开发时最基本的单位,所有的PL/SQL程序都是有块组成的
-
PL/SQL块:
-
匿名块:
- 一般用来调试服务器上的子程序,不保存在数据库中
-
命名块:
- <<块名称>> 标识的块,为了区分多级嵌套层次关系而使用命名加以区分
- 由函数或过程组成的子程序块,块将保存在数据库
- 触发器块
-
-
PL/SQL块的组成:
- 定义部分(可选):常量、变量、游标、异常及复杂数据类型等
- 执行部分(必须):PL/SQL语句、SQL语句
- 异常处理部分(可选):用于捕捉执行部分可能出现的运行错误,并编写出错后的代码
DECLARE -- 可选 -- 定义部分(没有定义内容可以取消DECLARE) BEGIN -- 必须 -- 程序执行部分 EXCEPTION -- 可选 -- 异常处理部分 END; -- 必须 ---------- 最简单的PL/SQL 语句块 --------------------- begin -- dbms_output.put_line('这是最简单的PL/SQL语句块'); null; -- null 是一个可执行语句,表示什么也不做 end;
-
-
变量和类型
变量是一块用来存储数据的内存区域,定义在PL/SQL 的 DECLARE 区域,定义是需指定数据类型, 对初始值没有要求
数据类型:
- 标量变量:number、varchar、varchar2、char、date等...
- 复合变量:使用PL/SQL 复合数据类型,PL/SQL记录、PL/SQL表等...
- 参照变量:用于存放指针的变量, PL/SQL 游标、对象变量
- LOB变量:用于存放大批量数据的变量
-- 变量定义 DECLARE V_DEPTNAME VARCHAR2(10); -- 定义标量变量 V_LOOPCOUNTER BINARY_INTEGER; -- 定义PL/SQL 类型定义标量变量 -- 定义记录类型 TYPE T_EMPLOYEE IS RECORD( EMPNAME VARCHAR2(10), EMPNO NUMBER(7), JOB VARCHAR2(20) ); V_EMPLOYEE T_EMPLOYEE; -- 定义记录类型变量 TYPE CSOR IS REF CURSOR; -- 定义游标变量 V_DATE DATE NOT NULL DEFAULT SYSDATE; -- 定义变量并指令默认值 BEGIN NULL; END; -
程序控制语句
-
条件控制语句:IF,CASE
-- if 语句的3中模式 -- 1. if ...elsif ...elsif ...else 语法 DECLARE V_1 NUMBER; BEGIN SELECT floor(DBMS_RANDOM.VALUE(50,101)) INTO V_1 FROM dual ; IF V_1 < 60 THEN DBMS_OUTPUT.PUT_LINE('该分数未及格,当前分数为:' || V_1); ELSIF V_1 <80 THEN DBMS_OUTPUT.PUT_LINE('该分数已及格,当前分数为:' || V_1); ELSIF V_1 <90 THEN DBMS_OUTPUT.PUT_LINE('该分数很不错,进入三好学生评定范围,当前分数为:' || V_1); ELSE DBMS_OUTPUT.PUT_LINE('该分数已引入年级前10,进入学生榜样评定范围,当前分数为:' || V_1); END IF; END; -- 2. if ...else 语法 IF V_1 < 60 THEN DBMS_OUTPUT.PUT_LINE('该分数未及格,当前分数为:' || V_1); ELSE DBMS_OUTPUT.PUT_LINE('该分数已及格,当前分数为:' || V_1); END IF; -- if 语句 IF V_1 < 60 THEN DBMS_OUTPUT.PUT_LINE('该分数未及格,当前分数为:' || V_1); END IF; DBMS_OUTPUT.PUT_LINE('V_1大于等于60以上,输出V_1为:' || V_1) -----CASE DECLARE V_1 varchar2(20) :='SYSTEM33'; BEGIN CASE V_1 WHEN 'SYS' THEN DBMS_OUTPUT.PUT_LINE('The owner is SYS'); WHEN 'SYSTEM' THEN DBMS_OUTPUT.PUT_LINE('The owner is SYSTEM'); ELSE DBMS_OUTPUT.PUT_LINE('The owner is another value'); END CASE; END; -
循环语句:loop、for-loop、while-loop
-
\