PLSQL笔记1(变量变量类型)

📅 2026/8/25 12:08:01
PLSQL笔记1(变量变量类型)
-----------------------------------------------------plsql --------p l ---过程化查询语言--------------sql 的进阶--------------plsql 才是 oracle 的核心语言--------------程序块--------------程序块 核心 变量 变量类型 判断 循环程序块1. 有名块 是指有名字的程序块 是可以永久的保存到数据库中 随时拿来调用 比如 函数 to_date2. 无名块 :L是指 没有名字的程序块不能保存到数据库中的 一次性的无名块无名快的结构declare ------------------声明部分可选begin -----------------执行部分 核心 必须exception -----------------异常部分 捕获异常 可选end ; -----------------结束部分 必须declare ------------------声明部分可选---声明 变量 变量类型 游标......begin -----------------执行部分 核心 必须----为了实现 整个程序的过程------直接使用 DML 语句delete from emp where empno7788;-------可以直接使用 TCL 语句commit ;-------可以使用 select into 语句 -------不能直接使用DDL 语句 可以通过动态sql来实现 DDL语句------- 判断 循环---------------------exception -----------------异常部分 捕获异常 可选end ; -----------------结束部分 必须----------------------------------------------------------------变量 可以变动的值是用来接收 可以变动的值--------此时 变量只能接收 一个值声明变量语法declare变量名1 变量类型; ----整个程序块中 每完成一句话都要有分号变量名2 变量类型;........................................beginend;例题打印输出 你好智云declareV_a varchar2(20); -------------------------------------变量名自己取 规范 V_ename abeginV_a:你好智云;dbms_output.put_line(V_a);end;declareV_a varchar2(20); -------------------------------------变量名自己取 规范 V_ename abeginV_a:你好智云;V_a:付浩浩;dbms_output.put_line(V_a);end;declareV_a varchar2(20); -------------------------------------变量名自己取 规范 V_ename abeginV_a:你好智云 , 付浩浩 ;dbms_output.put_line(V_a);end;declareV_a varchar2(20); -------------------------------------变量名自己取 规范 V_ename abeginV_a:你好智云 ;dbms_output.put_line(V_a);V_a:付浩浩;dbms_output.put_line(V_a);end;declareV_a varchar2(20); -------------------------------------变量名自己取 规范 V_ename abegindbms_output.put_line(V_a);end;练习 打印输出 hello worlddeclareV_a varchar2(20);beginV_a : hello world ;dbms_output.put_line(V_a);end;给变量赋值1. 是 在 begin 后面 通过 赋值符号 : 给变量赋值语法declare变量名1 变量类型;........................begin变量名1 : 值;end;declareV_a varchar2(20);beginV_a : hello world ;dbms_output.put_line(V_a);end;2. 是 在 declare 后面 直接通过 赋值符号 : 赋值语法declare变量1 变量类型 : 值 ; --------初始值beginend;declareV_a varchar2(20) :付浩浩 ;beginV_a:颜琪琪;dbms_output.put_line(V_a);end;********************************************3 是通过 select into 语句给变量赋值语法declare变量1 变量类型;............................beginselect 列名1,列名2 .....into 变量1,变量2 ..... -------------将查询结果 交给变量-----------------------变量的个数 顺序 属性 要和列一致-----------------------暂时 只能处理单行数据from 表名..............................................;end ;select ename, jobinto V_ename, v_jobfrom empwhere empno7788例题 打印输出 7788 的员工的姓名岗位 薪资declareV_ename varchar2(20);V_job varchar2(20);V_sal number;beginselect ename,job,sal--into V_ename,V_job,V_salfrom empwhere empno7566;dbms_output.put_line(V_ename||V_job||V_sal); ---??end;练习 打印输出 7788 的员工的姓名岗位薪资以及岗位平均工资declareV_avg number;V_ename varchar2(20);V_job varchar2(20);V_sal number;BEGINselect ename,job,sal,(select avg(sal) from emp b where b.joba.job)into V_ename,V_job,V_sal,V_avgfrom emp awhere empno7566;dbms_output.put_line( V_ename||V_job||V_sal||V_avg);END ;打印输出 7566 的员工的姓名岗位薪资部门编号部门名称以及部门平均工资declareV_ename varchar(20);V_job varchar2(20);V_sal number;V_deptno number;V_dname Varchar2(30);V_avg number;beginselect ename,job,sal,a.deptno,dname,(select avg(sal) from emp b where b.deptnoa.deptno)into V_ename,V_job,V_sal,V_deptno,V_dname,V_avgfrom emp aleft join depton a.deptnodept.deptnowhere empno7566;dbms_output.put_line(V_ename||V_job||V_sal||V_deptno||V_dname||V_avg);end;declareV_ename varchar(20);V_job varchar2(20);V_sal number;V_deptno number;V_dname Varchar2(30);V_avg number;beginselect ename,job,sal,a.deptno,dname,(select avg(sal) from emp b where b.deptnoa.deptno)into V_ename,V_job,V_sal,V_deptno,V_dname,V_avgfrom emp aleft join depton a.deptnodept.deptno;dbms_output.put_line(V_ename||V_job||V_sal||V_deptno||V_dname||V_avg);end;练习 1. 打印输出7566的员工的姓名岗位薪资以及岗位平均薪资以及部门编号以及部门名称以及部门平均薪资以及员工工资等级declareV_ename varchar2(20);V_job varchar2(30);V_sal number;V_avg_job number;V_deptno number;V_dname varchar2(20);V_avg_deptno number;V_grade number;beginselect ename,job,sal,a.deptno,dname,grade,(select avg(sal) from emp b where b.deptnoa.deptno),(select avg(sal) from emp c where c.joba.job)into V_ename,V_job,V_sal,V_deptno,V_dname,V_grade ,V_avg_deptno,V_avg_jobfrom emp aleft join depton a.deptnodept.deptnoleft join salgradeon a.sal between losal and hisalwhere empno7566;dbms_output.put_line(V_ename||V_job||V_sal||V_deptno||V_dname||V_grade ||V_avg_deptno||V_avg_job);end;declareV_ename varchar2(20);V_job varchar2(30);V_sal number;V_avg_job number;V_deptno number;V_dname varchar2(20);V_avg_deptno number;V_grade number;beginselect ename,job,sal,deptnointo V_ename,V_job,V_sal,V_deptnofrom emp where empno7566;select dname into V_dname from dept where deptnoV_deptno;select avg(sal) into V_avg_deptno from emp where deptnoV_deptno;select avg(sal) into V_avg_job from emp where jobV_job;select gravd into V_grade from salgrade where V_sal between losal and hisal;---拆开成多个select语句dbms_output.put_line(V_ename||V_job||V_sal||V_deptno||V_dname||V_grade ||V_avg_deptno||V_avg_job);end;-------------------------------------------------------------------打印输出1. 换行输出2. 不换行输出1. 换行输出 :是指 打印结束后 换行dbms_output.put_line( 1个参数 );declarebegindbms_output.put_line(付浩浩);dbms_output.put_line(颜琪琪);end;2. 不换行输出dbms_output.put( 1个参数 );----不换行输出的后面 一定要有一个换行输出declarebegindbms_output.put(付浩浩);dbms_output.put(颜琪琪);dbms_output.put_line();---什么都没打印 换行输出 -----回车end;练习 打印输出 7566的员工的姓名岗位薪资部门编号以及部门平均工资以及领导的姓名----要求打印输出在一行---要求 7个打印输出declareV_ename varchar2(20);V_job varchar2(20);V_deptno number;V_sal number;V_avg number;V_ename2 varchar2(30);beginselect a.ename,a.job,a.sal,a.deptno,(select avg(sal) from emp c where c.deptnoa.deptno),b.enameinto V_ename,V_job,V_sal,V_deptno,V_avg,V_ename2from emp a ---员工left join emp b---领导on a.mgrb.empnowhere a.empno7566;dbms_output.put(V_ename);dbms_output.put(v_job);dbms_output.put(V_sal);dbms_output.put(V_deptno);dbms_output.put(V_avg);dbms_output.put(V_ename2);dbms_output.put_line();end;----------------------------------------------------------手动输入 例题 输入一个员工编号 打印输出该员工的姓名declareV_empno number : 员工编号 ;----建议 直接加上单引号----有多个手动输入的时候 提示词不能一样V_ename varchar2(20);beginselect ename into V_enamefrom empwhere empnoV_empno;dbms_output.put_line(V_ename);end;练习 插入一个员工编号 打印输出 该员工的 工资等级 ---表链接 拆开declareV_empno number : 请输入;V_grade number;beginselect gradeinto V_gradefrom empleft join salgradeon sal between losal and hisalwhere empnov_empno;dbms_output.put_line(V_grade);end;练习 传入一个员工编号 打印输出 该员工的部门的平均工资declareV_empno number:请输入;V_avg number;beginselect (select avg(sal) from emp b where b.deptnoa.deptno)into V_avgfrom emp awhere a.empnoV_empno;dbms_output.put_line(V_avg);end;变量类型1. 引用型变量类型2. 记录型变量类型1. 引用型变量类型1 %type(2) %rowtype%type :是指引用型变量类型可以引用某张表的某字段的属性还可以引用已经存在的属性语法declare变量1 表名.列名%type; ----引用某张表的某字段的属性变量2 变量1%type ; ----引用已经存在的属性beginend;-------1. 可以不知道列的属性------2 可以跟随字段属性的变化而变化例题 查询 7566 的员工的姓名 岗位 薪资以及 部门编号declareV_ename emp.ename%type;V_job emp.job%type;V_sal emp.sal%type;V_deptno V_sal%type;beginselect ename,job,sal,deptnointo V_ename,V_job,V_sal,V_deptnofrom empwhere empno7566;dbms_output.put_line(V_ename||V_job||V_sal||V_deptno );end;练习 打印输出 7566 的员工的姓名岗位薪资部门编号部门名称以及部门平均工资declareV_ename emp.ename%type;V_job emp.job%type;V_sal emp.sal%type;V_deptno emp.deptno%type;V_dname dept.dname%type;V_avg number;beginselect ename,job,sal,a.deptno,dname,(select avg(sal) from emp b where b.deptnoa.deptno)into V_ename,V_job,V_sal,V_deptno,V_dname,V_avgfrom emp aleft join depton a.deptnodept.deptnowhere a.empno7566;dbms_output.put_line(V_ename||V_job||V_sal||V_deptno||V_dname||V_avg);end;%rowtype : 是引用某张表的一行的字段属性 ---引用某张表的所有字段的属性--------------------------------------------复合类型语法declare变量1 表名%rowtype ; ---引用某张表的所有字段的属性---复合变量 包含了多个小变量-- a emp%rowtype ; ---引用某张表的所有字段的属性-- a.empno a.ename a.job a.sal a.comm a.mgr a.deptno a.hiredatebeginend;例题 打印输出 7566 的员工的姓名岗位薪资部门编号以及部门名称declareV_emp emp%rowtype; ----V_emp ---8V_dname varchar2(20);beginselect ename ,job ,sal ,emp.deptno ,dnameinto V_emp.ename ,V_emp.job ,v_emp.sal ,V_emp.deptno ,V_dnamefrom empleft join depton emp.deptno dept.deptnowhere empno7566;dbms_output.put_line( V_emp.ename ||V_emp.job ||v_emp.sal ||V_emp.deptno||V_dname);end;declareV_emp emp%rowtype; ----V_emp ---8V_dname varchar2(20);beginselect emp.*into v_empfrom empleft join depton emp.deptno dept.deptnowhere empno7566;dbms_output.put_line( V_emp.ename ||V_emp.job ||v_emp.sal ||V_emp.deptno||V_dname);end;练习 打印输出 7566的员工的姓名岗位薪资部门编号入职日期 以及该员工的 部门地址---%rowtypedeclareV_emp emp%rowtype; --复合变量V_loc dept.loc%type; ----------单独一个变量beginselect ename,job,sal,emp.deptno ,hiredate ,locinto V_emp.ename,V_emp.job,V_emp.sal,V_emp.deptno,V_emp.hiredate,V_locfrom empleft join depton emp.deptnodept.deptnowhere empno7566;dbms_output.put_line(V_emp.ename||V_emp.job||V_emp.sal||V_emp.deptno||V_emp.hiredate||V_loc);end;DECLAREV_EMP EMP%ROWTYPE; --8 v_emp.empnoV_LOC DEPT.LOC%TYPE;BEGINSELECT A.ENAME,A.JOB,A.SAL,A.DEPTNO,A.HIREDATE,B.LOCINTO V_emp.ename,V_JOB,V_SAL,V_DEPTNO,V_HIREDATE,V_LOCFROM EMP ALEFT JOIN DEPT BON A.DEPTNOB.DEPTNOWHERE EMPNO7566;DBMS_OUTPUT.PUT_LINE(V_ENAME||V_JOB||V_SAL||V_DEPTNO||V_HIREDATE||V_LOV);END;-------------------------------------------------记录型变量类型record--------复合类型 语法declaretype 类型名 is record(变量1 变量类型,变量2 变量类型.........) ; --声明类型-----复合类型变量名 类型名; ---复合变量 ---变量名.变量1 变量名.变量2beginend;例题 打印输出 7566员工的姓名 岗位 薪资 部门编号 以及部门名称declaretype c1 is record(V_ename varchar2(20) ,V_job emp.job%type,V_sal number,V_deptno number,V_dname dept.dname%type);---------------声明类型V_a c1; -----声明变量 V_a.V_ename V_a.V_job.....beginselect ename,job,sal,emp.deptno,dnameinto V_a.V_ename ,V_a.V_job,V_a.V_sal,V_a.V_deptno,V_a.V_dnamefrom empleft join depton emp.deptnodept.deptnowhere empno7566;dbms_output.put_line(V_a.V_ename ||V_a.V_job||V_a.V_sal||V_a.V_deptno||V_a.V_dname);end;注意 record 和 %rowtype 区别1. record 声明的时候比较麻烦2. %rowtype 不灵活