Oracle存储过程
1. 创建存储过程语法
create or replace procedure 存储过程名
is
begin
----------------------------
end;
-
注:
在存储过程(
PROCEDURE
)和函数(FUNCTION
)中AS
和IS
没有区别;在视图(
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
存储过程
- 编写程序会亮起黄灯
- 按
F8
编译存储过程,编译成功即可调用存储过程
3. 调用存储过程
3.1 声明declare关键字
declare
begin
myDemo01;
end;
- 在sql页面执行
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
存储过程
- 编写内容 -> 编译
- 执行结果
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
存储过程
- 填写存储过程名字
- 添加输入、输出参数
- 编写 -> 保存 -> 运行
- 点击运行输入参数,运行结果
- sql页面调用结果
注: 因为存储过程在新建的时候名称用双引号标注,所以新建的存储过程名称为小写,在调用的时候,也要用双引号标注,调用小写的存储过程;
如果新建时名称没有用双引号标注,新建的存储过程名称则为大写,直接大写调用或者小写不标注调用就可以
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
存储过程
- 编写内容 -> 编译
- 运行结果
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
存储过程
- 编写内容 -> 编译
- 运行结果
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
存储过程
- 编写内容 -> 编译
- 运行结果
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
存储过程
- 编写内容 -> 编译
- 运行结果
Oracle 文章被收录于专栏
Oracle