它是一门Oracle支持的编程语言 可以将多条sql语句封装在一起,形成一个整体
plsql 语法结构
声明部分(declare), 开始部分(begin)(执行代码),结束end结束符号DECLARE DECLARE 声明部分 1 变量 (可变) 2 常量(不可变) 3 游标 BEGIN –要实现的业务代码 EXCEPTION --异常 end;
声明一个变量打印变量的值
例:DECLARE a NUMBER(10) :=10; BEGIN DBMS_OUTPUT.PUT_LINE(a); END; 例:DECLARE a NUMBER(10):=10; BEGIN a:=20; DBMS_OUTPUT.PUT_LINE(a); END;
数据类型
数值型 NUMBER PLS_INTEGER --整型 BINARY_INTEGER --整型 simple_integer --整型 效率较高 字符型 VARCHAR2() VARCHAR CHAR LOB --大文本类型 布尔类型 TRUE FALSE –时间类型 DATE 比较运算符 < = >= <= != <> BETWEEN AND 逻辑运算符 NOT AND OR plsql中 := 赋值号 … 范围符号 => 传值
常量 ECLARE CONSTANT a NUMBER(10) = 10; BEGIN DBMS_OUTPUT.PUT_LINE(a); END;
plsql 中变量类型
普通变量名 (由数字,字母,下划线组成,且不能以数字开头),变量名要起的有意义 记录型 DECLARE TYPE 类型名 IS RECORD ( 变量名 变量类型, 变量名2 变量类型, … ); 变量名 类型名; BEGIN end;
DECLARE TYPE t IS RECORD( a VARCHAR2(100), b NUMBER(10), c DATE ); 例:”DECLARE TYPE t IS RECORD( a VARCHAR2(100), b NUMBER(10), c DATE ); my_t t; BEGIN my_t.a :=‘10’; my_t.c :=SYSDATE; DBMS_OUTPUT.PUT_LINE(my_t.a); dbMS_OUTPUT.PUT_LINE(my_t.c); END;
定义三个变量
declare a VARCHAR2(100); b NUMBER(10); c DATE;
TYPE t IS RECORD( a VARCHAR2(100); b NUMBER(10); c DATE; ) my_t t; 给类型名t取一个变量名 a emp.ename %TYPE; a 的类型和emp表中的ename列的类型一致!!
定义一个变量来接收emp中的ename列类型的值
DECLARE v_ename emp.ename %TYPE; v_date emp.hiredate%TYPE; BEGIN v_ename:=‘king!!’; v_date :=SYSDATE; DBMS_OUTPUT.PUT_LINE(v_ename || v_date); --打印多个值,值和值之间不能用逗号,要用连接符 END;
变量定义的类型
DECLARE a NUMBER(10); – 单行单列 b NUMBER(10):=100; c VARCHAR2(10); d emp.ename %TYPE; --单行单列 TYPE t IS RECORD(e NUMBER(10), f emp.empno %TYPE); --单行 多列 my_t t; v_emp emp %ROWTYPE; --g可以接收emp的一行(所有列)记录 (单行多列) BEGIN a:=10; – dbMS_OUTPUT.PUT_LINE(a); dbMS_OUTPUT.PUT_LINE(b); a:=20; –DBMS_OUTPUT.PUT_LINE(a); b:=a ; --将a的值赋予b dbMS_OUTPUT.PUT_LINE(b); my_t.e:=50; dbMS_OUTPUT.PUT_LINE(my_t.e); v_emp.ename:=‘king!’; v_emp.sal:=1009; dbMS_OUTPUT.PUT_LINE(v_emp.ename||’ '||v_emp.sal); END;
%ROWTYPE 类型 (可以接收某个表的全部列) 变量名 表名 %ROWTYPE
–plsql 中支持的语言 DML : INSERT , DELETE ,UPDATE SELECT 列1,列2,… INTO 变量1, 变量2 --,在程序块中,必须要使用到 –不直接支持create ,可以通过动态sql方式完成create
例:查询编号为7369的员工的姓名
DECLARE v_name emp.ename%TYPE; BEGIN SELECT ename INTO v_name FROM emp WHERE empno=7369; dbMS_OUTPUT.PUT_LINE(v_name); END;
–在控制台上打印输出 员工编号为7369的 名字,工资,工种,入职日期 –要求输出格式为 名字:smith 工资:789 工种:salesman 入职日期:1991-10-02
–第一种方法
DECLARE v_name VARCHAR2(100); v_sal emp.sal%TYPE; v_job emp.job %TYPE; v_date DATE; BEGIN SELECT ename,sal,job,hiredate INTO v_name,v_sal,v_job,v_date FROM emp WHERE empno=7369; DBMS_OUTPUT.PUT_LINE('名字: ‘||v_name||’ ‘||‘工资:’||v_sal||’ ‘||‘工种:’||v_job||’ '||‘入职日期:’||v_date); END;
–第二种写法
DECLARE v_emp emp%ROWTYPE; BEGIN SELECT * INTO v_emp FROM emp WHERE empno=7369; DBMS_OUTPUT.PUT_LINE(v_emp.ename||’ '||v_emp.sal||v_emp.hiredate); END;
–第三种写法
DECLARE TYPE t IS RECORD ( v_name VARCHAR2(100), v_sal emp.sal%TYPE, v_job emp.job %TYPE, v_date DATE ); v_emp t; BEGIN SELECT ename,sal,job,hiredate INTO v_emp.v_name ,v_emp.v_sal,v_emp.v_job,v_emp.v_date FROM emp WHERE empno=7369; DBMS_OUTPUT.PUT_LINE(v_emp.v_name); END;
–注意: 目前只能接收单行的数据,超过一行就会报错
增删改
–insert 增 RETURNING 表名.列名 INTO 变量名 –可以将增删改后的某个值输出在打印台上
DECLARE v_name VARCHAR2(200); BEGIN INSERT INTO p(empno,ename) VALUES(1111,‘tiger’) RETURNING p.ename INTO v_name ; dbMS_OUTPUT.PUT_LINE('新增了 '||v_name); END;
–UPDATE 改
DECLARE v_name VARCHAR2(20); BEGIN UPDATE p SET ename=‘smalltiger’ WHERE empno=1111 RETURNING p.ename INTO v_name; dbMS_OUTPUT.PUT_LINE('将名字更新为 '||v_name); COMMIT; END; SELECT * FROM p
–DELETE 删
DECLARE v_no p.empno%TYPE; BEGIN DELETE FROM p WHERE empno=1111 RETURNING p.empno INTO v_no; dbMS_OUTPUT.PUT_LINE(‘删除了编号为 ‘||v_no||’ 的数据’); COMMIT; END;
–常量 DECLARE 常量名 CONSTANT 数据类型; BEGIN 业务代码 end;
例:DECLARE C_NAME CONSTANT VARCHAR2(100) := ‘smith’; BEGIN –C_NAME := ‘king’; DBMS_OUTPUT.PUT_LINE(C_NAME); END;
练习:向emp表中 增加 empno, ename,sal , 修改 ,删除 ,将增删改后的empno和ename打印输出
DECLARE v_no p.empno%TYPE; v_name VARCHAR2(100); v_sal NUMBER(10); BEGIN —insert操作 INSERT INTO p (empno,ename,sal) VALUES(1122,‘haha’,789) RETURNING p.empno,p.ename INTO v_no, v_name; DBMS_OUTPUT.PUT_LINE('添加了 '||v_no||v_name); –UPDATE操作 UPDATE p SET ename=‘hehehe’ WHERE empno=1122 RETURNING p.empno,p.ename INTO v_no, v_name; DBMS_OUTPUT.PUT_LINE('修改了 '||v_no||v_name); –DELETE 操作 DELETE FROM p WHERE empno=1122 RETURNING p.empno,p.ename INTO v_no, v_name; DBMS_OUTPUT.PUT_LINE('删除了 '||v_no||v_name); END;
–在打印台上输出打印 emp表的员工的个数,格式 emp: 人数
– select count(*) from emp DECLARE v_no NUMBER(10); BEGIN SELECT COUNT(1) INTO v_no FROM emp; DBMS_OUTPUT.PUT_LINE('emp: '||v_no); END;