pl/sql
Procedual language/structured query language(程序语言/结构化查询语言)
sql语言只是访问,操作数据库的语言,而并不是一种程序设计语言,因此不能用于程序开发
pl/sql是oracle在标准sql语言上进行过程性扩展后形成的程序设计语言
plsql匿名代码块结构
declare
--声明部分,主要包含变量的声名,类型的定义等
begin
--plsql代码,主要包含流程控制语句,增删改查语句
exception
--异常处理代码,当程序出现错误时执行这一部分
end;
注释
declare
--单行注释,两个中划线后面的内容为注释
begin
/*多行注释
我是注释
**,我也是注释
*/
end;
获取键盘输入的值
用一个变量承接键盘输入
declare
v_name emp.ename%type;
v_empno number(20):=&编号;
begin
select ename into v_name from emp where empno=v_empno;
dbms_output.put_line(v_name);
end;
直接用列名承接键盘输入
declare
v_name emp.ename%type;
begin
select ename into v_name from emp where empno=&empno;
dbms_output.put_line(v_name);
end;
变量和常量
- 变量
- 内容可变,一般以v_开头
- 常量
- 内容不能变更,声明时用constant关键字,可以用c开头
变量的定义
变量名 数据类型[:=默认值];
常量的定义
常量名 constant 数据类型:=初始值;
变量名,常量名,存储过程名,函数名,触发器名等,都叫做标识符
- 标识符的命名规范
- 可以有数字,字母,下划线,$等,只能以字母开头,长度不超过30个字符
- 不能使用oracle中的关键字作为标识符的名字
declare
v_str1 varchar2(20); --声明字符串变量
v_str2 varchar200(20):='abc'; --声明变量时设置初始值
PI constant number(15,14):=3.1415926; --声明常量
begin
v_str1:='abc'; --将变量的值设置为'abc'
dbms_output.put_line(v_str1||v_str2||PI); --输出到屏幕
end;
输出屏幕abcabc3.1415926
特殊的数据类型
1,%type类型
- type类型
- 将数据库表中的某个字符的类型,作为一个类型
- 语法
变量名 表名.列名%type
/*empno的类型是number(4),v_empno的类型就是number(4),相当于v_empno
number(4);*/
v_empno emp.empno%type;
2,record类型
record类型:是记录类型,它可以存放多个值
使用时需要先声名一个记录类型(定义一个类型),根据定义的类型去声名变量
type 类型名 is record(
属性名 数据类型 [not null] [:=默认值],
属性名 数据类型,
属性名 数据类型,
..
属性名 数据类型
);
记录类型变量的声名:
变量名 记录类型名;
记录类型的使用:
不能直接使用变量名等于一个普通的数据.
变量名.属性名:=值; --记录类型的赋值(给记录类型的属性赋值)
变量名.属性名; --取一个记录变量的属性值
例子
declare
--声明一个记录类型,有两个属性,一个数字类型,一个字符串类型
type my_type is record(
n number(4):=1,
str varchar2(20)
);
--声明一个记录类型变量
v_rec my_type;
begin
--打印记录类型默认的n属性的值
dbms_output.put_line(v_rec.n);
--修改记录类型的属性值
v_rec.n:=9;
v_rec.str:='abc';
--打印n和str的值
dbms_output.put_line(v_rec.n||' - '||v_rec.str);
end;
3,%rowtype类型
- %rowtype类型:
- 它是%type类型和record类型的结合,表示声名一个记录类型,它属性和某个表中的列相同(包含属性名和列名的相同,以及数据类型也相同)
声明
变量名 表名%rowtype;
使用
变量名.属性名
例子
declare
/*声明一个dept表的%rowtype 类型的变量
它相当于如下代码
type dept_type is record(
deptno dept.deptno%type,
dname dept.dname%type,
loc dept.loc%type
);*/
v_dept dept%rowtype;
begin
--给v_dept的各个属性赋值
v_dept.DEPTNO:=10;
v_dept.DNAME:='CLERK';
v_dept.LOC:='qingdao';
--打印v_dept的属性值
dbms_output.put_line(v_dept.deptno||' - '||
v_dept.DNAME||' - '||
v_dept.LOC);
end;
简单增删改查
查询数据
plsql代码块中不能直接使用select语句
- select into语句相当于在之前的sql语句中添加into
- 表示将sql语句的查询结果保存到into后面的变量中
- lect into语句的查询结果只能是一条记录
- 查不到数据或者查到超过一条语句,就会报错
declare
--声明一个变量用来保存员工的姓名
v_name emp.ename%type;
begin
--将员工编号为7654的员工姓名查询出来,保存到变量v_name中
select ename into v_name from emp where empno=7654;
--输出到屏幕
dbms_output.put_line(v_name);
end;
declare
--声明一个%rowtype类型的变量用来保存一条员工信息
v_emp emp%rowtype;
begin
--查询出7369的员工信息保存到变量v_emp中
select * into v_emp from emp where empno=7369;
--打印v_emp
dbms_output.put_line(v_emp.empno||' , '||
v_emp.ename||' , '||
v_emp.deptno||' , '||
v_emp.sal);
end;
更新数据
begin
update emp set sal=900 where empno=7777;
commit;
end;
插入数据
begin
insert into emp(empno,ename,job,sal,deptno)
values(7922,'lisa','clerk',1600,30);
commit;
end;
删除数据
begin
delete from emp where empno=7922 and ename='lisa';
commit;
end;
execute immediate语句
查询数据
execute immediate select语句 into 变量;
这种语法只能查出一条数据,into后面的变量用来存放sql语句的执行结果
declare
--声明一个变量保存员工姓名
v_name varchar2(30);
begin
--使用execute immediate语句查询出员工7369的姓名
execute immediate 'select ename from emp where empno=7369'
into v_name;
--打印员工的姓名
dbms_output.put_line(v_name);
end;
declare
--声明一个变量保存员工姓名
v_name varchar2(30);
--声明一个变量保存查询代码
v_select varchar(200):='select ename from emp where
empno=7369';
begin
--使用execute immediate语句查询出员工7369的姓名
execute immediate v_select into v_name;
--打印员工的姓名
dbms_output.put_line(v_name);
end;
插入数据
增删改类似
declare
--声明一个变量用来保存sql语句
v_sql varchar(255);
begin
--给sql变量赋值
v_sql:=q'[insert into emp(empno,ename,deptno)
values(9123,'june',10)]';
--执行
execute immediate v_sql;
commit;
end;
若执行的代码中包含单引号时,可以使用q'[]'包裹语句赋到变量,也可以将代码中的单引号改为双引号:
执行建表语句
declare
--声明一个变量保存sql语句
v_sql varchar2(255);
begin
v_sql:='create table t3(id number(11),name varchar2(40))';
execute immediate v_sql;
end;
execute immediate的传值
declare
--声明一个变量用于保存sql语句
v_sql varchar2(255);
--声明一个变量存储员工姓名
v_name varchar2(20);
begin
--sql语句中使用占位符
v_sql:='select ename from emp where empno=:1';
--执行sql语句,并使用using给sql语句传值
execute immediate v_sql into v_name using 7777;
--打印
dbms_output.put_line(v_name);
end;
:n表示在execute immediate中的参数占位符,n可以是自然数据,从1开始
using后面是传给sql语句的值,它顺序和参数占位符的位置相对应
declare
--声明变量,用于存储sql语句
v_sql varchar2(255);
--声明变量,用于查询结果
v_job varchar2(40);
begin
--给v_sql变量赋值
v_sql:='select job from emp where empno=:1 and ename=:2';
--执行查询命令
execute immediate v_sql into v_job using 7654,'MARTIN';
dbms_output.put_line(v_job);
end;