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;

 

你可能感兴趣的:(pl/sql)