---使用游标查询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、带参数的游标
---使用游标查询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、带输入参数的存储过程
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、带输出参数的存储过程
重新写一个带输出参数的存储过程
通过testWindow写代码调用之
存储过程和testWindow中的输出都显示在这里了。
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;
通常在程序中,使用方法调用存储过程。
【存储函数】类似于 【存储过程】,唯一的区别是 【存储函数】必须有返回值,而【存储过程】没有返回值,但可以通过输出参数代替。
目前大家调用的都是【存储过程】,因为相对灵活。