Oracle中的PL/SQL 過程化sql語言

来源:http://www.cnblogs.com/wqtzhaoqiang/archive/2017/11/17/7853486.html
-Advertisement-
Play Games

資料庫的設計(DataBase Design): 針對於用戶特定的需求,然後我們創建出來一個最使用而且性能高的資料庫! 資料庫設計的步驟: 01.需求分析 02.概念結構設計 03.邏輯結構設計 04.物理結構設計 05.資料庫的實施 06.資料庫的運行和維護 資料庫的3大範式: 1.確保每列的原子 ...


資料庫的設計(DataBase Design):
針對於用戶特定的需求,然後我們創建出來一個最使用而且性能高的資料庫!

資料庫設計的步驟:
01.需求分析
02.概念結構設計
03.邏輯結構設計
04.物理結構設計
05.資料庫的實施
06.資料庫的運行和維護

 

資料庫的3大範式:
1.確保每列的原子性!每一列都是一個不可再分的數據!
2.確保每列都和主鍵相關!
3.確保每列都和主鍵有直接的管理,而不是間接依賴(傳遞依賴)!

PL/SQL: (Procedural  Language)  過程化sql語言!

資料庫在執行PL/SQL語句的時候,PL和SQL是分別執行的!

PL/SQL運算符

算術運算符

下表列出了所有PL/SQL支持的算術運算符。假設變數A=10和可變B=5,則:

BEGIN 
   dbms_output.put_line( 10 + 5);
   dbms_output.put_line( 10 - 5);
   dbms_output.put_line( 10 * 5);
   dbms_output.put_line( 10 / 5);
   dbms_output.put_line( 10 ** 5);
END;
算數運算符

當上述代碼在SQL提示符執行時,它產生了以下結果:

關係運算符

關係運算符比較兩個表達式或值,並返回一個布爾結果。下表列出了所有PL/SQL支持的關係運算符。假設變數A=10,變數B=20,則:

DECLARE  --聲明
   a number (2) := 21;
   b number (2) := 10;
BEGIN    --開始
   IF (a = b) then
      dbms_output.put_line('Line 1 - a is equal to b');
   ELSE
      dbms_output.put_line('Line 1 - a is not equal to b');
   END IF;  --結束迴圈

   IF (a < b) then
      dbms_output.put_line('Line 2 - a is less than b');
   ELSE
      dbms_output.put_line('Line 2 - a is not less than b');
   END IF;  --結束迴圈
   
   IF ( a > b ) THEN
      dbms_output.put_line('Line 3 - a is greater than b');
   ELSE
      dbms_output.put_line('Line 3 - a is not greater than b');
   END IF;  --結束迴圈

   -- Lets change value of a and b
   a := 5;
   b := 20;
   IF ( a <= b ) THEN
      dbms_output.put_line('Line 4 - a is either equal or less than b');
   END IF;

   IF ( b >= a ) THEN
      dbms_output.put_line('Line 5 - b is either equal or greater than a');
   END IF;
   
   IF ( a <> b ) THEN
      dbms_output.put_line('Line 6 - a is not equal to b');
   ELSE
      dbms_output.put_line('Line 6 - a is equal to b');
   END IF;

END; --結束
關係運算符

當上述代碼在SQL提示符執行時,它產生了以下結果:

比較運算符

比較運算符用於一個表達比較到另一個。結果總是 TRUE,FALSE或NULL。

--LIKE 運算符
--這個程式測試LIKE運算符,將學習如何在PL/ SQL程式使用,但這裡用一個程式來顯示LIKE運算符的功能:
DECLARE
PROCEDURE compare (value  varchar2,  pattern varchar2 ) is
BEGIN
   IF value LIKE pattern THEN
      dbms_output.put_line ('True');
   ELSE
      dbms_output.put_line ('False');
   END IF;
END;

BEGIN
   compare('Zara Ali', 'Z%A_i');
   compare('Nuha Ali', 'Z%A_i');
END;
Like運算符

當上述代碼在SQL提示符執行時,它產生了以下結果:

--BETWEEN運算符
--下麵的程式顯示了運算符BETWEEN的用法
DECLARE
   x number(2) := 10;
