zoukankan      html  css  js  c++  java
  • PL/SQL基础1(笔记)

    --基本结构
    DECLARE
    --变量声明部分:在此声明PL/SQL用到的变量,类型,游标,以及局部的存储过程和函数
    BEGIN
    --执行部分:过程及SQL语句,即程序的主要部分
    EXCEPTION
    --执行异常部分:异常处理
    END;
    --PL/SQL基本规范:全部的保留字,roacle的内置函数,程序包以及用户自定义的数据类型都用大写
    --PL/SQL基本规范::每行只写一条语句,逗号后以及运算符的前后都应加空格
    --PL/SQL基本规范::要使用有意义的名称命名:
    --PL/SQL基本规范:使用"_"的连接方式,而不是使用大小写混合的方式
    --PL/SQL基本规范:变量前最好加上前缀,以表示方变量的数据类型,作用范围等
    --1.定义变量时,建议用v_作为前缀:v_ename
    --2.定义常量时,建议用c_作为前缀:c_rate
    --3.定义异常时,建议用e_作为前缀:e_error

    --根据用户输入的商品ID来查商品库存

    DECLARE
    V_ID NUMBER := &V_ID; --用户输入商品ID
    V_STOCKCOUNT NUMBER; ---库存量
    BEGIN
    SELECT STOCKCOUNT INTO V_STOCKCOUNT FROM ES_PRODUCT WHERE ID = V_ID;
    DBMS_OUTPUT.PUT_LINE('库存量:' || V_STOCKCOUNT);
    
    END;

    ------升级变量的类型和表中的字段类型相同 变量名 名表.字段名%TYPE 来声明

    DECLARE
    V_ID ES_PRODUCT.ID%TYPE := &ID; --用户输入商品编号
    V_NAME ES_PRODUCT.NAME%TYPE; --变量名称与商品表的名称字段类型相同
    V_PRICE ES_PRODUCT.PRICE%TYPE; --变量价格与商品表的价格字段类型相同
    V_SALEDATE ES_PRODUCT.SALEDATE%TYPE; --变量上架日期与商品表的上架日期字段类型相同
    V_STOCKCOUNT ES_PRODUCT.STOCKCOUNT%TYPE; --变量库存量与商品表的库存量字段类型相同
    BEGIN
    SELECT NAME, PRICE, SALEDATE, STOCKCOUNT
    INTO V_NAME, V_PRICE, V_SALEDATE, V_STOCKCOUNT
    FROM ES_PRODUCT
    WHERE ID = V_ID;
    DBMS_OUTPUT.PUT_LINE('商品名称 :' || V_NAME || ' 商品价格 :' || V_PRICe || ' 商品上架时间 :' ||
    V_SALEDATE || ' 商品库存 :' || V_STOCKCOUNT);
    
    END;

    --升级使用一个变量来代表一个表中的一行字段 变量名  表名%ROWTYPE

    --调用时使用 变量名.字段 来用 

    DECLARE
    v_es_pro es_product%ROWTYPE ; --声明一个变量,表示表中完整行字段变量
    v_id es_product.id%TYPE:=&ID; -----用户输入商品编号
    BEGIN
    SELECT NAME,price,saledate,stockcount INTO
    v_es_pro.name,v_es_pro.price,v_es_pro.saledate,v_es_pro.stockcount
    FROM es_product
    WHERE ID=v_id;
    DBMS_OUTPUT.PUT_LINE('商品名称 :' || v_es_pro.name || ' 商品价格 :' ||v_es_pro.price || ' 商品上架时间 :' ||
    v_es_pro.saledate|| ' 商品库存 :' || v_es_pro.stockcount);
    END;

    --控制语句
    IF <布尔表达式> THEN
    PL/SQL 语句
    END IF

    IF <布尔表达式> THEN
    PL/SQL 语句
    ELSE
    其他语句
    END IF
    IF <布尔表达式> THEN
    PL/SQL 语句
    ELSIF<布尔表达式> THEN
    其他语句
    ELSIF<布尔表达式> THEN
    其他语句
    ELSE
    其他语句
    END IF
    --根据用户输入的商品ID来查商品库存

    DECLARE
    V_ID ES_PRODUCT.ID%TYPE := &V_ID; --用户输入商品ID
    V_STOCKCOUNT ES_PRODUCT.STOCKCOUNT%TYPE; ---库存量
    BEGIN
    SELECT STOCKCOUNT INTO V_STOCKCOUNT FROM ES_PRODUCT WHERE ID = V_ID;
    DBMS_OUTPUT.PUT_LINE('库存量:'||V_STOCKCOUNT);
    --判断库存量是否正常
    IF V_STOCKCOUNT > 0 THEN
    --更新库存,一次买一个减掉一个
    UPDATE ES_PRODUCT SET STOCKCOUNT = STOCKCOUNT - 1
    --更新指定的,不然会全部更新
    WHERE ID=v_id;
    --提出数据操作
    COMMIT;
    DBMS_OUTPUT.PUT_LINE('库存更新成功');
    ELSIF V_STOCKCOUNT = 0 THEN
    DBMS_OUTPUT.PUT_LINE('库存量是0,没有库存了');
    ELSE
    DBMS_OUTPUT.PUT_LINE('库存异常');
    END IF;
    END;

    --根据订单的状态输出对应状态

    SELECT * FROM es_order;
    DECLARE
    V_ID ES_ORDER.ID%TYPE := &ID; --用户输入查询的订单编号
    V_STATUS ES_ORDER.STATUS%TYPE; --订单状态
    V_STANTUSNAME VARCHAR2(20);
    BEGIN
    SELECT STATUS INTO V_STATUS FROM ES_ORDER WHERE ID = V_ID;
    IF V_STATUS = 1 THEN
    V_STANTUSNAME := '已提交';
    ELSIF V_STATUS = 2 THEN
    V_STANTUSNAME := '已付款';
    ELSIF V_STATUS = 3 THEN
    V_STANTUSNAME := '已发货';
    ELSIF V_STATUS = 4 THEN
    V_STANTUSNAME := '已完成';
    ELSE
    V_STANTUSNAME := '未知状态';
    END IF;
    DBMS_OUTPUT.PUT_LINE(V_STANTUSNAME);
    END;

    CASE语法:
    格式一:
    CASE 条件表达式
    WHEN 条件表达式结果1 THEN
    语句段1
    WHEN 条件表达式结果2 THEN
    语句段2
    ....
    [ELSE 语句段]
    END CASE;
    格式二:
    CASE
    WHEN 条件表达式1 THEN
    语句段1
    WHEN 条件表达式2 THEN
    语句段2
    ....
    [ELSE 语句段]
    END CASE;
    --根据用户输入的商品ID来查商品库存用CASE来完成
    --格式一

    DECLARE
    V_ID ES_ORDER.ID%TYPE := &ID; --用户输入查询的订单编号
    V_STATUS ES_ORDER.STATUS%TYPE; --订单状态
    V_STANTUSNAME VARCHAR2(20);
    BEGIN
    SELECT STATUS INTO V_STATUS FROM ES_ORDER WHERE ID = V_ID;
    CASE V_STATUS
    WHEN 1 THEN
    V_STANTUSNAME := '已提交';
    WHEN 2 THEN
    V_STANTUSNAME := '已付款';
    WHEN 3 THEN
    V_STANTUSNAME := '已发货';
    WHEN 4 THEN
    V_STANTUSNAME := '已完成';
    ELSE
    V_STANTUSNAME := '未知状态';
    END CASE;
    DBMS_OUTPUT.PUT_LINE(V_STANTUSNAME);
    END;

    --格式二

    DECLARE
    V_ID ES_ORDER.ID%TYPE := &ID; --用户输入查询的订单编号
    V_STATUS ES_ORDER.STATUS%TYPE; --订单状态
    V_STANTUSNAME VARCHAR2(20);
    BEGIN
    SELECT STATUS INTO V_STATUS FROM ES_ORDER WHERE ID = V_ID;
    CASE 
    WHEN V_STATUS=1 THEN
    V_STANTUSNAME := '已提交';
    WHEN V_STATUS=2 THEN
    V_STANTUSNAME := '已付款';
    WHEN V_STATUS=3 THEN
    V_STANTUSNAME := '已发货';
    WHEN V_STATUS=4 THEN
    V_STANTUSNAME := '已完成';
    ELSE
    V_STANTUSNAME := '未知状态';
    END CASE;
    DBMS_OUTPUT.PUT_LINE(V_STANTUSNAME);
    END;

    --循环共有3种
    LOOP语法:
    LOOP
    要执行的语句;
    EXIT WHEN <条件语句>---条件满足,退出循环语句
    END LOOP;

    WHILE循环语法:
    WHILE<布尔表达式>LOOP
    要执行的语句;
    END LOOP;

    FOR循环语法;
    FOR 循环计数器 IN [REVERSE]下限...上限LOOP
    要执行的语句;
    END LOOP;
    在FOR循环中循环一次,变量自动加1,使用REVERSE,循环变量自动减1,也可以使用EXIT来退出循环

    SELECT * FROM es_sort;
    ID,sortname,fatherid三个字段
    --使用LOOP来添加3条记录

    DECLARE
    V_ID ES_SORT.ID%TYPE := 5; --为变量赋初始值
    V_SORTNAME ES_SORT.SORTNAME%TYPE := '类别'; --指定变量类型并赋初始值
    V_FATHERID ES_SORT.FATHERID%TYPE := 0;
    BEGIN
    LOOP
    INSERT INTO ES_SORT VALUES (V_ID, V_SORTNAME || V_ID, V_FATHERID);
    V_ID := V_ID + 1;
    --退出条件
    EXIT WHEN V_ID = 9;
    END LOOP;
    COMMIT;
    dbms_output.put_line('插入成功');
    END;


    --使用FOR循环来完成,知道循环次数时用FOR

    DECLARE
    V_ID ES_SORT.ID%TYPE ; --为变量赋类型
    V_SORTNAME ES_SORT.SORTNAME%TYPE := '类别'; --指定变量类型并赋初始值
    V_FATHERID ES_SORT.FATHERID%TYPE := 0;
    BEGIN
    FOR v_id IN 9..13 LOOP
    INSERT INTO ES_SORT VALUES (V_ID, V_SORTNAME || V_ID, V_FATHERID);
    END LOOP;
    COMMIT;
    dbms_output.put_line('插入成功');
    END;

    SELECT * FROM es_sort;
    --使用WHILE来完成,不知道循次数时用

    DECLARE
    V_ID ES_SORT.ID%TYPE:=14 ; --为变量赋类型和初值
    V_SORTNAME ES_SORT.SORTNAME%TYPE := '类别'; --指定变量类型并赋初始值
    V_FATHERID ES_SORT.FATHERID%TYPE := 0;
    BEGIN
    WHILE v_id>= 14 AND v_id<=20 LOOP
    INSERT INTO ES_SORT VALUES (V_ID, V_SORTNAME || V_ID, V_FATHERID);
    --变量增加
    v_id:=v_id+1;
    END LOOP;
    COMMIT;
    dbms_output.put_line('插入成功');
    END;
    SELECT * FROM es_sort;

    --输出1-100之间能被3整除的数字

    DECLARE
    V_I NUMBER;
    BEGIN
    FOR V_I IN 1 .. 100 LOOP
    IF (MOD(V_I, 3) = 0) THEN
    DBMS_OUTPUT.PUT_LINE(V_I);
    END IF;
    END LOOP;
    END;
  • 相关阅读:
    Linux 下的类似Windows下Everything的搜索工具
    windows和linux环境下制作U盘启动盘
    程序调试手段之gdb, vxworks shell
    LeetCode 1021. Remove Outermost Parentheses (删除最外层的括号)
    LeetCode 1047. Remove All Adjacent Duplicates In String (删除字符串中的所有相邻重复项)
    LeetCode 844. Backspace String Compare (比较含退格的字符串)
    LeetCode 860. Lemonade Change (柠檬水找零)
    LeetCode 1221. Split a String in Balanced Strings (分割平衡字符串)
    LeetCode 1046. Last Stone Weight (最后一块石头的重量 )
    LeetCode 746. Min Cost Climbing Stairs (使用最小花费爬楼梯)
  • 原文地址:https://www.cnblogs.com/liunanjava/p/4205011.html
Copyright © 2011-2022 走看看