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
  • 移動開發(一):使用.NET MAUI開發第一個安卓APP 對於工作多年的C#程式員來說,近來想嘗試開發一款安卓APP,考慮了很久最終選擇使用.NET MAUI這個微軟官方的框架來嘗試體驗開發安卓APP,畢竟是使用Visual Studio開發工具,使用起來也比較的順手,結合微軟官方的教程進行了安卓 ...
  • 前言 QuestPDF 是一個開源 .NET 庫,用於生成 PDF 文檔。使用了C# Fluent API方式可簡化開發、減少錯誤並提高工作效率。利用它可以輕鬆生成 PDF 報告、發票、導出文件等。 項目介紹 QuestPDF 是一個革命性的開源 .NET 庫,它徹底改變了我們生成 PDF 文檔的方 ...
  • 項目地址 項目後端地址: https://github.com/ZyPLJ/ZYTteeHole 項目前端頁面地址: ZyPLJ/TreeHoleVue (github.com) https://github.com/ZyPLJ/TreeHoleVue 目前項目測試訪問地址: http://tree ...
  • 話不多說,直接開乾 一.下載 1.官方鏈接下載: https://www.microsoft.com/zh-cn/sql-server/sql-server-downloads 2.在下載目錄中找到下麵這個小的安裝包 SQL2022-SSEI-Dev.exe,運行開始下載SQL server; 二. ...
  • 前言 隨著物聯網(IoT)技術的迅猛發展,MQTT(消息隊列遙測傳輸)協議憑藉其輕量級和高效性,已成為眾多物聯網應用的首選通信標準。 MQTTnet 作為一個高性能的 .NET 開源庫,為 .NET 平臺上的 MQTT 客戶端與伺服器開發提供了強大的支持。 本文將全面介紹 MQTTnet 的核心功能 ...
  • Serilog支持多種接收器用於日誌存儲,增強器用於添加屬性,LogContext管理動態屬性,支持多種輸出格式包括純文本、JSON及ExpressionTemplate。還提供了自定義格式化選項,適用於不同需求。 ...
  • 目錄簡介獲取 HTML 文檔解析 HTML 文檔測試參考文章 簡介 動態內容網站使用 JavaScript 腳本動態檢索和渲染數據,爬取信息時需要模擬瀏覽器行為,否則獲取到的源碼基本是空的。 本文使用的爬取步驟如下: 使用 Selenium 獲取渲染後的 HTML 文檔 使用 HtmlAgility ...
  • 1.前言 什麼是熱更新 游戲或者軟體更新時,無需重新下載客戶端進行安裝,而是在應用程式啟動的情況下,在內部進行資源或者代碼更新 Unity目前常用熱更新解決方案 HybridCLR,Xlua,ILRuntime等 Unity目前常用資源管理解決方案 AssetBundles,Addressable, ...
  • 本文章主要是在C# ASP.NET Core Web API框架實現向手機發送驗證碼簡訊功能。這裡我選擇是一個互億無線簡訊驗證碼平臺,其實像阿裡雲,騰訊雲上面也可以。 首先我們先去 互億無線 https://www.ihuyi.com/api/sms.html 去註冊一個賬號 註冊完成賬號後,它會送 ...
  • 通過以下方式可以高效,並保證數據同步的可靠性 1.API設計 使用RESTful設計,確保API端點明確,並使用適當的HTTP方法(如POST用於創建,PUT用於更新)。 設計清晰的請求和響應模型,以確保客戶端能夠理解預期格式。 2.數據驗證 在伺服器端進行嚴格的數據驗證,確保接收到的數據符合預期格 ...