BEGIN
   IF (x between 5 and 20) THEN
      dbms_output.put_line('True');
   ELSE
      dbms_output.put_line('False');
   END IF;
   
   IF (x BETWEEN 5 AND 10) THEN
      dbms_output.put_line('True');
   ELSE
      dbms_output.put_line('False');
   END IF;
   
   IF (x BETWEEN 11 AND 20) THEN
      dbms_output.put_line('True');
   ELSE
      dbms_output.put_line('False');
   END IF;
END;
BETWEEN運算符

當上述代碼在SQL提示符執行時,它產生了以下結果:

--IN和IS NULL運算符
--下麵的程式顯示IN和IS NULL運算符的用法
DECLARE
   letter varchar2(1) := 'm';
BEGIN
   IF (letter in ('a', 'b', 'c')) THEN
      dbms_output.put_line('True');
   ELSE
      dbms_output.put_line('False');
   END IF;
 
   IF (letter in ('m', 'n', 'o')) THEN
       dbms_output.put_line('True');
   ELSE
      dbms_output.put_line('False');
   END IF;
   
   IF (letter is null) THEN
    dbms_output.put_line('True');
   ELSE
      dbms_output.put_line('False');
   END IF;
END;
IN和IS NULL運算符

當上述代碼在SQL提示符執行時,它產生了以下結果:

 

邏輯運算符

下表顯示了PL/SQL支持的邏輯運算符。所有這些操作符布爾運算,並產生布爾結果。假設變數A=true,變數B=false

DECLARE
   a boolean := true;
   b boolean := false;
BEGIN
   IF (a AND b) THEN
      dbms_output.put_line('Line 1 - Condition is true');
   END IF;
   IF (a OR b) THEN
      dbms_output.put_line('Line 2 - Condition is true');
   END IF;
   IF (NOT a) THEN
      dbms_output.put_line('Line 3 - a is not true');
   ELSE
      dbms_output.put_line('Line 3 - a is true');
   END IF;
   IF (NOT b) THEN
      dbms_output.put_line('Line 4 - b is not true');
   ELSE
      dbms_output.put_line('Line 4 - b is true');
   END IF;
END;
邏輯運算符

 當上述代碼在SQL提示符執行時,它產生了以下結果:

PL/SQL運算符優先順序

運算符優先順序確定表達式分組。這會影響一個表達式是如何進行計算。某些運算符的優先順序高於其他運算符; 例如,乘法運算符的優先順序比加法運算高:

例如 x =7 + 3* 2; 這裡,x被賦值13,而不是20,因為運算符*具有優先順序高於+,所以它首先被乘以3 * 2,然後再加上7。

這裡,具有最高優先順序的操作出現在表的頂部,那些具有最低出現在底部。在表達式,更高的優先順序運算符將首先計算。

DECLARE
   a number(2) := 20;
   b number(2) := 10;
   c number(2) := 15;
   d number(2) := 5;
   e number(2) ;
BEGIN
   e := (a + b) * c / d;      -- ( 30 * 15 ) / 5
   dbms_output.put_line('Value of (a + b) * c / d is : '|| e );

   e := ((a + b) * c) / d;   -- (30 * 15 ) / 5
   dbms_output.put_line('Value of ((a + b) * c) / d is  : ' ||  e );

   e := (a + b) * (c / d);   -- (30) * (15/5)
   dbms_output.put_line('Value of (a + b) * (c / d) is  : '||  e );

   e := a + (b * c) / d;     --  20 + (150/5)
   dbms_output.put_line('Value of a + (b * c) / d is  : ' ||  e );
END;
運算符

當上述代碼在SQL提示符執行時,它產生了以下結果:

|| 拼接字元串
:= 賦值運算符
= 比較運算符 類似與java中的==
.. 範圍運算符  1-10
!= <> ~= ^=  4種不等於
and 邏輯與
or 邏輯或
not 取反

 

PL/SQL語法:

1.declare 可選部分 ==》聲明

2.begin 必須有 ==》書寫sql 和 pl/sql

3.exception 可選部分 ==》異常

4.end 必須有 ==》pl/sql代碼塊結束

 事例1:loop迴圈語法

--loop迴圈語法:
declare    --聲明部分
  i number;
begin      --開始
  i:=1;
  loop     --迴圈開始
    dbms_output.put_line(i);   --輸出語句
    i:=i+1;
    exit when i=10;
  end loop; --迴圈結束
  
