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编程的更多相关文章

  1. ORACLE PL/SQL编程详解

    ORACLE PL/SQL编程详解 编程详解 SQL语言只是访问.操作数据库的语言,并不是一种具有流程控制的程序设计语言,而只有程序设计语言才能用于应用软件的开发.PL /SQL是一种高级数据库程序设 ...

  2. [强烈推荐]ORACLE PL/SQL编程详解之七:程序包的创建与应用(聪明在于学习,天才在于积累!)

    原文:[强烈推荐]ORACLE PL/SQL编程详解之七:程序包的创建与应用(聪明在于学习,天才在于积累!) [强烈推荐]ORACLE PL/SQL编程详解之七: 程序包的创建与应用(聪明在于学习,天 ...

  3. ORACLE PL/SQL编程之八:把触发器说透

    原文:ORACLE PL/SQL编程之八:把触发器说透 ORACLE PL/SQL编程之八: 把触发器说透 大家一定要评论呀,感谢!光发表就花了我将近一个下午. 本篇主要内容如下: 8.1 触发器类型 ...

  4. [推荐]ORACLE PL/SQL编程之五:异常错误处理(知已知彼、百战不殆)

    原文:[推荐]ORACLE PL/SQL编程之五:异常错误处理(知已知彼.百战不殆) [推荐]ORACLE PL/SQL编程之五: 异常错误处理(知已知彼.百战不殆) 继上三篇:ORACLE PL/S ...

  5. ORACLE PL/SQL编程之六:把过程与函数说透(穷追猛打,把根儿都拔起!)

    原文:ORACLE PL/SQL编程之六:把过程与函数说透(穷追猛打,把根儿都拔起!) ORACLE PL/SQL编程之六: 把过程与函数说透(穷追猛打,把根儿都拔起!)   继上篇:ORACLE P ...

  6. [推荐]ORACLE PL/SQL编程详解之三:PL/SQL流程控制语句(不给规则,不成方圆)

    原文:[推荐]ORACLE PL/SQL编程详解之三:PL/SQL流程控制语句(不给规则,不成方圆) [推荐]ORACLE PL/SQL编程详解之三: PL/SQL流程控制语句(不给规则,不成方圆) ...

  7. [推荐]ORACLE PL/SQL编程之四:把游标说透(不怕做不到,只怕想不到)

    原文:[推荐]ORACLE PL/SQL编程之四:把游标说透(不怕做不到,只怕想不到) [推荐]ORACLE PL/SQL编程之四: 把游标说透(不怕做不到,只怕想不到) 继上两篇:ORACLE PL ...

  8. 【强烈强烈推荐】《ORACLE PL/SQL编程详解》全原创(共八篇)--系列文章导航

    原文:[强烈强烈推荐]<ORACLE PL/SQL编程详解>全原创(共八篇)--系列文章导航 <ORACLE PL/SQL编程详解> 系列文章目录导航 ——通过知识共享树立个人 ...

  9. [推荐]ORACLE PL/SQL编程详解之一:PL/SQL 程序设计简介(千里之行,始于足下)

    原文:[推荐]ORACLE PL/SQL编程详解之一:PL/SQL 程序设计简介(千里之行,始于足下) [推荐]ORACLE PL/SQL编程详解之一: PL/SQL 程序设计简介(千里之行,始于足下 ...

  10. [顶]ORACLE PL/SQL编程详解之二:PL/SQL块结构和组成元素(为山九仞,岂一日之功)

    原文:[顶]ORACLE PL/SQL编程详解之二:PL/SQL块结构和组成元素(为山九仞,岂一日之功) [顶]ORACLE PL/SQL编程详解之二: PL/SQL块结构和组成元素(为山九仞,岂一日 ...

随机推荐

  1. 简易的富文本编辑器WangEditor

    网址http://www.wangeditor.com/ var E = window.wangEditor; var editor = new E('#editor') // 或者 var edit ...

  2. Linux帮助用法

    内部命令: help COMMAND 或 man bash 外部命令: (1) COMMAND --helpCOMMAND -h(2) 使用手册(manual)man COMMAND(3) 信息页in ...

  3. mysql-alter语句常用操作

    删除列 alter table table-name drop col-name 增加列(多列) alter table table-name add col-name col-type commen ...

  4. Bootstrap 小功能

    <div class="container"> <div class="navbar-header"> <button type= ...

  5. vue img标签用法

    :符号是v-bind的缩写 服务器图片路径和请求本地路径 <img class="v-step-0" id="avatar" :src="myP ...

  6. Python和 pytest的异常处理

    Python中有自带的异常处理 try: except: pytest中 1.可以用try except来处理,来保证出错后,把后面的语句执行完成: 2.当有多条用例需要跑完时,不需要考虑其中一条用例 ...

  7. excel acm 高校排名(hdoj)

    其实写一个程序是最方便的... 不用每次进行很多次操作. 当然,能获得后台的数据更好…… e.g. 链接: https://pan.baidu.com/s/1a7s85oaKGam1-0mJ2v39u ...

  8. MySQL-事件总结

    是什么?事件是一组SQL集合,简单说就是mysql中的定时器,时间到了就执行. 一:查询事件变量,如果查询不到变量,说明数据库版本过低,不支持事件. SHOW VARIABLES LIKE 'even ...

  9. C#语言是专门为.NET提供的开发语言(visual studio 2008序列号)

    .net是微软的一个平台在这个平台上的语言有C#.C++.VB等,其中C#是专门为.NET平台开发的语言,语法简洁美观.建议安装visual studio 2008,你可以去微软官方下载90天试用版, ...

  10. 【JS】js引擎执行过程

    概述 js引擎执行过程主要分为三个阶段,分别是语法分析,预编译和执行阶段,上篇文章我们介绍了语法分析和预编译阶段,那么我们先做个简单概括,如下: 语法分析: 分别对加载完成的代码块进行语法检验,语法正 ...