zoukankan      html  css  js  c++  java
  • 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 := '1' || 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';

     

     

     

     

  • 相关阅读:
    JavaScript继承
    UML建模概述
    UML建模—EA创建Use Case(用例图)
    UML建模—EA创建Class(类图)
    UML建模—EA的使用起步
    软件设计原则之 单一职责
    docker使用教程
    Fiddler工具使用介绍
    理解Python协程:从yield/send到yield from再到async/await
    如何简单地理解Python中的if __name__ == '__main__'
  • 原文地址:https://www.cnblogs.com/zhangzimuzjq/p/11885954.html
Copyright © 2011-2022 走看看