--判断语句
declare
v_count number;
begin
select count(1) into v_count from student;
if v_count>20 then
dbms_output.put_line('数据条数大于20条,为:'|| V_count ||'条');
elsif v_count>=10 then
dbms_output.put_line('数据条数在10~20之间,为:'|| v_count ||'条');
else
dbms_output.put_line('数据条数在10条以下,为:'|| v_count ||'条');
end if;
end;
--循环语句(当i>10退出循环)
declare
i number := 1;
begin
loop
exit when i>10;
dbms_output.put_line(i);
i := i + 1;
end loop;
end;
--游标属性
游标的属性 返回值类型 说明
%rowcount 整形 获得fetch语句返回的数据行数
%found 布尔型 最近的fetch语句返回,行数据则为真,否则为假
%notfound 布尔型 与%found属性返回值相反
%isopen 布尔型 游标已经打开时值为真,否则为假
其中%notfound是在游标中找不到元素的时候返回true,通常用来判断出循环
--创建游标,声明游标 -> 打开游标 -> 读取游标 -> 关闭游标
declare
--声明游标
cursor e_student(v_id student.sno%type) is select sno,sanme from student where sno = v_id;
--声明变量
v_name student.sanme%type;
v_sno student.sno%type;
begin
--打开游标
open e_student(1003);
--便利循环
loop
fetch e_student into v_sno,v_name;
--退出循环(%notfound行数据为空,返回ture退出循环)
exit when e_student%notfound;
dbms_output.put_line('姓名:' || v_name ||' - '|| '学号:' || v_sno);
end loop;
--关闭游标
close e_student;
end;
--存储过程(无参数)
create or replace procedure p_hello as
--声明变量
begin
dbms_output.put_line('hello world!');
end p_heelo;
--调用存储过程
begin
p_hello;
end;
--带参数的存储过程
create or replace procedure p_student(i_sno in student.sno%type) as
--声明变量
v_sno student.sno%type;
v_name student.sanme%type;
begin
--查询某个学生的姓名和学号
select sno,sanme into v_sno,v_name from student where sno=i_sno;
dbms_output.put_line('学号:'|| v_sno||'姓名:'||v_name);
end;
--调用存储过程
begin
p_student('1004');
end;
--存储过程(输入和输出)
create or replace procedure p_sutdent_int_put(i_id in student.sno%type,o_name out student.sanme%type) as
--变量声明
begin
select sanme into o_name from student where sno=i_id;
end;
--获取存储过程的输出数据并显示
declare
v_name student.sanme%type;
begin
p_sutdent_int_put('1005',v_name);
dbms_output.put_line(v_name);
end;
进阶
--冒泡排序(6758493021)
- length() 获取字符长度
- substr(变量,第几位,截取长度) 截取字符串
-
substr(string,start,length)
参数
必须
参数说明
string
必须
指定的要截取的字符串
start
必须
规定在字符串的何处开始:
正数 - 在字符串的指定位置开始
负数 - 在从字符串结尾的指定位置开始
0 - 在字符串中的第一个字符处开始
length
可选
指定要截取的字符串长度,缺省时返回字符表达式的值结束前的全部字符
-
例如:
select substr('abcdefg',3,4) from dual;--结果是cdef select substr('abcdefg',-3,4) from dual;--结果efg select substr('abcde',2),substr('abcde',-2),substr('abcde',2,3),substr('abcdewww',-7,3) from dual; --结果是bcde、de、bcd、bcd
-
- relpace(变量,要替换的字符,替换后字符) 替换字符
--for循环
for 变量 开始..结束 loop
end loop;
--if判断
if 表达式 then 执行代码
elsif 表达式 then 执行代码
elsif 表达式 then 执行代码
else 执行代码
end if;
冒泡排序 -- 程序(6758493021)升序排序、降序排序
declare
v_num varchar2(20):=6758493021;
v_leng number;
v_asc varchar2(20);
v_desc varchar2(20);
a number;
begin
v_leng:=length(v_num);
for i in 1..V_leng loop
a:=substr(v_num,1,1);
for j in 1..v_leng-i loop
if a > substr(v_num,j+1,1) then
a:=substr(v_num,j+1,1);
else
a:=a;
end if;
end loop;
dbms_output.put_line(a);
v_num:=replace(v_num,a,'');
v_asc:= v_asc||a;
v_desc:=a||v_desc;
end loop;
dbms_output.put_line('升序排序后数据:'|| v_asc);
dbms_output.put_line('降序排序后数据:'|| v_desc);
end;