📄 车站光标练习.txt
字号:
--表结构和数据参见 车站综合练习.txt
--查询某一车次的所有站,及其终点起点,
--没有车站信息!有bus信息
insert into bus values('120',to_date('6:00:00','hh24:mi:ss'),to_date('23:00:00','hh24:mi:ss'),
1,'北京西站','中关村');
create or replace procedure getstation(p_busno in varchar2) is
v_qidian bus.qidian%TYPE;
v_zhongdian bus.zhongdian%TYPE;
v_station busstation.station%TYPE;
cursor c_station(busno varchar2) is select station from busstation
where busno=p_busno;
begin
select qidian,zhongdian into v_qidian ,v_zhongdian from bus where busno=p_busno;
dbms_output.put_line ( p_busno || '路车 ' || '起点站:' || v_qidian || ',终点站: '|| v_zhongdian);
open c_station(p_busno);
--第一次fetch纪录,如busstation中没有这次车的车站信息。光标对应集为空
fetch c_station into v_station;
if c_station%notfound then
dbms_output.put_line('没有这次车的车站信息');
else
--如果有纪录,输出。接着循环输出其它各站
dbms_output.put_line(v_station);
loop
fetch c_station into v_station;
if c_station%notfound then
exit ;
end if;
dbms_output.put_line(v_station);
end loop;
end if;
close c_station;
end;
--本过程未处理当没有给定车次的情况
--查询从A站到B站能坐的所有车--------------------------------------------------
create or replace procedure findbus (p_station1 in varchar2,p_station2 in varchar2)
is
cursor c_station (st1 varchar2,st2 varchar2)
is select busno from busstation where station = st1
intersect
select busno from busstation where station = st2;
v_bus busstation.busno%TYPE;
begin
open c_station(p_station1,p_station2);
fetch c_station into v_bus;
if c_station%notfound then
dbms_output.put_line('没有车可以到达');
else
dbms_output.put_line('可以到达的车如下:');
dbms_output.put_line(v_bus);
loop
fetch c_station into v_bus;
exit when c_station%notfound;
dbms_output.put_line(v_bus);
end loop;
end if;
end;
call findbus('a','b');
call findbus('中关村','白石桥');
--现在能有车A站到B站能坐的所有车吗-------------------------------------------------
--建立函数:sysdate是否在指定车次首末车时间之间
-- return 0 没有 1 有
create or replace function in_shou_mo (p_busno varchar2) return number is
r_bus bus%rowtype;
begin
select * into r_bus from bus where busno=p_busno;
if r_bus.shouban < to_date(to_char(sysdate,'hh24:mi:ss'),'hh24:mi:ss' )
and r_bus.moban > to_date(to_char(sysdate,'hh24:mi:ss') ,'hh24:mi:ss') then
--sysdate在首末车时间之间
return 1;
else
return 0;
end if;
end;
--更改末班时间测试
insert into bus values('301',to_date('5:30:00','hh24:mi:ss'),to_date('20:10:00','hh24:mi:ss'),
1,'农展馆','巴沟村');
select in_shou_mo('301') from dual;
----------------------------------------------存储过程 调用函数in_shou_mo-------------------
create or replace procedure findbus_now (p_station1 in varchar2,p_station2 in varchar2)
is
cursor c_station (st1 varchar2,st2 varchar2)
is select busno from busstation where station = st1
intersect
select busno from busstation where station = st2;
v_bus busstation.busno%TYPE;
flag number:=-1; --标志 检查sysdate是否在指定车次首末车时间之间
finded number:=0; --标志 判断是否有最终结果。
begin
open c_station(p_station1,p_station2);
fetch c_station into v_bus;
if c_station%notfound then
dbms_output.put_line('没有车可以到达');
else
--有车可以到达a--b,检查sysdate是否在指定车次首末车时间之间
flag:=in_shou_mo(v_bus);
if flag=1 then
--sysdate是在指定车次首末车时间之间
dbms_output.put_line(v_bus || '可以到达');
finded:=1; --设定找到标志为1
end if;
loop
fetch c_station into v_bus;
exit when c_station%notfound;
flag :=in_shou_mo(v_bus); --检查sysdate是否在指定车次首末车时间之间
if flag=1 then
dbms_output.put_line(v_bus || '可以到达');
finded:=1; --设定找到标志为1
end if;
end loop;
if finded=0 then
--找到标志为0
dbms_output.put_line('现在没有车可以到达');
end if;
end if;
end;
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -