oracle学习1 基于oracle数据库的PLSQL编程以及存储过程的创建和使用视频

时间:2021-11-06 03:28:31

https://www.bilibili.com/video/av46777605

 

plsql中选择testWindow中可以进行测试

 

1、编写函数在plsql的testwindow中

  begin
    dbms_output.put_line(‘hello,world‘);
  end;

  运行后可以在DBMS_output标签页中看到

  如果在sqlplus中运行的话,需要输入一个  /  来表示输入完了,但因为sqlplus默认是不打开显示的,需要输入 set serveroutput on

 

2、变量赋值

oracle学习1 基于oracle数据库的PLSQL编程以及存储过程的创建和使用视频

 

 

-- Created on 2019/11/14 by LENOVO
declare
--姓名
V_NAME VARCHAR2(20);
--薪水
V_SAL NUMBER;
--地址
V_ADDR VARCHAR2(200);
begin
--直接赋值
V_NAME:=‘ADAM‘;
V_SAL:=1590;
--语句赋值
select ‘hello‘ into v_addr from dual;
--打印输出
DBMS_OUTPUT.PUT_LINE(‘姓名:‘||v_name||‘,薪水:‘||v_sal);
end;

oracle学习1 基于oracle数据库的PLSQL编程以及存储过程的创建和使用视频

 

 

oracle学习1 基于oracle数据库的PLSQL编程以及存储过程的创建和使用视频

 

 

3、两个变量该怎么写,另外声明的对象类型是什么样,去【表名】【字段名】【%TYPE】来定义

oracle学习1 基于oracle数据库的PLSQL编程以及存储过程的创建和使用视频

 

 

declare
--姓名
V_NAME PERSON.NAME%TYPE;
--分数
V_HEIGHT PERSON.HEIGHT%TYPE;
begin
SELECT NAME,HEIGHT INTO V_NAME,V_HEIGHT FROM PERSON WHERE AGE=20;
DBMS_OUTPUT.PUT_LINE(‘姓名:‘||V_NAME||‘,身高:‘||V_HEIGHT);

end;

4、记录型变量

接受表中的一整行记录,相当于Java中的一个对象,注意,只能接收一条记录

语法:变量名称   表名%ROWTYPE 如V_PERSON PERSON%ROWTYPE;

declare
--一行记录
V_PERSON PERSON%ROWTYPE;
begin
SELECT * INTO V_PERSON FROM PERSON WHERE AGE=20;
DBMS_OUTPUT.PUT_LINE(‘姓名:‘||V_PERSON.NAME);
end;

oracle学习1 基于oracle数据库的PLSQL编程以及存储过程的创建和使用视频

 

5、流程控制

 

oracle学习1 基于oracle数据库的PLSQL编程以及存储过程的创建和使用视频

 

 

注意关键字ELSIF   中间少了个E

oracle学习1 基于oracle数据库的PLSQL编程以及存储过程的创建和使用视频

 

 

---判断person表中的记录数是否超过5条
declare
v_count NUMBER;
begin
SELECT COUNT(1) INTO v_count from person;
if (v_count < 5) then
DBMS_OUTPUT.PUT_LINE(‘小于5,共:‘ || v_count);
Elsif (v_count < 10) then
DBMS_OUTPUT.PUT_LINE(‘大于5 小于10,共:‘ || v_count);
Else
DBMS_OUTPUT.PUT_LINE(‘大于15,共:‘ || v_count);
end if;
end;

 6、循环

oracle学习1 基于oracle数据库的PLSQL编程以及存储过程的创建和使用视频

 

 

---判断person表中的记录数是否超过5条
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;

 

7、游标

oracle学习1 基于oracle数据库的PLSQL编程以及存储过程的创建和使用视频

 

 

oracle学习1 基于oracle数据库的PLSQL编程以及存储过程的创建和使用视频

 

 oracle学习1 基于oracle数据库的PLSQL编程以及存储过程的创建和使用视频

 

 