end;  --結束
loop迴圈語法

事例2:while迴圈語法

declare    --聲明部分
  i number;
begin      --代碼開始
  
  i:=1;
 while i<8 loop     --迴圈開始
    dbms_output.put_line(i);   --輸出語句
    i:=i+1;
  end loop; --迴圈結束
end;        --結束部分
while迴圈語法

事例3:for迴圈語法

declare    --聲明部分
  i number;
  
begin      --代碼開始
  
 for  i in 1..9 loop     --迴圈開始
    dbms_output.put_line(i);   --輸出語句
  end loop; --迴圈結束
  
end;        --結束部分
for迴圈語法

事例4:根據老師的薪水輸出不同的語句!

declare
  t_name  teacher.tname%type;  --說t_name的類型根據teacher表中tname的類型來決定
  t_sal   teacher.sal%type;
  t_result  varchar2(50);
begin    --開始
  select  tname,sal into t_name,t_sal   from teacher where tno=1002; --查詢指定老師的薪水
  
    if t_sal>5000 and t_sal<10000 then   -- 多重if
      t_result:='一級';
    elsif t_sal>=10000 and t_sal<20000 then
      t_result:='二級';
    else
      t_result:='高級';
    end if;  
    --根據t_result的值來判斷輸入語句    switch
    case t_result
        when '一級' then
        dbms_output.put_line('哈哈....');
        when '二級' then
        dbms_output.put_line('一般般....');
        when '高級' then
        dbms_output.put_line('可以啊....');      
    end case;
end;     --結束
根據老師的薪水輸出不同語句

事例5:函數,將身份證中的出生日期隱藏起來

create or replace  function fn_teacher_tid(f_tid varchar2)
return varchar2     --創建一個函數  傳遞一個varchar2類型的值 返回一個varchar2類型的值
is
 f_result varchar2(50);    --聲明變數
begin      --開始書寫函數內容
  if length(f_tid)!=18 then
    dbms_output.put_line('身份證格式不正確');
    else
    dbms_output.put_line('身份證格式正確'); 
  end if;
    f_result:= substr(f_tid,1,6)||'********'||substr(f_tid,15);
    return f_result;
end fn_teacher_tid;   --函數結束

--調用函數  需要現將函數執行 放入到Functions中  沒有出錯時再調用方法
select fn_teacher_tid('41302619921215935X') from dual;
函數,將身份證中的出生日期隱藏起來

執行結果出生日期8位數字被隱藏

事例6:隱式游標

begin    --  隱式游標    自動創建
     update teacher set tname='我是隱式游標' where tno=1002;  --修改
    if sql%found  then
       dbms_output.put_line('教師的信息已經更改'||sql%rowcount);
       else
       dbms_output.put_line('更改失敗');
    end if;      
end;
隱式游標

 

 事例7:顯示游標

declare    --聲明 顯示游標
  c_tname  teacher.tname%type;
  c_sal    teacher.sal%type;
cursor  teacher_cursor
is
select tname,sal from teacher where tno<1005;  --游標數據來源
begin
  open teacher_cursor;  --打開游標
   fetch teacher_cursor into c_tname,c_sal;--使用游標
    while teacher_cursor%found  loop      
      dbms_output.put_line('教師的姓名是==》'||c_tname);
      dbms_output.put_line('教師的薪水是==》'||c_sal); 
      fetch teacher_cursor into c_tname,c_sal;--逐行讀取  
    end loop;
  close teacher_cursor;   --關閉游標
end;
顯示游標

 

判斷條件tno<1005  顯示老師的姓名和工資

 

游標 :
01.是oracle系統給我們用戶開設的一個數據緩衝區!
02.存放的是sql語句執行的結果集!
03.每個游標區都有一個名稱,用戶通過游標逐行獲取需要的數據!

分類:
01.隱式游標: 非查詢語句
只要我們使用pl/sql,程式在執行sql語句的時候 自動創建! 游標區===》sql
02.顯示游標: 返回多行記錄
03.REF游標(動態游標): 處理運行時才能確定的動態sql查詢結果

游標的常用屬性:
01.sql%found 影響了一行或者多行數據 返回true
02.sql%notfound 沒有影響行 返回true
03.sql%rowcount 返回true影響行數
04.sql%isopen 游標是否打開!始終是false

