oracle学习笔记(十五) PL/SQL语法结构以及使用
程序员文章站
2022-03-05 13:13:06
PL/SQL 简介 PL/SQL 是过程语言(Procedural Language)与结构化查询语言(SQL)结合而成的编程语言。 PL/SQL 是对 SQL 的扩展。 支持多种数据类型,如大对象和集合类型,可使用条件和循环等控制结构。 可用于创建存储过程、函数、触发器和程序包,给SQL语句的执行 ......
pl/sql
简介
- pl/sql 是过程语言(procedural language)与结构化查询语言(sql)结合而成的编程语言。
- pl/sql 是对 sql 的扩展。
- 支持多种数据类型,如大对象和集合类型,可使用条件和循环等控制结构。
- 可用于创建存储过程、函数、触发器和程序包,给sql语句的执行添加程序逻辑。
作用:
如果出现需要插入1000条数据,这些数据带有某种规律性,就可以通过pl/sql进行增加数据的操作
优点:
- 支持 sql,在 pl/sql 中可以使用:
- 数据操纵命令:dml,ddl(需要动态执行)
- 事务控制命令:tcl
- 游标控制, 下一章学习
- sql函数和sql运算符
- 与 sql 紧密集成,简化数据处理。
- 支持所有 sql 数据类型
- 支持 null 值
- 支持 %type 和 %rowtype
- %type: 引用字段类型,如:employee.ename%type
- %rowtype:引用表的行类型, 如: employee%rowtype
- 支持面向对象编程 (oop)
- 可移植性,可运行在任何操作系统和平台上的oralce 数据库
- 更佳的性能,pl/sql 经过编译执行
常用数据类型
- 数值
number, numeric, decimal, float, int, integer, real - 字符串
varchar,varchar2,string(plsql特有的) - 布尔类型boolean
- 日期常用类型
date, timestamp - 属性类型
%type:引用某一个变量的类型或都是某个列名(字段)的类型。employee.ename%type;
%rowtype:表示可存储某表行的记录类型。employee%rowtype;
变量声明以及赋值
--赋值号为 := $变量名$ [constant] $datatype$ [not null] [:= value];--赋值 $变量名$ [constant] $datatype$ [not null] [default expr];--默认值 age int;--声明一个整型变量age, age int := 18;--声明age并赋值 age int default 18;--默认age为18 age constant int :=18;--声明整型常量age并赋值为18 --声明一个与employee.ename相同类型的变量myname myname employee.ename%type; --声明一个变量,类型为表的行类型(相当于表中每条数据对应的实体类) rec_emp employee%rowtype;--employee表中的数据有多少列,rec_emp也有多少列 --例子,输入员工编号,输出该员工信息 declare v_empno employee.empno%type; rec_emp employee%rowtype; begin v_empno := &请输入员工编号; select * into rec_emp from employee where empno=v_empno; --使用 .列名 得到列的值 dbms_output.put_line(rec_emp.empno||',' ||rec_emp.ename||',' ||rec_emp.sal||',' ||rec_emp.job); end; / --自定义一个新的数据类型,然后再用这个去声明变量,使用的话也是 .列名 type type_emp_rec is record( empno employee.empno%type, ename employee.ename%type, sal employee.sal%type, job employee.job%type ); --赋值还可以通过select into语句 select ename into myname from employee where empno=7879; --多个变量,注意要两边要对应 select ename,sal into myname,mysal from employee where empno =7879;
基本单元框架
[declare --声明变量、常量、游标、自定义记录类型等。 ] begin --执行部分。 [exception --异常处理部分。 ] end; / --立即执行
输出输入语句
输出
oracle内置有一个dbms_output对象,负责输出
dbms_output对象有两个输出方法,一个为put,另外一个外put_line
参数可以接收数值型
--此方法不能立即输出,需要等待数据缓冲区满了之后或者是刷新数据缓冲区之后才会输出 dbms_output.put('hello world'); --下面两个任选一个即可让上面的hello world立即输出 dbms_output.put_line(''); dbms_output.new_line; dbms_output.put_line('hello world');--立即输出
如果是在命令行窗口的话,没有见到输出语句,需要设置开启输出
set serveroutput on;
输入
--&号在pl/sql中作为一个替代变量,用于在运行中输入值。如果输入的是字符类型那把&号放在两个单引号中, --若是数字则不用单引号括起来 v_ename := '&请输入姓名:'; v_sal := &请输入工资;
输入输出例子
declare v_name varchar2(10) := '&输入名字'; v_age int := &输入年龄; begin dbms_out.put_line('我是'||v_name||'年龄为'||v_age); --使用||连接字符串 end; /
判断与分支语句
if判断
--if判断 if 表达式 then end if
if-else判断
--if-else判断 if 表达式 then --代码 else --代码 end if
if-else if判断
--if-else if判断 if 表达式 then else if 表达式 then --代码 else --代码 end if end if
case分支语句
--1.判断是否满足表达式 case when 表达式 then --代码 when 表达式 then --代码 else --代码 end case; --2.判断是否等于某个数值 case when 数值 then --代码 when 数值 then --代码 else --代码 end case;
数值不能能为字符串类型
循环语句for while loop
loop循环
--无条件循环 loop --代码以及初始化相关 --满足条件退出当前循环 if 条件 then exit; end if; --或者使用 exit when 条件 end loop;
while循环
--有条件循环 --满足条件进入循环 while 条件 loop --初始化数值; --代码 exit when 条件; --满足条件退出循环 --代码 end loop;
for循环
--oracle会自动创建计数器变量,也就是我们的i --除了i,也可以起其他的名字 --相当于for(i=1;i<=10;i++) for i in 1..10 loop --statement; end loop; --相当于for(i=10;i>=1;i--) for i in reverse 1..10 loop --statement; end loop; -使用变量作为for循环的范围 declare v_min integer default 1; v_max integer default 20; begin for i in reverse v_min..v_max loop dbms_output.put(i||','); end loop; dbms_output.new_line; end; /
循环结构练习
--遍历输出某个部门的全部员工信息 declare v_deptno integer := &请输入部门号; begin for emp in (select e.* from employee e where deptno=v_deptno) loop dbms_output.put_line(||emp.empno||','||emp.ename||','||emp.job||','||emp.sal); end loop; end; / --for打印99乘法表 begin --如果不在rownum,可以吗? for num1 in 1..9 loop for num2 in 1..num1 loop dbms_output.put(num2||'*'||num1||'='||num1*num2||' '); end loop; dbms_output.new_line; end loop; end; / --loop打印99乘法表 declare num1 int := 1; num2 int; begin loop num2 := 1; loop dbms_output.put(num2||'*'||num1||'='||num1*num2||' '); exit when num1=num2; num2 := num2+1; end loop; dbms_output.new_line; exit when num1=9; num1 := num1+1; end loop; end; / --while打印99乘法表 declare num1 int := 1; num2 int; begin while num1 <= 9 loop num2 := 1; while num2 <= num1 loop dbms_output.put(num2||'*'||num1||'='||num1*num2||' '); exit when num2=num1; num2 :=num2+1; end loop; dbms_output.new_line; exit when num1=9; num1 := num1+1; end loop; end; /