Oracle存储过程

1. 创建存储过程语法

create or replace procedure 存储过程名
is
begin
  ----------------------------
end;
  • 注:

    在存储过程( PROCEDURE )和函数( FUNCTION )中 ASIS没有区别;

    在视图( VIEW )中只能用 AS 不能用 IS

    在游标( CURSOR )中只能用 IS 不能用 AS

2. 输出案例

create or replace procedure myDemo01 is
begin
  dbms_output.put_line('hello word, my name is stored procedure');
end myDemo01;

is:关键字。

begin:关键字。

dbms_output.put_line(‘hello word, my name is stored procedure’); 输出内容。

end:关键字

  • PL/SQL 新建 myDemo01 存储过程

alt

alt

  • 编写程序会亮起黄灯

alt

  • F8 编译存储过程,编译成功即可调用存储过程

alt

3. 调用存储过程

3.1 声明declare关键字

declare
begin
  myDemo01;
end;
  • 在sql页面执行

alt

3.2 不声明declare关键字

begin
  myDemo01; --在此处也可使用myDemo01();完成存储过程的调用
end;

3.3 call

--call 存储过程名可完成调用,注意括号不能少
call myDemo01();

4. 带有参数的存储过程

create or replace procedure myDemo02(name in varchar,age in int) is
begin
  dbms_output.put_line('name=' || name || ', age=' || age);
end myDemo02;
  • 新建 myDemo02 存储过程

alt

  • 编写内容 -> 编译

alt

  • 执行结果

alt

5. in,out参数问题

CREATE OR REPLACE PROCEDURE "myDemo03" (name  OUT VARCHAR2, age  IN INT)
AS
BEGIN
	-- routine body goes here, e.g.
	-- DBMS_OUTPUT.PUT_LINE('Navicat for Oracle');
	dbms_output.put_line('age=' || age);
  select '张三' into name from dual;
END;



declare
   name varchar2(32);
   age int;
begin
   "myDemo03"(name=>name,age=>25);
   dbms_output.put_line('name=' || name);
end;

注:in代表输入,out用于输出,参数默认类型是in类型。

  • Navicat 新建 myDemo04 存储过程

alt

  • 填写存储过程名字

alt

  • 添加输入、输出参数

alt

  • 编写 -> 保存 -> 运行

alt

  • 点击运行输入参数,运行结果

alt

alt

  • sql页面调用结果

alt

注: 因为存储过程在新建的时候名称用双引号标注,所以新建的存储过程名称为小写,在调用的时候,也要用双引号标注,调用小写的存储过程;

如果新建时名称没有用双引号标注,新建的存储过程名称则为大写,直接大写调用或者小写不标注调用就可以

alt

6. 异常写法

create or replace procedure myDemo04 is
age int;
begin
  age:=1/0;--除数为零会报错
  dbms_output.put_line(age);
  --异常
  exception when others then
  dbms_output.put_line('error');
end myDemo04;

call myDemo04();

  • 新建 myDemo04 存储过程

alt

  • 编写内容 -> 编译

alt

  • 运行结果

alt

7. 循环

7.1 while 循环

create or replace procedure myDemo5 is
n_count number := 0;
begin
  while n_count < 5 loop
    dbms_output.put_line(n_count);
    n_count := n_count + 1;
  end loop;
end myDemo5;
 

begin
  myDemo5;
end;

  • 新建 myDemo05 存储过程

alt

  • 编写内容 -> 编译

alt

  • 运行结果

alt

7.2 for 循环

create or replace procedure myDemo06 is
begin
  FOR AGENCY in (select * from T_AGENCY_SALESTATS) loop
    if (AGENCY.SALECOUNT > 20000) then
      dbms_output.put_line(AGENCY.AGENCYNO);
    end if;
  end loop;
end myDemo06;

CALL myDemo06();

  • 新建 myDemo06 存储过程

alt

  • 编写内容 -> 编译

alt

  • 运行结果

alt

alt

8 基本增删改查

create or replace procedure mydemo07(login in varchar2,pwd in varchar2,name in varchar2,userId in varchar2,
userState in varchar2,creatDate in varchar2,pwdState in varchar2) is
begin
  insert into SYS_USER VALUES(login,pwd,name,userId,userState,creatDate,pwdState);
  --UPDATE  SYS_USER t SET t.NAME='sunqi' WHERE t.LOGIN_NAME=login ;
  --DELETE  SYS_USER t WHERE t.LOGIN_NAME=login ;
  commit; --提交
end mydemo07;


begin
mydemo07('loginId','123456','张三','zhangsan001','1',TO_CHAR(SYSDATE,'yyyy-mm-dd HH24:MI:SS'),'1');
end;
  • 新建 myDemo07 存储过程

alt

  • 编写内容 -> 编译

alt

  • 运行结果

alt

alt

Oracle 文章被收录于专栏

Oracle

全部评论

相关推荐

点赞 收藏 评论
分享
牛客网
牛客企业服务