Oracle 存储过程语法

news/2024/11/30 2:27:58/

Oracle 存储过程语法

1. 创建表(测试数据准备)

-- 创建用户表
create table TT_USER
(USERID   NUMBER(10),USERNAME VARCHAR2(255),PASSWORD VARCHAR2(255),SEX      VARCHAR2(1)
);INSERT INTO TT_USER VALUES (101, 'zhang', '111', '1');
INSERT INTO TT_USER VALUES (102, 'han', '222', '2');
INSERT INTO TT_USER VALUES (103, 'hui', '333', '2');
INSERT INTO TT_USER VALUES (104, 'fang', '444', '1');
INSERT INTO TT_USER VALUES (105, 'li', '555', '2');
INSERT INTO TT_USER VALUES (106, 'cheng', '666', '1');
INSERT INTO TT_USER VALUES (107, 'zhao', '777', '0');select * from TT_USER;-- 创建学生表
CREATE TABLE student(sids number(11) NOT NULL,sname varchar(10),score float,sex char(1),addr varchar(10));INSERT INTO student VALUES (101, 'zhang', 98, '2', '苏州');
INSERT INTO student VALUES (102, 'han', 69, '1', '西安');
INSERT INTO student VALUES (103, 'hui', 72, '1', '苏州');
INSERT INTO student VALUES (104, 'fang', 100, '2', '苏州');
INSERT INTO student VALUES (105, 'li', 88, '1', '北京');
INSERT INTO student VALUES (106, 'cheng', NULL, '1', '北京');
INSERT INTO student VALUES (107, 'zhao', NULL, '3', '北京');select * from student;-- 创建学生表1
CREATE TABLE student1(sids number(11) NOT NULL,sname varchar(10),score float,sex char(1),sage number(10),addr varchar(10));INSERT INTO student1 VALUES (101, 'zhang', 98, '2', 15, '苏州');
INSERT INTO student1 VALUES (102, 'han', 69, '1', 30, '西安');
INSERT INTO student1 VALUES (103, 'hui', 72, '1', 25, '苏州');
INSERT INTO student1 VALUES (104, 'fang', 100, '2', 35, '苏州');
INSERT INTO student1 VALUES (105, 'li', 88, '1', 45, '北京');
INSERT INTO student1 VALUES (106, 'cheng', NULL, '1', 12, '北京');
INSERT INTO student1 VALUES (107, 'zhao', NULL, '3', 23, '北京');
select * from student1;-- 创建用户表
CREATE TABLE user_info(user_id number(11) NOT NULL,user_name varchar(10),user_password varchar(20),date_time date,create_time timestamp,update_time timestamp);
-- drop table user_info;insert into USER_INFO (user_id,user_name,user_password,date_time,create_time,update_time) values(8,'李一','123456',to_date('2023-01-02','yyyy-mm-dd'),SYSTIMESTAMP,SYSTIMESTAMP);
insert into USER_INFO (user_id,user_name,user_password,date_time,create_time,update_time) values(2,'王五','123456',to_date('2015-12-20','yyyy-mm-dd'),SYSTIMESTAMP,SYSTIMESTAMP);
insert into USER_INFO (user_id,user_name,user_password,date_time,create_time,update_time) values(3,'田七','123456',to_date('2018-09-22','yyyy-mm-dd'),SYSTIMESTAMP,SYSTIMESTAMP);
insert into USER_INFO (user_id,user_name,user_password,date_time,create_time,update_time) values(4,'赵八','123456',to_date('2021-10-21','yyyy-mm-dd'),SYSTIMESTAMP,SYSTIMESTAMP);
insert into USER_INFO (user_id,user_name,user_password,date_time,create_time,update_time) values(5,'王二','123456',to_date('2020-05-20','yyyy-mm-dd'),SYSTIMESTAMP,SYSTIMESTAMP);
insert into USER_INFO (user_id,user_name,user_password,date_time,create_time,update_time) values(6,'李四','123456',to_date('2022-05-16','yyyy-mm-dd'),SYSTIMESTAMP,SYSTIMESTAMP);
insert into USER_INFO (user_id,user_name,user_password,date_time,create_time,update_time) values(7,'赵云','123456',to_date('2023-12-23','yyyy-mm-dd'),SYSTIMESTAMP,SYSTIMESTAMP);
insert into USER_INFO (user_id,user_name,user_password,date_time,create_time,update_time) values(8,'黄忠','123456',to_date('2017-12-28','yyyy-mm-dd'),SYSTIMESTAMP,SYSTIMESTAMP);select * from user_info;

2. 创建存储过程

2.1 MyDemo01 - 无参传递实例

