ORACLE(11g)----存储过程

参照博文:
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

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值