参照博文:
oracle存储过程教程,强烈建议学习这个
运行存储过程的时,使用navicat运行会报错,网上说这是navicat本身的bug,建议使用pl/sql来作为IDE,pl/sql的下载安装教程如下:
一、简单入门
-- 第一个存储过程
create or replace procedure myDemo01
as
begin
dbms_output.put_line('hello world,my name is stored procedure');
end;
--
-- 方式一:声明declare关键字
declare
begin
myDemo01;
end;
-- 方式二:call执行命令
call myDemo01();
-- 方式三:commond窗口执行命令
set serveroutput on
exec myDemo01
-- 第二个存储过程:变量声明,赋值
create or replace procedure myDemo02
as
name varchar(10);--声明变量,注意varchar需要指定长度
age int;
begin
name:='xiaoming';--变量赋值
age:=18;
dbms_output.put_line('name='||name||',age='||age);--通过||符号达到连接字符串的功能
end;
call myDemo02();
-- 第三个存储过程:带有参数的存储过程
create or replace procedure myDemo03(name in varchar,age in int)
as
begin
dbms_output.put_line('name='||name=',age='||age);
end;
begin
myDemo03('xiaoming',18);
end;
-- 第四个存储过程:实参形参问题
create or replace procedure myDemo04(name in varchar,age in int)
as
begin
dbms_output.put_line('name='||name||', age='||age);
end;
declare
name varchar(10);
age int;
begin
name:='xiaoming';
age:=18;
myDemo04(name=>name,age=>18);--此时不能myDemo04(name=>name,18),不能完成调用。
end;
-- 在调用存储过程时,=>前面的变量为存储过程的形参且必须于存储过程中定义的一致,而=>后的参数为实际参数
-- 第五个存储过程:in,out参数问题
create or replace procedure myDemo05(name out varchar,age in int)
as
begin
dbms_output.put_line('age='||age);
select 'xiaoming' into name from dual;
end;
declare
name varchar(10);
age int;
begin
myDemo05(name=>name,age=>10);
dbms_output.put_line('name='||name);
end;
-- 第六个存储过程:异常问题,执行结果见下图
create or replace procedure mydemo0006
as
age int;
begin
age:=10/0;
dbms_output.put_line(age);
exception when others then
dbms_output.put_line('error');
end;
begin
mydemo0006();
end;
二、两种循环+基本增删改查
-- 第七个存储过程:增删改查
-- 创建表STUDENTS
CREATE TABLE "JSRCXXG"."STUDENTS"
( "ID" NUMBER,
"USERNAME" VARCHAR2(255),
"USERPASS" VARCHAR2(255),
"USERAGE" VARCHAR2(255)
);
-- 插入几条数据
insert into JSRCXXG.STUDENTS( 1, 'a1', 'b1', 7);
insert into JSRCXXG.STUDENTS( 2, 'a2', 'b2', 3);
insert into JSRCXXG.STUDENTS( 10, 'a', 'b', 17);
CREATE OR REPLACE PROCEDURE mydemo07 ( ids IN int, username IN VARCHAR, userpass IN VARCHAR, userage IN int )
as
begin
insert into JSRCXXG.STUDENTS(ID,USERNAME,USERPASS,USERAGE) values(ids,username,userpass,userage);--增
-- delete from students where id=ids;--删
-- update students set userage=100 where id=ids;--改
commit;
end;
BEGIN
mydemo07 ( 2, 'a2', 'b2', 3 );
END;
---------------------------
create or replace procedure mydemo08(ids in int, age out int)
as
begin
select USERAGE into age from JSRCXXG.STUDENTS where ID=10;
commit;
end;
declare
ids int;
age int;
begin
ids:=10;
myDemo08(ids=>ids,age=>age);
dbms_output.put_line('age='||age);
end;
-- for循环
create or replace procedure mydemo09
as
begin
for stu in (select * from JSRCXXG.STUDENTS) loop
if (stu.USERAGE<5) then
dbms_output.put_line(stu.ID);
end if;
end loop;
commit;
end;
begin
mydemo09();
end;
-- while循环
create or replace procedure test_while_loop as
n_count number := 0;
begin
while n_count < 10 loop
dbms_output.put_line(n_count);
n_count := n_count + 1;
end loop;
end;
begin
test_while_loop();
end;
三、练习题
题1:
场景:
有表student(s_no,s_name,s_age,s_grade),其中s_no是学号,也是主键,是从1
四、注意点
oracle存储过程中is和as区别:
-
在Oracle的存储过程和函数中,其实IS和AS是同义词,没有什么区别。
-
但是在创建视图(VIEW)时,只能使用AS而不能使用IS。
-
在声明游标(CURSOR)时,只能使用IS而不能使用AS。
参考博文:https://blog.csdn.net/weixin_41968788/article/details/83659164#1.BUIK%20COLLECT
参考博文:https://www.cnblogs.com/dc-earl/articles/9265144.html