-- 无参数传递,打印信息
create or replace procedure MyDemo01 is
begindbms_output.put_line('hello word, my name is stored procedure');
end;-- 调用存储过程操作(sql窗口)
call MyDemo01();
2.2 myDemo02 - 有参传递实例1

-- 有参数传递 输入参数 in
create or replace procedure myDemo02(name in varchar,age in int) is
begindbms_output.put_line('name='||name||', age='||age);
end MyDemo02;-- 调用存储过程操作
call MyDemo02('zhu',20);
2.3 myDemo03 - 有参传递实例2

-- 有参数传递 输出参数 out
create or replace procedure myDemo03(name out varchar,age in int) is
begindbms_output.put_line('age='||age);select 'zhu' into name from dual;
end;-- 调用存储过程操作
declarename varchar(10);age int;
beginmyDemo03(name=>name,age=>25);dbms_output.put_line('name='||name);
end;

myDemo03 输出结果:

在这里插入图片描述

注:in 表示输入参数;out 表示输出参数

2.4 myDemo04 - 异常处理存储过程

-- 异常处理 exception
create or replace procedure myDemo04
as
age int;
beginage:=1/0;dbms_output.put_line(age);--异常exception when others thendbms_output.put_line('error');
end;-- 调用存储过程操作
call myDemo04();
-- 程序分析:程序出现异常,将打印 error
2.5 myDemo05 - while 循环存储过程实例

-- while 循环
create or replace procedure myDemo05
asn_count number := 0;
beginwhile n_count < 5 loopdbms_output.put_line(n_count);n_count := n_count + 1;end loop;
end;-- 调用存储过程操作
call myDemo05();

输出结果:

​ 0
​ 1
​ 2
​ 3
​ 4

2.6 myDemo06 - for 循环存储过程实例
-- for 循环
create or replace procedure myDemo06
as
beginFOR USE in (select * from student1) loopif (USE.sids<108) thendbms_output.put_line(USE.sname);end if;end loop;
end;-- 调用存储过程操作
beginmyDemo06;
end;

输出结果:

​ aaa
​ 李太白
​ 战三
​ 张三
​ 李四
​ 王五
​ 赵六
​ 朱八

2.7 mydemo07 - 增删改查存储过程实例
-- 增删改
create or replace procedure mydemo07(sidss in int, sname in varchar,score in int, sex in char,sage in int,addr in varchar)
as
begin--insert into student1 VALUES(sids,sname,score,sex,sage,addr);UPDATE  student1 t SET t.sname='狗蛋' WHERE t.sids=sidss ;--DELETE  student1 t WHERE t.sids=sids ; commit; --提交
end MyDemo07;-- 调用存储过程操作
begin
mydemo07(101, '', 120, '1', 20, '');
end;
2.8 myDemo08 - if 语句
-- 根据用户id判断用户是否存在
create or replace procedure myDemo08(pid in number,ret out number)
as
flag number;
beginselect count(1) into flag from student1 where sids = pid;if flag = 1 thendbms_output.put_line(pid||'用户存在');ret:=1; -- 如果用户存在就把ret设为1elsedbms_output.put_line(pid||'用户不存在');ret:=0; -- 如果用户不存在就把ret设为0end if;
end;-- 测试 myDemo08 存储过程
declareinput number(11):=101;ret number; -- 声明一个变量ret,类型是number,用来存储过程的输出值
beginMyDemo08(input,ret); -- 获取到过程的输出值存储在ret中dbms_output.put_line('存储过程返回值:' ||ret);
end;

输出结果:

​ 101用户存在
​ 存储过程返回值:1

3. 存储过程常用语法实例

