sql基础专栏做完了,仅仅是入门能到面试的程度,还是要不断学习的,加油!现在我会持续更新PLSQL部分。
1.概念:
PL/SQL是一种程序语言,叫做过程化SQL语言(Procedural Language/SQL)
PL/SQL是Oracle数据库对SQL语句的扩展。在普通SQL语句的使用上增加了编程语言的特点,
所以PL/SQL把数据操作和查询语句组织在PL/SQL代码的过程单元中,通过逻辑判断、循环等操作实现复杂的功能或者计算
2.语法:
declare--声明部分,做事情的准备工作,定义变量
begin--执行部分,需要做的事情,代码的编写
exception--异常部门,处理一些意外状况,处理异常
end;
3.变量和常量的声明
1.变量的声明
1.1变量的先声明后赋值
变量名称 数据类型;变量名称 := 值;
1.2变量的声明并赋值
变量名称 数据类型 := 值;
2.常量的声明
常量名称 constant (康斯忒的)数据类型 := 值;
注意:
1.常量声明要加 constant 关键字,声明时必须进行初始化赋值,并且不能修改常量的值
2.变量的值可以修改,但是以最后一次赋值为准
3.窗口内程序运行后会在后台打印输出结果
4.声明数据类型时,varchar2 必须加精度,number可以不加精度
5.变量一般用 "v_" 开头进行命名,常量一般用 "c_" 开头来命名,在公司按照公司要求来命名
4.数据类型的引用
4.1直接定义
变量名称 数据类型;
4.2引用某一个变量或者字段的数据类型 %type
变量名称%type/表名.列名%type 例:v_job emptest.job%type;
4.3引用某一张表所有字段的额数据类型 %rowtype
表名%rowtype(肉太噗)例:v_emp emptest%rowtype;
4.4复合类型type 表名 is record
例:type t1 is record (v_name varchar2(20),v_sal number,v_dno emptest.deptno%type ); v_emp t1;
5.获取键盘输入的信息
获取键盘输入的数字,字符串
例:v_num number := &请输入一个数字;(输入的是字符要带单引号)
v_str varchar2(20):='&请输入你的名字';
6.动态sql
1.动态sql是指在运行时候才构建的sql语句,静态sql指的是在代码编译时刻就已经包含在代码中的那些已经充分明确的固定的sql语句
2. 动态sql最大的优点就是可以灵活的用变量带入sql,还可以返回查询的值
3.在DML和事务控制的语句可以直接使用SQL,但是DDL语句及系统控制语句却不能在PL/SQL中直接使用,要想实现在PL/SQL中使用DDL语句及系统控制语句,可以通过使用动态SQL来实现
1.语法:
declare 定义变量1;--存放sql语句
begin
execute immediate 变量1 into 变量;
end;
7.练习
7.1查询键盘输入编号对应员工的岗位和领导姓名并打印输出
方法1:静态查询
declare
v_empno emp.empno%type := &请输入一编号;
v_job emp.job%type;
v_ename emp.ename%type;
begin
select job into v_job from emp where empno = v_empno;
select ename
into v_ename
from emp
where empno = (select mgr from emp where empno = v_empno);--分开查询
dbms_output.put_line(v_job || ' ' || v_ename);
end;
方法2:动态查询
declare
v_empno emp.empno%type := &请输入员工编号;--获取键盘输入的信息
v_sql varchar2(200);--直接定义不同的变量
v_job emp.job%type;--引用某一个变量或者字段的数据类型
v_ename emp.ename%type;
begin
v_sql := 'select t2.job,t1.ename from emp t1
inner join emp t2
on t1.mgr=t2.empno
where t1.empno= ' || v_em
pno;--from,where后面不能是变量
execute immediate v_sql
into v_job, v_ename;
dbms_output.put_line(v_job || '--' || v_ename);--不能用逗号隔开
end;
7.2键盘输入一个表名,打印输出这个表中数据的条数
declare
v_emp varchar2(200) := '&请输入表名';
v_sql varchar2(200);
v_count number;
begin
v_sql := 'select count(1) from '||v_emp;--from后面要有空格与管道符隔开
dbms_output.put_line(v_sql);
execute immediate v_sql
into v_count;
dbms_output.put_line(v_count);
end;--只能用动态查询,from后面加变量它只会认为是表名,所以用拼接符
7.3.删除 emptest 表中的第一行数据, 并且打印输出删除员工的 名字和入职日期
declare
v_ename emp.ename%type;
v_hiredate emp.hiredate%type;
begin
delete from emp
where rownum = 1
returning ename, hiredate into v_ename, v_hiredate;--一条代码直接输出
dbms_output.put_line(v_ename || v_hiredate);
end;
7.4.键盘输入一个员工编号, 修改该员工的薪水为 3000,并输出前后薪水
declare
v_empno emp.empno%type := '&请输入员工编号';
v_new_sal number;
v_old_sal number;
begin
select sal into v_old_sal from emp where empno = v_empno;
update emp
set sal = 3000
where empno = v_empno
returning sal into v_new_sal;
dbms_output.put_line(v_old_sal || ' ' || v_new_sal);
end;