Oracle(七):PLSQL编程之基础语法
一、PL/SQL简介
-
pl/sql编程语言是对sql语言的扩展,使得sql语言具有过程化编程的特性。 pl/sql编程语言比一般的过程化编程语言,更加灵活高效。 pl/sql编程语言主要用来编写存储过程和存储函数等。
二、PL/SQL基础语法
1、基本结构
DECLARE --声明部分 声明语句 BEGIN --执行部分 执行语句 EXCEPTION --异常处理部分 执行语句 END;
2、声明语句
2.1、常量声明
-
语法:<变量名> CONSTANT 类型:=初始值; 实例:pi constant number(5,3):=3.14;
2.2、变量声明
基本类型
-
语法:<变量名> 类型[:=初始值]; 实例:sal number(9,2) := 3000;
引用类型
-
语法:变量名 table_name.column_name%type; 实例:myname emp.ename%type;
记录类型
-
语法:变量名 table_name%rowtype; 实例:record emp%rowtype;
赋值
使用:=赋值:num := 100;
使用into查询语句
-
语法:使用SELECT <列名> INTO <变量名> FROM <表名> WHERE <条件> 实例:select * into test from emp where empno=7788;
3、控制语句
3.1、条件控制
IF 条件 THEN 语句1; 语句2; END IF;
---输入小于18的数字,输出未成年 declare i number(3) := ⅈ begin if i<18 then dbms_output.put_line(未成年); end if; end;
IF 条件 THEN 语句序列1; ELSE 语句序列 2; END IF;
---输入小于18的数字,输出未成年 ---输入大于18的数字,输出成年人 declare i number(3) := ⅈ begin if i<18 then dbms_output.put_line(未成年); else dbms_output.put_line(成年人); end if; end;
IF 条件 THEN 语句; ELSIF 语句 THEN 语句; ELSE 语句; END IF;
---输入小于18的数字,输出未成年 ---输入大于18小于40的数字,输出中年人 ---输入大于40的数字,输出老年人 declare i number(3) := ⅈ begin if i<18 then dbms_output.put_line(未成年); elsif i<40 then dbms_output.put_line(中年人); else dbms_output.put_line(老年人); end if; end;
3.2、循环控制
LOOP 语句; EXIT WHEN <条件> END LOOP;
--输出1到10是个数字: declare i number(2) := 1; begin loop exit when i>10; dbms_output.put_line(i); i := i+1; end loop; end;
WHILE <条件> LOOP 语句; END LOOP;
--输出1到10是个数字: declare i number(2) := 1; begin while i<11 loop dbms_output.put_line(i); i := i+1; end loop; end;
FOR <循环变量> IN 下限..上限 LOOP 语句; END LOOP;
--输出1到10是个数字: declare begin for i in 1..10 loop dbms_output.put_line(i); end loop; end;
4、游标(Cursor)
4.1、定义语法
CURSOR <游标名> IS <SELECT 语句> [FOR UPDATE | FOR UPDATE OF 字段];
4.2、游标的操作
-
打开游标:OPEN <游标名>; 获取游标的值:FETCH <游标名> INTO 变量1,变量2,变量3,....变量n,; 或 FETCH <游标名> INTO 行对象; 关闭游标:CLOSE <游标名>;
4.3、游标的属性
-
%NOTFOUND:如果FETCH语句失败,则该属性为"TRUE",否则为"FALSE"; %FOUND:如果FETCH语句成果,则该属性为"TRUE",否则为"FALSE"; %ROWCOUNT:返回游标当前行的行数; %ISOPEN:如果游标是开的则返回"TRUE",否则为"FALSE";
4.4、游标的使用
--给指定部门员工涨工资 declare cursor c2(eno emp.deptno%type) is select empno from emp where deptno = eno; en emp.empno%type; begin open c2(10); loop fetch c2 into en; exit when c2%notfound; update emp set sal = sal - 100 where empno = en; commit; end loop; close c2; end;