-- when
declare i int:= 0;
beginloopi:=i+1;dbms_output.put_line(i);EXIT WHEN i > 3;END LOOP;
end;
-- 输出结果:1234-- 使用Loop+游标的时候,取游标当中的值,必须重新赋值一遍,要不然会报错。
declarecursor user isselect * from user_info;user1 user_info%rowtype;
beginopen user;loopfetch user into user1;exit when user%notfound;dbms_output.put_line('用户名称:' || user1.USER_NAME);dbms_output.put_line('用户年龄:' || user1.user_id);end loop;close user; --关闭游标
end;
-- 输出结果:用户名称:李六用户年龄:1用户名称:李一用户年龄:8用户名称:王五用户年龄:2用户名称:田七用户年龄:3用户名称:赵八用户年龄:4用户名称:王二用户年龄:5用户名称:李四用户年龄:6用户名称:赵云用户年龄:7用户名称:黄忠用户年龄:8
-- WHILE语句:在执行之前,首先要判断条件表达式的值是否为true,true则执行循环体,否则退出WHILE循环,继续执行循环后面的代码。
declarei int := 0;
beginwhile i < 3 loopi := i + 1;dbms_output.put_line(i);end loop;
end;-- 实例测试
declarecursor user isselect * from user_info;user1 user_info%rowtype;
beginopen user;fetch user into user1;while(user%found)loopdbms_output.put_line('用户名称:' || user1.USER_NAME);fetch user into user1;end loop;
end;
-- 注意:%found %notfound 用法--FOR语句是一个可提前设置循环次数的循环控制语句,它有一个循环计数器,通常是一个整型变量,通过这个计数器来控制循环次数
for A IN (reverse) B...C LOOPD;END LOOP;--A: 表示一个变量,通常为证书类型,用来作为计数器,默认值是递增的,当循环当中使用reverse关键字时,就会循环递减。
--B: 计数器下线值,当计数器的值小于下限值的时候,终止循环。
--C: 计数器上线值,当计数器的值大于上限值的时候,终止循环。
--D: 循环体。declare i int := 0;
beginfor i IN reverse 1..5 LOOPdbms_output.put_line(i);END LOOP;
end;-- 配合游标实例测试
declarecursor user isselect * from user_info;
beginfor user1 in user loopdbms_output.put_line('用户名称:'|| user1.USER_NAME);dbms_output.put_line('用户ID:'|| user1.USER_ID);end loop;
end;

游标实例测试 - 输出结果:
在这里插入图片描述


http://www.ppmy.cn/news/71309.html

相关文章

webpack Plugin Loader

本文作者为 360 奇舞团前端开发工程师 webpack是Javascript工具链的关键部分。webpack是个用于现代JavaScript应用程序的静态模块打包工具。它不仅可以支持ESM和CommonJS模块化编程&#xff0c;而且还可以支持或扩展支持许多不同的静态资源&#xff0c;例如&#xff1a;Files,I…

第03讲:SpringCloudStream实现分布式事务

需求分析 本案例是通过一个发送短信验证码的功能来实验MQ发送消息时实现分布式事务&#xff0c;思路分析如下 消息生产者生产发送验证码的半消息 生产者执行本地事务&#xff08;将验证码保存到数据库&#xff09;&#xff0c;并记录事务的ID&#xff0c;如果整个过程不出现异…

深度学习在自然语言处理方面的应用

前言 自然语言处理是一种将自然语言转换为计算机可处理的形式的技术。深度学习是一种非常强大的机器学习技术&#xff0c;它在自然语言处理方面也有广泛的应用。本文将详细介绍深度学习在自然语言处理方面的应用。 自然语言处理的基本步骤 自然语言处理的基本步骤包括分词、词…

AUTOSAR NvM 同步机制

一、部分 NvM API 解释 &#xff08;1&#xff09;Std_ReturnType NvM_ReadBlock(NvM_BlockIdType BlockId,void* NvM_DstPtr) 把Nv Block中的数据copy到NvM_DstPtr指向的RAM中&#xff0c;NvM_DstPtr可以是临时RAM&#xff0c;也可以是永久RAM&#xff08;永久RAM即配置工具…

森海塞尔及诺音曼携重磅新品亮相2023广州国际专业灯光、音响展览会

森海塞尔及诺音曼携重磅新品亮相2023广州国际专业灯光、音响展览会 以卓越产品和创新技术引领专业音频行业发展 广州&#xff0c;2023年5月16日——森海塞尔和诺音曼将于2023年5月22日至25日&#xff0c;携重磅新品及全新音频技术亮相第21届广州国际专业灯光、音响展览会。森海…

「聊天机器人构建、智能文档问答」大模型应用开发实操课程来了

此刻&#xff0c;生成式 AI 正以惊人的势头改变着我们的世界&#xff0c;无论是在科技、商业还是日常生活中&#xff0c;新的浪潮席卷着全球各个行业和领域。 跟过去十几年中“有多少人工就有多少智能”的智障 AI 比起来&#xff0c;大模型如 OpenAI 的 GPT-4 、百度的文心一言…

Cesium源码分享--标绘

Cesium标绘插件 在线api文档说明 在线体验地址1&#xff08;三维框架内&#xff09; 在线体验地址2 更多案例地址 免费gis数据 ps&#xff1a;如果可以的话&#xff0c;希望大家能给我个star&#xff0c;好让我有更新下去的动力&#xff1b; 实现原理&#xff1a; 其中实…

Oracle 21c部署 in Docker

目录 # 热分配新硬盘 # 拉取镜像 # 启动数据库 访问Oracle数据库 本环境的用途为开发测试环境&#xff1b;所以&#xff0c;分配给Oracle的资源相对较低&#xff1b;如果在生产环境下&#xff0c;请提前规范分配的CPU、内存、IO、磁盘&#xff08;本地磁盘 or 网络存储、磁…