目录
PLSQL基础语法
PLSQL简介
PL/SQL(Procedural Language/SQL)是一种过程化语言,属于第三代语言,它与C、
C++、Java等语言一样关注于处理细节,可以用来实现比较复杂的业务逻辑。它允许SQL的数据操纵语言和查询语句包含在块结构(block_structured)和代码过程语言中,使PL/SQL成为一个功能强大的事务处理语言。在甲骨文数据库管理方面,PL/SQL是对结构化查询语言(SQL)的过程语言扩展。PL/SQL的目的是联合数据库语言和过程语言。
PL/SQL的基本单位叫做块,由三个部分组成:一个声明部分,一个执行部分和异常处理部分。
PLSQL程序结构
PL/SQL程序都是以块(block)为基本单位,整个PL/SQL块分三部分:声明部分(用
declare开头)、执行部分(以 begin开头)和异常处理部分(以exception开头)。其中执行部分是必须的,其他两个部分可选。无论PL/SQL程序段的代码量有多大,其基本结构就是由这三部分组成。
示例:
declare --声明部分
begin --可执行部分
exception --异常处理部分
end; --结束
输出打印变量
-- 打印变量函数
DBMS_OUTPUT.put_line() --在控制台打印参数内容,并换行
DBMS_OUTPUT.put() --输出但不换行,后面如果没有line则不输出
自动替换功能:
工具-首选项-编辑器-自动替换
print=dbms_output.put();
printl=dbms_output.put_line();
可以加入其他自己方便的代码替换。
自动替换定义示例:
变量定义规范
变量名由字母、数字和下划线组成,且必须以字母开头,长度不得超过30个字符,不区分大小写。
变量&常量
变量&常量定义:
变量名称 数据类型 := 值;
常量名称 constant 数据类型 := 值;
示例:
v_empno number:=4;
v_ename constant varchar2(20) := 'SCOTT';
键盘输入给变量赋值
通过&符号进行变量赋值操作
-- 接收的数据是数字,直接写:=&参数名
-- 接收的数据是字符串类型:='&参数名'
declare
-- 声名一个变量保存一个员工姓名
v_ename varchar2(20);
eno number(4):=&请输入员工编号;
begin
-- 查询7369的姓名
select ename into v_ename from emp where empno=eno;
-- 打印员工姓名
dbms_output.put_line(v_ename);
end;
变量常量使用
declare
x number(4):=2;
y number(4);
z constant number(4):=8;
begin
y:=4;
x:=5;
dbms_output.put(x);
dbms_output.put(y);
dbms_output.put_line(null);
dbms_output.put_line(x);
dbms_output.put_line(y);
dbms_output.put_line(z);
end;
作业
--1. 声明三个变量分别存储你的姓名,今天的时间,你的身份证号码前6位,并打印输出
declare
Myname varchar2(5):='石XX';
today date:=sysdate;
IdCard number(6):=452402;
begin
dbms_output.put_line(Myname);
dbms_output.put_line(to_char(today,'yyyymmdd'));
dbms_output.put_line(IdCard);
end;
/*2. 输入两个数字输出数字的和是多少,差是多少,积是多少
注:运算要用小括号括起先执行*/
declare
Number1 number(3):=&Number1 ;
Number2 number(3):=&Number2 ;
begin
dbms_output.put_line((Number1+Number2));
dbms_output.put_line((Number1-Number2));
dbms_output.put_line((Number1*Number2));
end;
--3. 计算圆的面积和周长,声明常量π声明变量半径r,执行过程中给r重新赋值再重新计算
declare
Π number(6,2):=3.14;
r number(3,2):=&输入半径:;
begin
dbms_output.put_line('圆的面积为:'||Π*r*r);
dbms_output.put_line('圆的周长为:'||2*Π*r);
end;
/*4. 在代码块中将部门编号:50,部门名称:Administration,部门地址:guilin,的信
息插入到scott.dept表中。*/
declare
begin
insert into dept(deptno,dname,loc) values(50,'Administration','guilin');
end;
错点复习
数据类型 number(m,n)--共m位,小数占n位,n不写则取整。
变量赋值
SQL语句给变量赋值
DQL语句赋值
select 列,...列 into 变量,...变量 from 表;
示例:
-- 给变量赋值
select ename into v_ename from emp where empno=7654;
-- 给复合型变量赋值
select * into v_emp from emp where empno=7788;
DML语句赋值
insert into 表名 values(值1,值2...) returning 表名.值1 into 变量名;
update 表名 set 列名1='值1' returning 表名.值1 into 变量名;
delete from 表名 where 判断条件 returning 表名.值1 into 变量名;
示例:
-- 插入语句赋值
insert into emp(empno,ename,job,deptno) values(9999,'TOM','MANAGER',10)
returning emp.empno,emp.ename,emp.job into v_empno,v_ename,v_job;
-- 更新语句赋值
update emp set deptno=30 where empno ='9999' returning emp.deptno into v_deptno;
-- 删除语句赋值
delete from dept where deptno=10 returning deptno,dname,loc into v_dept;
returning 进行赋值 ,insert update 语句获取的是插入和更新后的值, delete获取的是
删除前的值。
增删改示例
declare
dname varchar2(20);
begin
insert into dept values(70,'test','test')
returning dept.dname into dname;
dbms_output.put_line(dname);
update dept set dname='hh' where deptno=50
returning dname into dname;
dbms_output.put_line(dname);
delete from dept where deptno=40
returning dname into dname;
dbms_output.put_line(dname);
end;
引用型变量定义:
变量名称 表名.列名%type;
示例:
v_job emp.job%type;
复合型变量定义
变量名称 表名%rowtype;
示例:
v_emp emp%rowtype;
declare
x number(4):=2;
y number(4);
z constant number(4):=8;
v_ename emp.ename%type:='test';
v_emp emp%rowtype;
begin
y:=4;
x:=5;
dbms_output.put(x);
dbms_output.put(y);
dbms_output.put_line(null);
dbms_output.put_line(x);
dbms_output.put_line(y);
dbms_output.put_line(z);
dbms_output.put_line(v_ename);
select ename into v_ename from emp where empno=7788;
dbms_output.put_line(v_ename);
select * into v_emp from emp where empno=7788;
dbms_output.put_line(v_emp.empno||v_emp.ename);
select empno,ename into v_emp.empno,v_emp.ename from emp where empno=7369;
dbms_output.put_line(v_emp.empno||v_emp.ename);
end;
自定义型变量定义
type 记录名 is record(变量 数据类型,变量 数据类型......);
变量名 记录名;
declare
type ha_type is record(
x number(4),
v_ename emp.ename%type,
v_emp emp%rowtype
);
v_ha ha_type;
begin
v_ha.x:=5;
select ename into v_ha.v_ename from emp where empno=7788;
select * into v_ha.v_emp from emp where empno=7788;
dbms_output.put_line(v_ha.x);
dbms_output.put_line(v_ha.v_ename);
dbms_output.put_line(v_ha.v_emp.ename);
end;
作业2
PS:第五题自学了一下后面的知识(循环,游标)。
--1.输入员工编号打印员工的姓名,部门编号和工资
declare
v_empno emp.empno%type:=&输入员工编号;
type names is record(
ename emp.ename%type,
deptno emp.deptno%type,
sal emp.sal%type
);
edsemp names;
begin
select ename,deptno,sal into edsemp.ename,edsemp.deptno,edsemp.sal from emp
where empno=v_empno;
dbms_output.put_line(edsemp.ename||' '||edsemp.deptno||' '||edsemp.sal);
end;
--2.打印7839这个员工的名称,部门名称,工作地
declare
type names is record(
ename emp.ename%type,
dname dept.dname%type,
loc dept.loc%type
);
edlmp names;
begin
select ename,dname,loc into edlmp.ename,edlmp.dname,edlmp.loc
from emp left join dept on emp.deptno=dept.deptno
where empno=7839;
dbms_output.put_line(edlmp.ename||' '||edlmp.dname||' '||edlmp.loc);
end;
--3.添加一条数据到dept,打印部门编号
declare
NewDeptno dept.deptno%type;
begin
insert into dept(deptno,dname,loc) values(50,'Administration','guilin');
select deptno into NewDeptno from dept where deptno=50;
dbms_output.put_line(NewDeptno);
end;
--4.修改emp表empno=7839工资为8000,打印姓名和工资
declare
type names is record(
ename emp.ename%type,
sal emp.sal%type
);
esmp names;
begin
update emp set sal=8000 where empno=7839;
select ename,sal into esmp from emp where empno=7839;
dbms_output.put_line(esmp.ename||' '||esmp.sal);
end;
--5.删除部门40的部门信息,打印部门名称和地址
declare
cursor cur_dept is select dname,loc from dept;
v_dept cur_dept%rowtype;
row0 number(10);
begin
delete from dept where deptno=40;
select max(rownum) into row0 from dept;
open cur_dept;
for i in 1..row0
loop
fetch cur_dept into v_dept;
dbms_output.put_line(v_dept.dname||' '||v_dept.loc);
end loop;
close cur_dept;
end;
--6.使用输入学生的学号,打印姓名,总分,平均分
declare
type names is record(
sname student.sname%type,
sumscore sc.score%type,
avgscore sc.score%type);
scname names;
ssno student.sno%type:='&输入学号:';
begin
select sname,sum(score),avg(score) into scname
from student left join sc on student.sno=sc.sno
where student.sno=ssno group by sname;
dbms_output.put_line(scname.sname||' '||scname.sumscore||' '||scname.avgscore);
end;
--7.输入一个日期打印星期几,明天的日期,以及一年零三个月后的日期
declare
daytime date:=to_date('&输入日期','yyyymmdd');
daytime_tomorrow date:=daytime+1;
daytime_future date:=add_months(daytime,15);
daytime_day varchar2(10):=to_char(daytime,'day');
begin
dbms_output.put_line(daytime_day);
dbms_output.put_line(to_char(daytime_tomorrow,'yyyymmdd'));
dbms_output.put_line(to_char(daytime_future,'yyyymmdd'));
end;
错点复习2
Lead()函数:
Select lead(X,N,M)over(......) from B;
以B表X列为目标向下取数,每次取N位,取不到为M。
增删改常用句式:
增:alter table X add......
Insert into X values(......)/(子查询)
删: drop table X
Alter table X drop column Y
Delete from X where......
Alter table X delete column Y
改:
Update X set ... where...
Alter table X modify ...