ORACLE PL、SQL编程
PL(Procedural Language)过程化的编程语言,是在SQL的基础上增加的部分,如:变量的使用、流程控制等,
重点学习Oracle和MySQL创建存储过程及流程控制的异同。
一、存储过程的创建、调用:
语法:
CREATE OR REPLACE PROCEDURE <存储过程名> [(参数名称 参数的传递方向 数据类型)]
{AS|IS}
BEGIN
DECLARE <变量名> 数据类型 := 初始值;
变量名 := 值;
BEGIN
--存储过程体。
END;
END;
说明:
1、若没有参数就不能加小括号,MySQL都需要加
2、参数的传递方向放再第二个位置,MySQL放在第一个位置。
3、存储过程定义部分结束后添加AS或IS,MySQL不需要。
4、当使用DECLARE定义完变量后需要再添加BEGIN END 包裹存储过程体的内容
5、调用存储过程使用“EXECUTE 存储过程名称();”或者将存储过程包裹在BEGIN END之间执行。 -- 实现加法运算的存储过程
CREATE OR REPLACE PROCEDURE proc_add(num1 NUMBER,num2 NUMBER)
AS
BEGIN
DECLARE
resault1 NUMBER(10,2) := 0;
BEGIN
resault1 := num1 + num2;
dbms_output.put_line('结果为:' || resault1);
END;
END; -- 若使用了dbms_output.put_line()输出,需要先打开显示开关才能查看结果
SET SERVEROUTPUT ON;
-- 调用
EXECUTE proc_add(10.5,20);
/*或者下面的方式*/
BEGIN
proc_add(10.5,20);
END;
2. 流程控制之IF语句:
IF <条件表达式1> THEN
#语句块1
[ELSIF <条件表达式2>THEN
#语句块2
END IF;
。。。。。。。]
END IF;
案例:
-- 案例描述:用户输入“课程编号”,查询对应编号的课程名称
CREATE OR REPLACE PROCEDURE proc_selectsubjec(id NUMBER)
AS
BEGIN
DECLARE
subjectName VARCHAR2(20);
BEGIN
IF id = 1 THEN
SELECT subject_name INTO subjectName FROM tb_subject WHERE subject_id = 1;
dbms_output.put_line('结果为:' || subjectName);
ELSIF id = 2 THEN
SELECT subject_name INTO subjectName FROM tb_subject WHERE subject_id = 2;
dbms_output.put_line('结果为:' || subjectName);
ELSIF id = 3 THEN
SELECT subject_name INTO subjectName FROM tb_subject WHERE subject_id = 3;
dbms_output.put_line('结果为:' || subjectName);
ELSE
dbms_output.put_line( '您的输入有误!');
END IF;
END;
END; -- 调用
EXECUTE proc_selectsubjec(3);
3. 流程控制之CASE语句:
CASE <常量>
WHEN 值1 THEN
#语句块1
WHEN 值2 THEN
#语句块3
[ELSE #语句块N]
END CASE; -- 输入编号,查看课程名称
CREATE OR REPLACE PROCEDURE proc_selectsubjec_case(id NUMBER)
AS
BEGIN
DECLARE
subjectName VARCHAR2(20);
BEGIN
CASE(id)
WHEN 1 THEN
SELECT subject_name INTO subjectName FROM tb_subject WHERE subject_id = 1;
dbms_output.put_line('结果为:' || subjectName);
WHEN 2 THEN
SELECT subject_name INTO subjectName FROM tb_subject WHERE subject_id = 2;
dbms_output.put_line('结果为:' || subjectName);
WHEN 3 THEN
SELECT subject_name INTO subjectName FROM tb_subject WHERE subject_id = 3;
dbms_output.put_line('结果为:' || subjectName);
ELSE
dbms_output.put_line( '您的输入有误!');
END CASE;
END;
END; -- 调用
EXECUTE proc_selectsubjec(3);
4. 流程控制之LOOP语句结合IF语句:
语法:
LOOP
IF<条件表达式1> THEN
EXIT;
END IF;
编写循环体中的代码块,需要手动更新条件。
END LOOP
举例:
-- 循环输出指定次数的提示信息。
CREATE OR REPLACE PROCEDURE proc_loopif(maxNums IN NUMBER)
AS
BEGIN
DECLARE
nums NUMBER(20) := 1;
BEGIN
LOOP
IF nums > maxNums THEN
EXIT;
END IF;
dbms_output.put_line( '第'||nums||'次输出');
nums := nums + 1;
END LOOP;
END;
END; -- 调用
EXECUTE proc_loopif(10);
5. 流程控制之LOOP语句结合WHEN语句:
语法:
LOOP
EXIT WHEN <条件表达式>;
编写循环体中的代码块,需要手动更新条件。
END LOOP;
举例:
-- 循环输出指定次数的提示信息。
CREATE OR REPLACE PROCEDURE proc_loopwhen(maxNums IN NUMBER)
AS
BEGIN
DECLARE
nums NUMBER(20) := 1;
BEGIN
LOOP
EXIT WHEN nums> maxNums;
dbms_output.put_line( '第'||nums||'次输出');
nums := nums + 1;
END LOOP;
END;
END; -- 调用
EXECUTE proc_loopwhen(10);
6. 流程控制之LOOP语句结合WHILE语句:
语法:
WHILE <条件表达式>
LOOP
编写循环体中的代码块,需要手动更新条件。
END LOOP;
举例:
-- 循环输出指定次数的提示信息。
CREATE OR REPLACE PROCEDURE proc_loopwhile(maxNums IN NUMBER)
AS
BEGIN
DECLARE
nums NUMBER(20) := 1;
BEGIN
WHILE nums <= maxNums
LOOP
dbms_output.put_line( '第'||nums||'次输出');
nums := nums + 1;
END LOOP;
END;
END; -- 调用
EXECUTE proc_loopwhile(10);
7. 流程控制之LOOP语句结合FOR语句:
/*
语法:
FOR 循环变量 IN 循环起始值..循环的终止值
LOOP
编写循环体中的代码块,需要手动更新条件。
END LOOP;
*/
-- 循环输出指定次数的提示信息。
CREATE OR REPLACE PROCEDURE proc_loopfor(maxNums IN NUMBER)
AS
BEGIN
FOR nums IN 1..maxNums
LOOP
dbms_output.put_line( '第'||nums||'次输出');
END LOOP;
END; -- 调用
EXECUTE proc_loopfor(10);
二、 批量插入记录:字段值采用随机生成
以tb_student为例,完成批量插入记录
CREATE OR REPLACE PROCEDURE proc_batchinsertstudent(recordNums IN NUMBER)
AS
BEGIN
DECLARE
nos NUMBER(10) := 11;
mobile CHAR(11);
BEGIN
FOR nums IN 1..recordNums
LOOP
mobile := '' || substr(dbms_random.value(),3,10);
INSERT INTO TB_STUDENT VALUES(
's' || nos, /*STUDENT_NO*/
dbms_random.string('A',6), /*LOGIN_PWD*/
sys_guid(), /*STUDENT_NAME*/
substr('男女',CEIL(dbms_random.value(0,2)),1), /*SEX*/
CEIL(dbms_random.value(0,5)), /*GRADE_ID*/
mobile , /*PHONE*/
substr('批量插入记录字段值这里面的值采用随机截取',CEIL(dbms_random.value(1,84)),ROUND(dbms_random.value(5,10))), /*ADDRESS*/
to_date(to_char(to_date('1990-01-01','yyyy-mm-dd'),'J') + TRUNC(dbms_random.value(0,366)),'J'), /*日期*/
mobile || '@qq.com' /*电子邮箱*/
);
nos := nos + 1;
END LOOP;
END;
END; -- 调用
EXECUTE proc_batchinsertstudent(1000); select * from tb_student ORDER BY STUDENT_NO; DELETE FROM tb_student where STUDENT_NO > 's10';
ORACLE PL、SQL编程的更多相关文章
- ORACLE PL/SQL编程详解
ORACLE PL/SQL编程详解 编程详解 SQL语言只是访问.操作数据库的语言,并不是一种具有流程控制的程序设计语言,而只有程序设计语言才能用于应用软件的开发.PL /SQL是一种高级数据库程序设 ...
- [强烈推荐]ORACLE PL/SQL编程详解之七:程序包的创建与应用(聪明在于学习,天才在于积累!)
原文:[强烈推荐]ORACLE PL/SQL编程详解之七:程序包的创建与应用(聪明在于学习,天才在于积累!) [强烈推荐]ORACLE PL/SQL编程详解之七: 程序包的创建与应用(聪明在于学习,天 ...
- ORACLE PL/SQL编程之八:把触发器说透
原文:ORACLE PL/SQL编程之八:把触发器说透 ORACLE PL/SQL编程之八: 把触发器说透 大家一定要评论呀,感谢!光发表就花了我将近一个下午. 本篇主要内容如下: 8.1 触发器类型 ...
- [推荐]ORACLE PL/SQL编程之五:异常错误处理(知已知彼、百战不殆)
原文:[推荐]ORACLE PL/SQL编程之五:异常错误处理(知已知彼.百战不殆) [推荐]ORACLE PL/SQL编程之五: 异常错误处理(知已知彼.百战不殆) 继上三篇:ORACLE PL/S ...
- ORACLE PL/SQL编程之六:把过程与函数说透(穷追猛打,把根儿都拔起!)
原文:ORACLE PL/SQL编程之六:把过程与函数说透(穷追猛打,把根儿都拔起!) ORACLE PL/SQL编程之六: 把过程与函数说透(穷追猛打,把根儿都拔起!) 继上篇:ORACLE P ...
- [推荐]ORACLE PL/SQL编程详解之三:PL/SQL流程控制语句(不给规则,不成方圆)
原文:[推荐]ORACLE PL/SQL编程详解之三:PL/SQL流程控制语句(不给规则,不成方圆) [推荐]ORACLE PL/SQL编程详解之三: PL/SQL流程控制语句(不给规则,不成方圆) ...
- [推荐]ORACLE PL/SQL编程之四:把游标说透(不怕做不到,只怕想不到)
原文:[推荐]ORACLE PL/SQL编程之四:把游标说透(不怕做不到,只怕想不到) [推荐]ORACLE PL/SQL编程之四: 把游标说透(不怕做不到,只怕想不到) 继上两篇:ORACLE PL ...
- 【强烈强烈推荐】《ORACLE PL/SQL编程详解》全原创(共八篇)--系列文章导航
原文:[强烈强烈推荐]<ORACLE PL/SQL编程详解>全原创(共八篇)--系列文章导航 <ORACLE PL/SQL编程详解> 系列文章目录导航 ——通过知识共享树立个人 ...
- [推荐]ORACLE PL/SQL编程详解之一:PL/SQL 程序设计简介(千里之行,始于足下)
原文:[推荐]ORACLE PL/SQL编程详解之一:PL/SQL 程序设计简介(千里之行,始于足下) [推荐]ORACLE PL/SQL编程详解之一: PL/SQL 程序设计简介(千里之行,始于足下 ...
- [顶]ORACLE PL/SQL编程详解之二:PL/SQL块结构和组成元素(为山九仞,岂一日之功)
原文:[顶]ORACLE PL/SQL编程详解之二:PL/SQL块结构和组成元素(为山九仞,岂一日之功) [顶]ORACLE PL/SQL编程详解之二: PL/SQL块结构和组成元素(为山九仞,岂一日 ...
随机推荐
- 使用VS 2019发布.net core程序并部署到IIS的最新教程
不管你是使用.net core开发的是web api还是网站类的程序,如果你是部署到IIS,那么下面的内容都适合于你,不会将.net core程序部署到IIS的朋友,可以看看这篇手把手教你部署.net ...
- c# 使用网站的身份验证及 Cookie 的获取与使用
C# 的 Http 访问可以使用 .net 自带的 HttpWebRequest, WebClient, HttpClient 类.也可以使用开源库 RestSharp . RestSharp 的优 ...
- ubuntu16.04安装jdk1.8(java1.8)
使用ppa方式安装 1.添加ppa $sudo add-apt-repository ppa:webupd8team/java $sudo apt-get update 2.安装oracle-java ...
- 第十二章 存储之 Secret
1.Secret 存在意义 Secret 解决了密码.token.密钥等敏感数据的配置问题,而不需要把这些敏感数据暴露到镜像或者 Pod Spec中.Secret 可以以 Volume 或者环境变量的 ...
- common-dbcp2数据库连接池参数说明(转)
转自:http://bsr1983.iteye.com/blog/2092467 由于commons-dbcp所用的连接池出现版本升级,因此commons-dbcp2中的数据库池连接配置也发生了变化, ...
- ubuntu 搜狗输入法内存占用太多,卡顿不够处理办法
1. 输入 free -m 查看是否内存不够导致卡顿 2. 输入 gnome-system-monitor 打开ubuntu 任务管理器 找到搜狗输入法结束进程 3. 完美解决
- Oracle查询用户所有表
https://blog.csdn.net/wssiqi/article/details/44617197 Oracle查询用户所有表 下面为您介绍的语句用于实现Oracle查询用户所有表,如果您 ...
- Es学习第六课, ES基本搜索_search
前面几课ES的基本概念.安装和分词都讲过了,下面我们就来实战一下ES的核心功能-搜索,这节课我们主要讲的是基本搜索 _search(注意:ES的关键字都要加前缀_,所以我们在定义索引.类型名称时不要带 ...
- 4K超清,2500万人在线,猫晚直播技术全解读
摘要: 作为双11的必备节目,今年的猫晚通过优酷.浙江卫视.东方卫视进行了全程网络直播和电视直播,吸引了超过全球超过2.4亿人收看.猫晚期间,优酷基于阿里云最新的广播级高可靠直播方案,为近2500万的 ...
- ajaxfileupload异步上传
=====================upload.html======================= <!DOCTYPE html PUBLIC "-//W3C//DTD X ...