Oracle PLSQL:
PLSQL:
符号:
赋值: :=
基本示例:
set serveroutput on //设置输出打开. declare --说明部分 begin --程序 dbms_output.put_line('Hello World'); exception end; /
引用型变量:
--查询7839的姓名和薪水
--查询7839的姓名和薪水 set serveroutput on declare --定义变量保存姓名和薪水 --pename varchar2(20); --psal number; pename emp.ename%type; //引用型变量 psal emp.sal%type; begin --得到姓名和薪水 select ename,sal into pename,psal from emp where empno=7839; dbms_output.put_line(pename||'的薪水是'||psal); end; /
记录型变量(代表了一行,多个列,类似数组)
--查询7839的姓名和薪水
set serveroutput on declare --定义记录型变量:代表一行 emp_rec emp%rowtype; begin select * into emp_rec from emp where empno=7839; dbms_output.put_line(emp_rec.ename||'的薪水是'||emp_rec.sal); end; /
IF语句
--判断用户从键盘输入的数字
set serveroutput on --接收键盘输入 --num: 地址值,在该地址上 保存了输入的值 accept num prompt '请输入一个数字'; //accept 命令 declare --定义变量保存输入的数字 pnum number := # //从地址上取出数字 使用 & begin if pnum = 0 then dbms_output.put_line('您输入的是0'); elsif pnum = 1 then dbms_output.put_line('您输入的是1'); elsif pnum = 2 then dbms_output.put_line('您输入的是2'); else dbms_output.put_line('其他数字'); end if; end; /
循环语句(共有三种方式,此处举例一种):
--打印1~10
set serveroutput on declare pnum number := 1; begin loop --退出条件 exit when pnum > 10; dbms_output.put_line(pnum); --加一 pnum := pnum + 1; end loop; end; /
Cursor:光标(相当一个resultset, 结果集):
1. 光标的属性:
%isopen %rowcount (影响的行数)
%found %notfound
2. 默认,一个会话中只能打开300个光标
show parameter cursor //查看参数 --->后面两个都是这里查来的
修改: alter system/session set open_cursors=400;
3. cursor_sharing ---> 性能优化
EXACT(默认), FORCE(提性能), SIMILAR
例子:
--查询并打印员工的姓名和薪水(不带参数)
set serveroutput on declare --定义光标 cursor cemp is select ename,sal from emp; //定义一个光标 pename emp.ename%type; psal emp.sal%type; begin --打开光标 open cemp; //打开一个光标 loop --取一条记录 fetch cemp into pename,psal; //取出一个记录 --退出条件 --exit when 没有取到记录; exit when cemp%notfound; dbms_output.put_line(pename||'的薪水是'||psal); end loop; --关闭光标 close cemp; //关闭光标 end; /
例二(带参数):
--查询某个部门的员工姓名
set serveroutput on declare cursor cemp(dno number) is select ename from emp where deptno=dno; pename emp.ename%type; begin open cemp(20); //传参 loop fetch cemp into pename; exit when cemp%notfound; dbms_output.put_line(pename); end loop; close cemp; end; /
exception(例外)
系统例外:
No_data_found (没有找到数据)
Too_many_rows (select into 语句匹配多个行)
Zero_Divide (被 0 除)
Value_error (算数或者转换异常)
Timeout_on_resource (等待资源超时)
--被0除
set serveroutput on declare pnum number; begin pnum := 1/0; exception when zero_divide then dbms_output.put_line('1:0不能做分母'); dbms_output.put_line('2:0不能做分母'); when value_error then dbms_output.put_line('算术或者转换错误'); when others then dbms_output.put_line('其他例外'); end; /
自定义例外:
--查询50号部门的员工姓名
set serveroutput on declare cursor cemp is select ename from emp where deptno=50; pename emp.ename%type; --自定义例外 no_emp_found exception; //定义一个 例外 类型的变量 begin open cemp; --取第一条记录 fetch cemp into pename; if cemp%notfound then --抛出例外 raise no_emp_found; //抛出例外 end if; --pmon: process monitor close cemp; exception //一般处理是保存到一个表中 when no_emp_found then dbms_output.put_line('没有找到员工'); when others then dbms_output.put_line('其他例外'); end; /