一,pl/sql 是什么?
--一、pl/sql 是什么? --1.sql是结构化查询语言。 --2.编程语言一般都能够声明变量,写条件判断,循环。sql不具备这些特征,所有sql不是一门编程语言。 --3.使用pl/sql有什么优点: --可以提高程序的运行效率,因为能够减少数据库的访问次数 --可以对复杂的业务逻辑进行封装 --pl/sql具有编程语言的特性,可以写if else 实现复杂的业务逻辑
二、pl/sql 块?
-- 二、pl/sql块? 分为 匿名块 和 命名块 --匿名块 没有名字块就是匿名块 匿名块不会保存到数据库中,执行完就没有了。类似于java的main方法 --命名块 有名字的块就是命名块。命名块 过程 函数 游标 触发器 都是命名块。 --问题?根据员工编号,打印员工的姓名 declare --变量声明部分 v_ename varchar2(30); begin -- 业务逻辑处理部分 select ename into v_ename from emp where empno=&输入员工编号; -- 把员工姓名打印到控制台 dbms_output.put_line(‘员工姓名‘||v_ename); exception -- 异常处理部分 -- 异常处理部分 when no_data_found then dbms_output.put_line(‘查无此人‘); end; --注意: --1,pl/sql块 变量名,关键字不区分大小写。 --2,变量声明部分是可选的。业务逻辑处理部分是必须的。异常处理部分是可选的。 --3,end后面必须加; declare begin exception 后面都不要加; --一般写匿名块都是先写结构,再往结构里面填代码。
三、变量和常量?
/* 三、变量和常量 声明变量 : 变量名 变量类型; 变量名一般建议以v_开头. 声明常量要加上constant关键字常量名 constant 常量类型; 需求:用户输入圆的半径,计算圆的面积。 */ declare v_pi constant number(6,2):=3.14;-- 声明PI常量 number(m,n) 数字类型 pi 是小数,保留两位(6,2) v_area number(6,2); --声明圆的面积的变量 v_r number(6,2):=&输入圆的半径;--声明半径变量 begin v_area:=v_pi*v_r*v_r;-- 计算圆的面积 注意 符号的问题 [:=] dbms_output.put_line(‘圆的面积是:‘||v_area);-- 打印结果 exception when no_data_found then dbms_output.put_line(‘输入正确的半径值‘); end;
四、变量类型?
-- 四、变量类型? /*1.基本类型 类型名 说明 varchar 定长字符串 varchar2 变长字符串 number(m,n) 数字类型 date 日期类型 timestamp 时间戳类型 */ /*2.%type类型(列类型)? %type类型指的是声明变量的时候,该变量参考某个表的某个列的类型。 需求:根据员工的编号 查询员工的姓名和基本工资 */ declare -- 变量声明部分 ename sal v_ename 类型参考emp表的ename的类型 v_ename emp.ename%type; v_sal emp.sal%type; begin select ename,sal into v_ename,v_sal from emp where empno=&输入员工编号; dbms_output.put_line(‘员工姓名:‘||v_ename||‘ 基本工资:‘||v_sal); exception when no_data_found then dbms_output.put_line(‘查无此人‘); end; /*3.%rowtype(行类型)%rowtype参数某个表的类型。 %rowtype中可以存储多个数据,具体可存多少个和表的字段数一样。 需求?输入员工编号,打印员工的姓名,薪水,奖金,雇佣日期。 */ declare v_emp emp%rowtype;-- 声明行类型变量 begin select* into v_emp from emp where empno=&输入员工编号; dbms_output.put_line( ‘员工姓名 ‘||v_emp.ename||‘ 基本工资‘||v_emp.sal||‘ 奖金‘||v_emp.comm||‘ 雇用日期‘||v_emp.hiredate ); exception when no_data_found then dbms_output.put_line(‘查无此人‘); end; /*4.record类型(记录类型) record可以理解为可以自定义的行类型。 record类型在使用之前必须声明该类型。 需求:输入员工编号,打印员工的姓名,基本工资,总工资? */ declare -- 声明record类型 type emp_record_type is record( ename emp.ename%type, sal emp.sal%type, total emp.sal%type ); v_emp emp_record_type;-- 声明record类型的变量 begin select ename,sal,sal+nvl(comm,0)into v_emp from emp where empno=&no;-- 查询数据,给变量赋值 dbms_output.put_line( ‘员工姓名‘||v_emp.ename||‘ 基本工资‘||v_emp.sal||‘总工资‘||v_emp.total ); exception when no_data_found then dbms_output.put_line(‘查无此人‘); end; /*5.table(表类型) 无论是行类型还是记录类型只能存储一行数据,如果要存储多行数据,需要用到table类型。 table类型也需要先声明类型,再声明该类型的变量。 需求?根据员工编号查询员工的信息,存储到table类型的变量中,再输出出来 */ declare -- 声明table类型 is table of 后可以跟行类型,也可以是记录类型 type emp_table_type is table of emp%rowtype index by binary_integer;-- 指定下标的增长方式为整数,每次增长 v_emp emp_table_type; -- 声明table类型的变量 begin -- 把编号为7369的员工的信息存储到table类型变量中 select * into v_emp(1)from emp where empno=7369; select * into v_emp(2)from emp where empno=7499; --数据table类型变量中的数据 dbms_output.put_line(‘员工姓名‘||v_emp(1).ename||‘ 奖金‘||v_emp(1).comm); dbms_output.put_line(‘员工姓名‘||v_emp(2).ename||‘ 奖金‘||v_emp(2).comm); exception when no_data_found then dbms_output.put_line(‘查无此人‘); end;
五。条件判断?
-- 五 、条件判断? /*1.if /else 语法: if 条件表达式 then 语句块; if 条件表达式 then 语句块 end if; elsif 条件表达式 then 语句块; ... else 语句块; end if; 需求:输入一个员工编号,给该员工涨奖金。策略是这样的: 如果原来员工没有奖金,则把基本工资的百分之10作为奖金,如果原来员工的奖金低于1000,把奖金提升到 1000,其他情况奖金提升百分之10. */ declare -- 声明奖金的变量 v_comm emp.comm%type; begin -- 查询出员工的奖金 select comm into v_comm from emp where empno=&no; -- 判断如果员工没有奖金,把基本工资的百分之10作为奖金 if v_comm is null then update emp set comm=sal*0.1 where empno=&no; --如果原先奖金低于1000,提升到1000 elsif v_comm<1000 then update emp set comm=1000 where empno=&no; -- 其他情况把奖金提升百分之10 else update emp set comm=comm*1.1 where empno=&no; end if; end ; /*2.case when case when 和java中switch: case when 语法: case 变量名 when 变量值1 then 语句块; when 变量值2 then 语句块; ........ else: 语句块; end case; 需求?:根据用户输入的部门编号,输出不同的部门名称,要求使用case when实现,不查询dept表 */ declare -- 声明部门编号的变量 v_deptno emp.deptno%type:=&no; begin case v_deptno when 10 then dbms_output.put_line(‘技术部‘); when 20 then dbms_output.put_line(‘销售部‘); when 30 then dbms_output.put_line(‘公关部‘); when 40 then dbms_output.put_line(‘开发部‘); else dbms_output.put_line(‘查无此部‘); end case; end; --注意 if else 和 case when 可以互相替代!
原文:https://www.cnblogs.com/ZXF6/p/10836210.html