使用游標的步驟:
01.聲明游標
02.打開游標
03.使用游標獲取記錄
04.關閉游標

事例8:觸發器

觸發器只針對於增刪改! 

update :old :new
insert :new
delete :old

:old 代表修改之前的值
:new 代表修改之後的值

-- 創建一個用於保存teacher操作記錄的表
create  table  teacher_log
(
logid  number  not null,
old_value varchar2(150),
create_date date,
log_type  number,
t_no number
);
--創建主鍵
alter  table  teacher_log add  constraint pk_teacher_logid 
primary key(logid);

-- 創建序列
create  sequence sq_teacherLog_logid
minvalue 1
maxvalue 99999999999
start with 1
increment by 1;

--  創建觸發器
create or replace trigger  tr_teacher
after insert or update or delete    --會在增刪改之後 觸發
on teacher for each row   --作用在teacher表中的每一行
declare   --聲明變數
old_value    teacher_log.old_value%type;
log_type     teacher_log.log_type%type;
t_no         teacher_log.t_no%type;
begin
    if inserting  then
      log_type:=1; --新增
      t_no:=:new.tno;
      old_value:=:new.tname||'*****'||:new.sal;
    elsif deleting  then
       log_type:=2; --刪除
      t_no:=:old.tno;
      old_value:=:old.tname||'*****'||:old.sal;
     else
       log_type:=3; --修改
       t_no:=:old.tno;
      old_value:=:old.tname||'*****'||:old.sal||'現在的薪水:'||:new.sal;
    end  if;  
  
--把用戶修改的數據 放入 teacher_log
insert into  teacher_log
values(sq_teacherLog_logid.nextval,old_value,sysdate,log_type,t_no);    
end tr_teacher;  --結束
select * from teacher
select * from teacher for update
select * from teacher_log
觸發器

 先執行添加語句  打開表中的鎖、修改金額、點擊對號,提交事務

select * from teacher for update

執行查詢teacher_log表,可以看到被修改的數據

select * from teacher_log

刪除表中第二條數據 TNO=1009  秦亞傑 打開表中的鎖、刪除欄位、點擊對號,提交事務

 

您的分享是我們最大的動力!

-Advertisement-
Play Games
更多相關文章
  • RecyclerView做的一個輪播效果,適配器有視圖緩存,避免了一些記憶體問題 首先是藉助 PagerSnapHelper 讓RecyclerView每次只滑動一個,然後添加一個指示器,這裡指示器是動態生成的,自己做了個簡單的view 很簡單的一個效果,直接上代碼 public class Imag ...
  • iOS7 topLayoutGuide/bottomLayoutGuide 創建一個叫做LayoutGuideStudy的工程,我們打開看一下Main.storyboard: storyboard-top_bottom_layoutGuide.png 可以看到View Controller下麵出現t ...
  • 隨著社會經濟的發展,車輛已經成了城鎮居民的必需品,而查駕駛證違章記錄、繳納違章罰款,也已經成了人們的生活常態了。而移動互聯的飛速發展,讓這些以前需要跑銀行、跑交警大隊的事項,如今通過手機APP就能解決了。但是手機APP也有讓人困擾的地方,那就是手動輸入駕駛證信息非常繁瑣,且操作容易出現錯誤,不過當手 ...
  • 效果圖 一、環境設置 1.開發環境:Xocode 7.3.1 2.模擬器環境:iOS 9.3 3.iOS 9 之後不能直接使用 HTTP 進行請求,需要在 Info.plist 新增一段用於控制 ATS 的配置: 也即: 註: bitcode 是 xcode 7 之後新增的配置選項,預設為 YES, ...
  • CK2137-Android Studio-2017最新版p2p金融項目實戰 隨筆背景:在很多時候,很多入門不久的朋友都會問我:我是從其他語言轉到程式開發的,有沒有一些基礎性的資料給我們學習學習呢,你的框架感覺一下太大了,希望有個循序漸進的教程或者視頻來學習就好了。對於學習有困難不知道如何提升自己可 ...
  • 以下為本人學習Redis的備忘錄,記錄了大部分常用命令 1.客戶端連接redis服務端: 啟動Redis服務端 redis-server /yourpath/redis.conf 啟動Redis命令行客戶端 建立長連接:redis-cli -h 127.0.0.1 -p 6379 若省略參數則將使用 ...
  • 1.使用ECLIPSE工具打包運行WORDCOUNT實例,統計莎士比亞文集各單詞計數(文件SHAKESPEARE.TXT)。 ①WorldCount.java 中的main函數修改如下: ②導出WordCount的jar包: export->jar file->next->next->Main cl ...
  • 1.找到my.ini MySql5.7安裝後(windows環境),在安裝目錄下並沒有發現my.ini的配置文件,百度了一下才知道MySql安裝時會將data文件夾(包含資料庫信息和文件)放在ProgramData文件夾中,並且ProgramData文件夾是以隱藏的形式存在。。。。接下來就需要開啟隱 ...
