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块结构和组成元素(为山九仞,岂一日 ...
随机推荐
- MVC http://stackoverflow.com/tags/model-view-controller/info
About model-view-controller Model–View–Controller (MVC) is an architectural pattern used in software ...
- Angular的一些常用命令
Angular的一些常用命令 cmd中创建项目: ng new taskmgr -si --style=scss //先不安装依赖,si 为skip install material需要scss样式的 ...
- Centos 7 安装openjdk8
一.使用yum命令搜索支持jdk版本 yum search java|grep jdk 二.使用yum安装jdk8 yum install -y java--openjdk 三.检查是否成功 java ...
- tcpdump 与 抓包分析
在Windows下一般使用WireShark 抓包软件,tcpdump 是 Linux 系统的抓包软件.它可以抓取 TCP/IP 协议族的数据包,支持针对网络层.协议.主机.端口的过滤,并提供 and ...
- git 初始化提交项目
Git初始化本地已有项目,并推送到远端Git仓库操作1. 创建本地项目,在项目根目录执行git init命令git init 2. 在git服务器上创建一个仓库,这里使用GitHub创建一个仓库.例如 ...
- c++使用不定参数
定义不定参数,使用的宏有: va_start(ap, arg) 初始化一个va_list的变量ap va_arg(ap, type) 获取下一个type类型的参数 va_end(ap) 结束使用 ...
- C# ArrayList、HashSet、HashTable、List、Dictionary的区别
在C#中,数组由于是固定长度的,所以常常不能满足我们开发的需求. 由于这种限制不方便,所以出现了ArrayList. ArrayList.List<T> ArrayList是可变长数组,你 ...
- UNP学习第八章udp
一.基本UDP套接口编程 #include <sys/socket.h> ssize_t recvfrom(int sockfd, void *buff, size_t nbytes, i ...
- nginx启动报错: libpcre.so.1/libpcre.so.0: cannot open shared object file
1.用file /bin/ls查看当前系统是几位的 2.64位系统创建软连接:ln -s /usr/local/lib/libpcre.so.1 /lib64 3.32未系统创建软连接:ln -s / ...
- CDN(Content Delivery Network)内容分发网络
CDN的全称是Content Delivery Network,即内容分发网络.其基本思路是尽可能避开互联网上有可能影响数据传输速度和稳定性的瓶颈和环节,使内容传输的更快.更稳定.通过在网络各处放置节 ...