程序師世界是廣大編程愛好者互助、分享、學習的平台,程序師世界有你更精彩!
首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫知識
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
 程式師世界 >> 數據庫知識 >> Oracle數據庫 >> Oracle教程 >> PL/SQL基礎1(筆記),plsql

PL/SQL基礎1(筆記),plsql

編輯:Oracle教程

PL/SQL基礎1(筆記),plsql


--基本結構
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 WHEN來退出循環


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;

  1. 上一頁:
  2. 下一頁:
Copyright © 程式師世界 All Rights Reserved