一周排行
    -Advertisement-
    Play Games
  • 1. 說明 /* Performs operations on System.String instances that contain file or directory path information. These operations are performed in a cross-pla ...
  • 視頻地址:【WebApi+Vue3從0到1搭建《許可權管理系統》系列視頻:搭建JWT系統鑒權-嗶哩嗶哩】 https://b23.tv/R6cOcDO qq群:801913255 一、在appsettings.json中設置鑒權屬性 /*jwt鑒權*/ "JwtSetting": { "Issuer" ...
  • 引言 集成測試可在包含應用支持基礎結構(如資料庫、文件系統和網路)的級別上確保應用組件功能正常。 ASP.NET Core 通過將單元測試框架與測試 Web 主機和記憶體中測試伺服器結合使用來支持集成測試。 簡介 集成測試與單元測試相比,能夠在更廣泛的級別上評估應用的組件,確認多個組件一起工作以生成預 ...
  • 在.NET Emit編程中,我們探討了運算操作指令的重要性和應用。這些指令包括各種數學運算、位操作和比較操作,能夠在動態生成的代碼中實現對數據的處理和操作。通過這些指令,開發人員可以靈活地進行算術運算、邏輯運算和比較操作,從而實現各種複雜的演算法和邏輯......本篇之後,將進入第七部分:實戰項目 ...
  • 前言 多表頭表格是一個常見的業務需求,然而WPF中卻沒有預設實現這個功能,得益於WPF強大的控制項模板設計,我們可以通過修改控制項模板的方式自己實現它。 一、需求分析 下圖為一個典型的統計表格,統計1-12月的數據。 此時我們有一個需求,需要將月份按季度劃分,以便能夠直觀地看到季度統計數據,以下為該需求 ...
  • 如何將 ASP.NET Core MVC 項目的視圖分離到另一個項目 在當下這個年代 SPA 已是主流,人們早已忘記了 MVC 以及 Razor 的故事。但是在某些場景下 SSR 還是有意想不到效果。比如某些靜態頁面,比如追求首屏載入速度的時候。最近在項目中回歸傳統效果還是不錯。 有的時候我們希望將 ...
  • System.AggregateException: 發生一個或多個錯誤。 > Microsoft.WebTools.Shared.Exceptions.WebToolsException: 生成失敗。檢查輸出視窗瞭解更多詳細信息。 內部異常堆棧跟蹤的結尾 > (內部異常 #0) Microsoft ...
  • 引言 在上一章節我們實戰了在Asp.Net Core中的項目實戰,這一章節講解一下如何測試Asp.Net Core的中間件。 TestServer 還記得我們在集成測試中提供的TestServer嗎? TestServer 是由 Microsoft.AspNetCore.TestHost 包提供的。 ...
  • 在發現結果為真的WHEN子句時,CASE表達式的真假值判斷會終止,剩餘的WHEN子句會被忽略: CASE WHEN col_1 IN ('a', 'b') THEN '第一' WHEN col_1 IN ('a') THEN '第二' ELSE '其他' END 註意: 統一各分支返回的數據類型. ...
  • 在C#編程世界中,語法的精妙之處往往體現在那些看似微小卻極具影響力的符號與結構之中。其中,“_ =” 這一組合突然出現還真不知道什麼意思。本文將深入剖析“_ =” 的含義、工作原理及其在實際編程中的廣泛應用,揭示其作為C#語法奇兵的重要角色。 一、下劃線 _:神秘的棄元符號 下劃線 _ 在C#中並非 ...