Oracle 存储过程语法

article/2025/9/16 23:51:41

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://chatgpt.dhexx.cn/article/9FIahsMZ.shtml

相关文章

mysql存储过程基本语法

本文来说下mysql存储过程基本语法 文章目录 基本语法使用实例变量的使用变量定义declare语句变量赋值用户变量 存储过程的参数in 输入参数out 输出参数inout输入输出参数 本文小结 基本语法 存储过程就是具有名字的一段代码&#xff0c;用来完成一个特定的功能。创建的存储过程…

Oracle存储过程基本语法

后来者居上&#xff0c;不是easy的事情 尤其技术类work&#xff0c;更加如此。都是have one 投入的过程的。尤其开发&#xff0c;还是属于技术壁垒挺高的行业。 创建基本的存储过程 1 CREATE OR REPLACE PROCEDURE MyProName IS 2 BEGIN 3 NULL; 4 END; 行1:CREATE OR REPL…

存储过程常见语法

存储过程常见语法 一、存储过程的概念: 1、存储过程Procedure是一组为了完成特定功能的SQL语句集合&#xff0c;经编译后存储在数据库中&#xff0c;用户通过指定存储过程的名称并给出参数来执行 2、存储过程中可以包含逻辑控制语句和数据操纵语句&#xff0c;它可以接受参数…

存储过程的语法讲解

在上一篇文章&#xff1a;别再说不知道什么是存储过程和存储函数了 中简单的介绍了存储过程和存储函数以及其使用。其实存储过程是可以进行编程的&#xff0c;所以可以和其他的编程语言一样使用变量、表达式以及控制结构进行编程&#xff0c;从而实现一些复杂和有用的功能。这篇…

子网掩码的作用

IP地址由网络和主机两部分标识组成 IP地址由“网络标识&#xff08;网络地址&#xff09;”和“主机标识&#xff08;主机地址&#xff09;”两部分组成。在局域网内相互间通信的网络必须具有相同网络地址&#xff0c;也叫相同的网段&#xff0c;在同一个网段内每个设备的主机…

子网掩码使用详解

一、子网掩码 IP地址是以网络号和主机号来标示网络上的主机的&#xff0c;我们把网络号相同的主机称之为本地网络&#xff0c;网络号不相同的主机称之为远程网络主机&#xff0c;本地网络中的主机可以直接相互通信&#xff1b;远程网络中的主机要相互通信必须通过本地网关&…

什么是子网掩码 子网掩码的作用是什么?

什么是子网掩码 子网掩码的作用是什么&#xff1f; 网络工作人员经常需要与ip和子网掩码等打交道&#xff0c;相信绝大数的朋友都知道IP的意思&#xff0c;但是还不理解子网掩码的意思&#xff0c;下面装机之家小编来为大家介绍下关于子网掩码的相关知识&#xff0c;希望能够对…

ip、子网掩码、网关、默认网关

这里写目录标题 ip网络地址主机地址 子网子网掩码子网掩码的表示方法为什么要使用子网掩码&#xff1f;子网掩码的分类 网关默认网关 ip ip地址 网络地址 主机地址&#xff08;又称&#xff1a;网络号和主机号&#xff09;&#xff0c;我们把网络号相同的主机称之为本地网络…

子网划分和子网掩码

目录 前言 1、IP地址 1.1 IP地址的内容 1.2 IP地址的分类 2、子网掩码的作用 2.1 主机间的通信 2.2 子网掩码 3.子网划分 3.1 子网划分的原因 3.2 子网划分的原理 3.3 IP地址汇总 总结 前言 知道IP地址的分类和基本使用&#xff0c;如果公司拥有300台计算机&#xf…

子网掩码详解

IP地址 IP地址被用来给Internet上的电脑一个编号。大家日常见到的情况是每台联网的PC上都需要有IP地址&#xff0c;才能正常通信。我们可以把“个人电脑”比作“一台电话”&#xff0c;那么“IP地址”就相当于“电话号码”&#xff0c;而Internet中的路由器&#xff0c;就相当于…

子网掩码的两种计算方式

&#xff08;尊重劳动成果&#xff0c;转载请注明出处&#xff1a;http://blog.csdn.net/qq_25827845/article/details/70946041冷血之心的博客&#xff09; 关注微信公众号&#xff08;文强的技术小屋&#xff09;&#xff0c;学习更多技术知识&#xff0c;一起遨游知识海洋~ …

子网掩码的划分和计算详解

一、子网掩码的计算 TCP/IP网间网技术产生于大型主流机环境中&#xff0c;它能发展到今天的规模是当初的设计者们始料未及的。网间网规模的迅速扩展对IP地址模式的威胁并不是它不能保证主机地址的唯一性&#xff0c;而是会带来两方面的负担&#xff1a;第一&#xff0c;巨大的…

一文带你了解什么是子网掩码

什么是子网掩码 子网掩码代表了“网络号子网号”与主机号之间的分割方案。 很晦涩&#xff1f; 说子网掩码&#xff0c;我们还得先说说IP地址。 什么是IP地址 因特网上的每台主机或路由器端口都必须有一个唯一的IP地址。因为IP地址&#xff0c;在网络上我们才能互相识别&a…

制作QQ登录界面(UI版)

工具&#xff1a;Android Studio activity_main.xml <?xml version"1.0" encoding"utf-8"?> <androidx.constraintlayout.widget.ConstraintLayout xmlns:android"http://schemas.android.com/apk/res/android"xmlns:app"http:…

html登录界面

今天是2019年11月14日我第一次注册博客&#xff0c;我把我做的一个登陆界面分享给大家看希望各位大佬指教。 首先是html文件。 1.登录界面html 登录界面 用户名: 密 码: 注册 2.注册界面html。 注册界面 用户名: 输入密码: 确认密码: 立刻注册返回登录 **3.效果图**! 欢迎…

Android仿QQ微信开场导航以及登陆界面

相信大家对于微信等社交应用的UI界面已经都很熟悉了&#xff0c;该UI最值得借鉴的莫过于第一次使用的时候一些列产品介绍的图片&#xff0c;可以左右滑动浏览&#xff0c;最后进入应用&#xff0c;这一效果适用于多种项目中&#xff0c;相信今后开发应用一定会用得到。网路上也…

[练习]QQ登陆界面-测试用例的编写

&#xff08;Test Case&#xff09;是为了实施测试而向被测试系统提供的一组集合&#xff0c; 包括&#xff1a;测试环境、操作步骤、测试数据、预期结果等要素。 一条测试用例最终只有一个结果。 一个功能点至少有一个测试用例。 测试用例数/功能点数 测试的覆盖率&#xf…

web之qq邮箱登录界面

我们可以用css来做这个登录的表格 具体的完整代码实现如下&#xff1a; <!DOCTYPE html> <html> <meta charset"utf-8"> <title>登录qq邮箱</title> <style type"text/css">* {padding: 0;margin: 0;}.content {wid…

转载:QQ登录界面

//:登陆界面代码&#xff1a; package Myjava_QQ; import java.awt.*; import javax.swing.*; import Myjava_QQ.truess; import java.awt.event.*; import java.applet.*; import java.io.BufferedReader; import java.io.FileNotFoundException; import java.io.FileReader; …

模拟QQ登录页面

设计布局 代码体现 <html><head><title>模拟QQ登陆页面.html</title><meta http-equiv"content-type" content"text/html; charsetUTF-8"><style type"text/css">/*上大边框区域*/#main1{/*边框宽度*/wi…