PL/SQL是在SQL语句的基础上,增加了一些过程化的语句。
过程化的语句包括:类型定义、判断、循环、游标。
PL/SQL代码分为两部分:匿名块和有名块。
匿名块语法:
匿名块的语法 [DECLARE] --声明部分 声明的内容; BEGIN --执行部分 要执行的语句; [EXCEPTION] --异常处理 要执行的语句; END;
注:每一部分的语句后面都要加分号,end之后也要加,赋值使用 := 判断相等使用 = ;
一、声明变量及其类型 1、声明变量--声明变量的语法:变量名 类型长度 DECLARE V_B CHAr(2); V_C EMP.EMPNO%TYPE; BEGIN ... END;
可以在声明的同时为其赋值。
2、变量类型数值型 | number、int | |
字符型 | char、varchar2 | |
日期型 | date、timestamp | |
布尔型 | boolean | 返回值对或错,不能打印,只能用来判断 |
表.列%type | 和某张表的某个列的数据类型一致 | |
表%rowtype | 和某张表的表结构一致 |
%type的特性:
(1)、引用的数据库列的类型可以不知道
(2)、引用的数据库列的类型可以实时改变
PL/SQL使用 ‘&’符号接收键盘输入的值
declare v_a number:=&a; v_b char(5):='&b'; --字符类型可以先使用单引号括起来 v_c date:=date'&c'; --日期类型同样如此 begin ... end;
打印输出函数:dbms_output.put_line(值) 换行打印
dbms_output.put(值) 不换行打印(必须配合换行打印一起使用)
declare v_a varchar2:='hello'; v_b varchar2:='world'; begin dbms.output.put_line(v_a||' '||v_b); end;4、变量的赋值
(1)、直接赋值常量
(2)、将变量赋值给变量,变量可以重复赋值,新值会替换旧值
(3)、也可以将计算的值或函数赋值给变量,以及读取键盘输入的值直接赋值
(4)、select 。。。into 赋值 将select查询到的值(只能为单行,可以多列)赋值给变量,通常贝赋值的变量声明时使用 表.列%type 或者 表%rowtype这两种方法来赋值。
(5)returning into 把dml的值赋给变量 (只能为单行,可以多列)
DECLARE V_A NUMBER:=123; --在声明部分直接赋值 V_B NUMBER; V_C DATE:=DATE'&日期'; V_S EMP.SAL%TYPE; V_J EMP.JOB%TYPE; BEGIN V_B:=V_A; --将变量赋值给变量 SELECT SAL,JOB INTO V_S,V_J FROM EMP WHERe ENAME='SMITH'; --将emp表中名字为SMITH的工资和职位分别赋值为V_S,V_J DBMS_OUTPUT.put(V_A); --只是用不换行打印不会出结果 DBMS_OUTPUT.put_line(V_B); --换行先打印再换行 END;
--创建emp_1 数据通emp CREATE TABLE EMP_1 AS SELECt * FROM EMP; --删除SMITH所在的行 打印删除的姓名和工资 --插入一条数据 打印插入的姓名和工资 --更新KING的的名字为小写 工资加一万 打印更新后的名字和工资 DECLARE V_E VARCHAr2(10); V_S NUMBER; BEGIN DELETe FROM EMP_1 WHERe ENAME='SMITH' RETURNING ENAME,SAL INTO V_E,V_S; --返回刚才操作数据中的属性给变量 DBMS_OUTPUT.put_line('删除的是:'||V_E||'她的工资是:'||V_S); ------------------------------------ INSERT INTO EMP_1(ENAME,SAL)VALUES('张三',5000) RETURNING ENAME,SAL INTO V_E,V_S; DBMS_OUTPUT.put_line('插入的是:'||V_E||'她的工资是:'||V_S); ------------------------------------ UPDATE EMP_1 SET ENAME=LOWER(ENAME),SAL=SAL+10000 WHERe ENAME='KING' RETURNING ENAME,SAL INTO V_E,V_S; DBMS_OUTPUT.put_line('更新的是:'||V_E||'她的工资是:'||V_S); END;
注:变量赋值用 ':=' 号,判断相等用 '=' 号; 变量的声明,宁滥勿缺。
在命令窗口中写plsql语句 最终end之后要加上/表示结束
注:在命令窗口中执行plsql语句 需要开启打印服务
开启:SET SERVEROUTPUT ON
关闭: OFF
语法:IF 条件1 THEN 执行的语句;
ELSIF 条件2 THEN 执行的语句;
ELSIF 条件3 THEN ......;
[ELSE 执行的语句;]
END IF; 2、--CASE WHEN
CASE WHEN 条件1 THEN 执行的语句;
WHEN 条件2 THEN 执行的语句;
WHEN 条件3 THEN 执行的语句;
.........
ELSE 执行的语句;
END CASE;
例:
--键盘输入一个数字 大于0打印整数 小于0打印负数 0 打印0 DECLARE V_A NUMBER:=&数; begin IF V_A>0 THEN DBMS_OUTPUT.put_line('这是一个正数'); ELSIF V_A<0 THEN DBMS_OUTPUT.put_line('这是一个负数'); ELSE DBMS_OUTPUT.put_line('等于0'); END IF; END; --键盘输入一个字母 如果大写 就打印大写 小写就打印小写 --其他打印我不认识 DECLARE V_A CHAr(1):='&字符'; BEGIN CASE WHEN V_A BETWEEN 'A' AND 'Z' THEN DBMS_OUTPUT.put_line('大写'); WHEN V_A BETWEEN 'a' AND 'z' THEN DBMS_OUTPUT.put_line('小写'); ELSE DBMS_OUTPUT.put_line('我不认识'); END CASE; END;
sql的case when和plsql中的case when的区别?
1、sql中的可以加列 plsql中只能加条件
2、sql中的不加分号 plsql中每个语句后面都要加分号
3、sql中以end结尾 plsql中以end case结尾
4、sql中的不能加dml语句 plsql中的后面可以加dml语句
1、普通循环
语法: loop 执行的语句; EXIT WHEN 中途退出的条件; [执行的语句;] END LOOP;
--循环打印1-10 DECLARE V_A NUMBER:=1; BEGIN LOOP DBMS_OUTPUT.put_line(V_A); EXIT WHEN V_A=10; V_A:=V_A+1; END LOOP; END;
2、while循环
语法:while 条件 --进入循环的条件 LOOP 执行的语句; [EXIT WHEN 中途退出的条件;] END LOOP;
--输入一个整数,打印它阶乘的式子,如输入3 打印 3x2x1=6 DECLARE V_A NUMBER:=&a; V_JI NUMBER:=1; V_B VARCHAr2(30); BEGIN WHILE V_A >= 2 LOOP V_JI:=V_JI*V_A; V_B:=V_B||V_A||'x'; V_A:=V_A-1; END LOOP; DBMS_OUTPUT.put_line(V_B||V_A||'='||V_JI); END;
3、for循环
--FOR 循环 语法:for 变量 IN [REVERSE] 小值 .. 大值 --reverse是从大值到小值循环递减 LOOP 执行的语句; [EXIT WHEN 中途退出的条件;] END LOOP;
--九九乘法表 declare V_A CHAr(7); begin for i in 1..9 loop for j in 1..9 loop if i>=j then V_A:=j||'x'||i||'='||j*i||' '; dbms_output.put(V_A); end if; end loop; dbms_output.put_line(''); end loop; end;