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块结构和组成元素(为山九仞,岂一日 ...
随机推荐
- 从FreeBSD里面看到的网络协议列表,感觉可以保存一下
# # Internet protocols # # $FreeBSD$ # from: @(#)protocols 5.1 (Berkeley) 4/17/89 # # See also http: ...
- 十、hibernate的延迟加载和抓取策略
延迟加载:控制sql语句发送时机 抓取策略:控制sql语句格式,子查询.连接查询.普通sql 延迟加载 延迟加载(lazy),也叫做懒加载:执行到该行代码时,不发送sql进行查询,只有在真正使用到这个 ...
- Java 编程技巧之数据结构
前言: 介绍几种常见的java数据结构及应用. 使用HashSet判断主键是否存在 HashSet 实现 Set 接口,由哈希表(实际上是 HashMap )实现,但不保证 set 的迭代顺序,并允 ...
- .net Core AJAX使用Header传递参数,以JsonResult返回信息
function postHeader() { $.ajax({ url : "/myTest/PostHeader?time="+ (new date()).getTime(), ...
- Linux查询Java进程以及杀掉其进程
今天公司VPN掉线后,访问项目出错502. 百度了说是nginx代理错误,但入职不久不知道咋搞... 于是乎就想重启一下Java应用. 1.找到Java应用的进程 jps 命令 和 ps - ...
- 【leetcode】907. Sum of Subarray Minimums
题目如下: 解题思路:我的想法对于数组中任意一个元素,找出其左右两边最近的小于自己的元素.例如[1,3,2,4,5,1],元素2左边比自己小的元素是1,那么大于自己的区间就是[3],右边的区间就是[4 ...
- openwrt 编译支持sqlite3
编译版本加载lib库 ------------------------------Libraries----------------------------------- Filesystem -- ...
- 部署core
https://www.cnblogs.com/jasonduan/p/9193702.html
- djangorestframework-jwt产生对方token
第一步是 通过jwt组件获得当前用户的token 第二步是 进行加密规则 需要用到base64模块进行加密 第三步 进行解密 按照规定的header payload signature 这种方式解密 ...
- Antd Vue 问题集合
1.table列宽问题 在滚动列时,如果要指定列宽,不要指定所有列宽,至少预留一列不执行列宽. 同时:scroll="{ x: width}", width的值要是所有列的宽度之和 ...