---使用游标查询person中所有的的姓名和身高,并将其打印出来
declare
---声明游标
CURSOR C_PERSON is
select NAME, AGE from PERSON;
--声明变量接收游标中的数据
v_NAME PERSON.NAME%TYPE;
v_AGE PERSON.AGE%TYPE;
BEGIN
--打开游标
OPEN C_PERSON;
LOOP
--获取游标中的数据
FETCH C_PERSON INTO V_NAME, V_AGE;
--如果没有指向的语句了,就退出
EXIT WHEN C_PERSON%NOTFOUND;
--打印输出
DBMS_OUTPUT.put_line(V_NAME || ‘--‘ || V_AGE);
END LOOP;
--关闭游标
CLOSE C_PERSON;
end;

8、带参数的游标

oracle学习1 基于oracle数据库的PLSQL编程以及存储过程的创建和使用视频

 

 

---使用游标查询person中【身高】为【1.68】的姓名和身高,并将其打印出来
DECLARE
---声明游标
CURSOR C_PERSON(V_HEIGHT person.height%type) is
select NAME, AGE from PERSON where height = V_height;
--声明变量接收游标中的数据
v_NAME PERSON.NAME%TYPE;
v_AGE PERSON.AGE%TYPE;
BEGIN
--打开游标
OPEN C_PERSON(1.68);
LOOP
--获取游标中的数据
FETCH C_PERSON
INTO V_NAME, V_AGE;
--如果没有指向的语句了,就退出
EXIT WHEN C_PERSON%NOTFOUND;
--打印输出
DBMS_OUTPUT.put_line(V_NAME || ‘--‘ || V_AGE);
END LOOP;
--关闭游标
CLOSE C_PERSON;
END;

 

9、存储过程

以上是在TestWindow中执行的,可以进行调试

如果写的是procedure,就不能调试了

exec p_hello   用这个来在sqlplus调用存储过程。

is as 是可以互相替换的。

存储过程中没有declare关键字,decalre用在语句块中。

 

10、带输入参数的存储过程

oracle学习1 基于oracle数据库的PLSQL编程以及存储过程的创建和使用视频

 

 

create or replace procedure p_queryNameAgeHeight(v_name in person.name%type) as
v_age person.age%type;
v_height person.height%type;
begin
select age,height into v_age,v_height from person where person.name=v_name;
dbms_output.put_line(v_name||‘--‘||v_age||‘--‘||v_height);
end p_queryNameAgeHeight;

执行

 exec p_querynameageheight(‘may‘);

11、带输出参数的存储过程

重新写一个带输出参数的存储过程

oracle学习1 基于oracle数据库的PLSQL编程以及存储过程的创建和使用视频

 

 

通过testWindow写代码调用之

oracle学习1 基于oracle数据库的PLSQL编程以及存储过程的创建和使用视频

 

 存储过程和testWindow中的输出都显示在这里了。

oracle学习1 基于oracle数据库的PLSQL编程以及存储过程的创建和使用视频

 

create or replace procedure p_queryNameAgeHeight(v_name in person.name%type,
v_height in out person.height%type) as
v_age person.age%type;

begin
select age, height
into v_age, v_height
from person
where person.name = v_name;
dbms_output.put_line(v_name || ‘--‘ || v_age || ‘--‘ || v_height);
end p_queryNameAgeHeight;

 

-- Created on 2019/11/14 by LENOVO
declare
v_height person.height%type;
begin
-- Test statements here
p_querynameageheight(‘may‘,v_height);
dbms_output.put_line(v_height);
end;

 

 

通常在程序中,使用方法调用存储过程。

【存储函数】类似于 【存储过程】,唯一的区别是 【存储函数】必须有返回值,而【存储过程】没有返回值,但可以通过输出参数代替。

目前大家调用的都是【存储过程】,因为相对灵活。