plsql语言
目的
是为了在复杂的业务逻辑可以写入数据库,能够减少数据库和服务器之间交互,提高执行效率
plsql语言中的测试窗口可以进行代码的编写
分为三个部分 声明 、可执行 、异常处理
DECLARE
--[声明]变量、游标
I integer;
BEGIN
--[执行]
--[异常处理]
END;
HelloWord 案例
-- Created on 2021/5/14 by ADMIN
declare
--没有变量的定义可以省略
-- 打印hellowoerd
begin
--sout(“helloword”)
DBMS_output.put_line('hello word');
end;
如果想要在黑窗口执行,需要先输入
set serveroutput on
接着在 上述helloword 代码后面添加一个
/
常见变量
1.普通数据类型
char,varchar2,date,number,bollean,long
2.特殊变量类型
引用型变量、记录型变量
变量声明方式
不建议直接使用name 需要区分同名关键字
变量名 类型 例如:v_name varchar2(20)
赋值语句
1.直接赋值 :=
2语句赋值 select ~ into ~
-- Created on 2021/5/14 by ADMIN
declare
--姓名
v_name varchar2(16) :='张三';
--薪水
v_sal number;
--地址
v_addr varchar2(128);
begin
--直接赋值
v_sal :=1500;
--语句赋值
select '兆尹科技' into v_addr from dual;
--打印赋值
dbms_output.put_line('姓名:'|| v_name || ',薪水:' || v_sal|| '.地址:' || v_addr);
end;
引用型变量
通过表名.列名%TYPE 指定类型 例如v_name emp.ename%TYPE
-- Created on 2021/5/14 by ADMIN
declare
--姓名,不需要指定类型,跟着表的字段类型设定
v_name emp.name%type;
--编号,不需要指定类型,跟着表的字段类型设定
v_id emp.id%type;
--地址
v_addr varchar2(128);
begin
select name,id into v_name,v_id from emp where id = 1;
--打印赋值
dbms_output.put_line('姓名:'|| v_name || ',编号:' || v_id );
end;
记录型变量
接收对应表中的一 整行记录
-- Created on 2021/5/14 by ADMIN
declare
--记录型变量,记录不超过8列
v_emp emp%rowtype;
begin
select * into v_emp from emp where id = 1;
--打印赋值
dbms_output.put_line('姓名:'|| v_emp.name || ',编号:' || v_emp.id || ',薪水:' || v_emp.sal || ',部门:' || v_emp.dept );
end;
结果:
//姓名:小虎,编号:1,薪水:8000,部门:信用卡
流程控制
if判断
谨记:有开始就有结束
--判断emp表中的记录是否超过3条
declare
--声明变量接收emp表中的数量
v_count number;
begin
select count(1) into v_count from emp;
if v_count > 3 then
dbms_output.put_line('emp表中记录超过了3条:' || v_count);
--这里是 elsif
elsif v_count > 1 then
dbms_output.put_line('emp表中记录超过了1条 为:' || v_count ||'条');
else
dbms_output.put_line('emp表中记录没有记录');
end if;
end;
循环
loop循环
BEGIN
loop
exit when
end loop;
END;
--判断打印数字-1-10
declare
--声明循环变量
v_num number := -1;
begin
loop
exit when v_num > 10 ;
--输出
dbms_output.put_line(v_num);
-- 自增
v_num := v_num + 1;
END LOOP;
end;
游标
字面意思 类似ResultSet中的的next指针
使用方法 声明-》打开-》读取-》关闭
声明:
cursor 游标名[(参数列表)] is 查询语句;
游标的打开:
open 游标名;
游标的取值
fetch 游标名 into 变量列表;
游标的关闭
close 游标名;
属性
属性 | 返回值 | 说明 |
---|---|---|
%rowcount | 整 型 | 获得FETCH语句返回的行数 |
%found | 布尔型 | fetch 有数据为真,没数据为假 |
%notfound | 布尔 | 与fetch属性的返回值相反 |
%isopen | 布尔型 | 游标已经打开时值为真,否则为假 |
创建和使用
--游标遍历emp表中的工资和姓名并打印出来
declare
--声明无参数游标
cursor c_emp is select name,sal from emp;
--声明变量接收游标遍历出来的值
v_name emp.name%type;
v_sal emp.sal%type;
begin
--打开游标
open c_emp;
--遍历游标
loop
--获取游标中的数据
fetch c_emp
into v_name,v_sal;
--退出条件C_emp 中不再有数据
exit when
c_emp%notfound;
dbms_output.put_line(v_name|| '---'|| v_sal);
--退出循环
end loop;
--关闭游标
close c_emp;
end;
带参游标
--依据编号遍历emp表,编号手动输入
declare
--声明游标
cursor c_emp(v_id emp.id%type) is select name,sal from emp where id = v_id;
--声明变量接收游标遍历出来的值
v_name emp.name%type;
v_sal emp.sal%type;
begin
--打开游标
open c_emp(1);
--遍历游标
loop
--获取游标中的数据
fetch c_emp into v_name,v_sal;
--退出条件C_emp 中不再有数据
exit when c_emp%notfound;
dbms_output.put_line(v_name|| '---'|| v_sal);
end loop;
--关闭游标
close c_emp;
end;
存储概念
目的是为了减少数据库的开闭,减少资源的消耗,同时将操作语句写在plsql中不容易出错,而且有日志恢复等功能
语法
create or replace procedure 过程名称[(参数列表)] is
BEGIN
END [过程名称];
依据参数的类型分为三类
(1)不带参数
文件-新建-程序窗口-procedure
create or replace procedure p_hello as
--声明变量
begin
dbms_output.put_line('hello world');
end p_hello;
--在调试窗口中调用
BEGIN
--plsql调用存储过程;
p_hello;
END;
--输出
//hellow world
在黑窗口中使用也可以打印
exec p_hello
(2)带输入参数
--根据编号查询员工信息
create or replace procedure p_query(i_id in emp.id%type) as
--声明变量
v_name emp.name%type;
v_sal emp.sal%type;
v_dept emp.dept%type;
begin
--查询emp表中的员工信息
select name,sal,dept into v_name,v_sal,v_dept from emp where id=i_id;
dbms_output.put_line('姓名:'||v_name || ',薪水' ||v_sal||',部门'||v_dept);
end p_query;
调用同理
(3)带输入参数和返回值的
--根据编号查询员工信息,将薪水作为返回值
create or replace procedure p_query_out(i_id in emp.id%type,o_sal out emp.sal%type) as
begin
select sal into o_sal from emp where id = i_id;
end p_query_out;
调用
--声明变量接收 o_sal
declare
v_sal emp.sal%type;
BEGIN
--调用方法斌传值
p_query_out(1,v_sal);
dbms_output.put_line(v_sal);
END;