PL/SQL入門隨筆

来源:http://www.cnblogs.com/gawain-ma/archive/2017/07/18/7199991.html
-Advertisement-
Play Games

第一次發博客,主要目的在於整理學習筆記,如果能對大家參考起到一點幫助,非常榮幸! ...


PL/SQL(Procedure Language/SQL)

PLSQL是Oracle對sql語言的過程化擴展:
在SQL命令語言中增加了過程處理語句(如分支、迴圈等),使SQL語言具有過程處理能力。
SQL語言的數據操作能力與過程語言的數據處理能力相結合,使PLSQL面向過程,但比過程語言簡單、高效、靈活、實用。
不同資料庫的SQL擴展
  Oracle:PL/SQL
  DB2:SQL/PL
  SQL Server:Transac-SQL(T-SQL)
===============================================================
1、PL/SQL操作資料庫效率最高
2、繼續學習存儲過程,存儲函數,觸發器
第一個程式
  --打開輸出開關
  set serveroutput on
  declare
  -- 說明部分(變數,游標或者例外)
  begin
  --程式體
  dbms_output.put_line('hello world');
  end;
  /

===========================目錄===============================

1,PL/SQL的程式結構

2,PL/SQL引用型變數和記錄型變數

3,PL/SQL中if語句的使用

4,PL/SQL中迴圈語句的使用

5,PL/SQL中游標

6,PL/SQL例外

7,程式設計方法
================PL/SQL的程式結構===============================
declare
說明部分(變數說明、游標說明、例外說明)
begin
語句序列(DML語句)
exception
例外處理語句
end;
/
定義基本變數
類型:char,varchar2,date,number,boolean,long
舉例:var1 char(15);
married boolean := true;
psal number(7,2);
================PL/SQL引用型變數和記錄型變數====================
emp_rec emp%rowtype emp_rec是emp的行,數組類型,可以獲取EMP的所有欄位,加.欄位即可。(記錄型變數)
pename emp.ename%type 某個欄位的類型,只能獲取表中的一個欄位。(引用型變數)
================PL/SQL中if語句的使用============================
1、if 條件 then 語句1;
語句2;
end if;
2、if 條件 then 語句1;
else 語句2;
end if;
3、if 條件 then 語句1;
elsif 語句 then 語句;
else 語句;
end if;
-- 判斷用戶從鍵盤輸入的數字
set serveroutput on
accept num prompt '請輸入一個數字';

declare
pnum number:=#
begin
if pnum = 0 then dbms_output.put_line('你輸入的是0');
elsif pnum = 1 then dbms_output.put_line('你輸入的是1');
else dbms_output.put_line('你輸入的是其他數字');
end;
/
================PL/SQL中迴圈語句的使用============================
1.while迴圈:當迴圈條件成立時執行迴圈體,不成立時退出該迴圈
WHILE total <= 25000 LOOP
...
total := total + salary;
END LOOP;
2.loop迴圈:當迴圈條件不成立時執行迴圈體,成立時退出該迴圈
Loop
EXIT [when 條件];
...
End loop;
3.for迴圈:迴圈是連續的區間時
FOR I IN 1..3 LOOP
語句序列;
END LOOP;
================PL/SQL中游標============================
定義:就是一個結果集(result set)
語法
CURSOR 游標名[(參數名 數據類型[,參數名 數據類型]...)]
IS SELECT 語句;
例如 cursor c1 is select ename from emp;
實用:
1.打開游標:
open c1;打開游標執行查詢
2.關閉游標:
close c1;關閉游標釋放資源
3.取一行游標的值:
fetch c1 into pename;取一行到變數中
fetch的作用:1)把當前指針指向的記錄返回
2)講指針指向下一條記錄
屬性:
%found %notfound
%isopen判斷游標是否打開
%rowcount影響的行數
游標數的限制:預設打開最多300個游標
修改游標數限制 alter system set open_cursors=400 scope=both
scopt屬性:memory(只該當前實例),spfile(只改參數文件,資料庫需要重啟),both(兩者都改)
實例:
set serveroutput on
declare
cursor cemp is select ename,salary from emp;
pname emp.ename%type;
psal emp.sal%type;
begin
-- 打開游標
open cemp;
loop
-- 取一條記錄
fetch cemp into pename,psal;
exit when cemp%notfound
dbms_output.put_line(pname||'的薪水是'||psal);
end loop
-- 關閉游標
close cemp
end
/
實例1:給員工漲工資
set serveroutput on
declare
--定義游標給哪些員工漲工資
cursor cemp is select empno,empjob from emp;
penmno emp.empno%type;
pjob emp.empjob%type;
begin
--打開游標
--把之前漲的工資回退回去
rollback;
open cemp;
loop
fetch cemp into penmno,pjob;
exit when cemp%notfound
-- 判斷新員工的職位
if pjob = 'president' then update emp set sal = sal+1000 where empno = pempno;
elsif pjob = 'manager' then update emp set sal=sal +800 where empno = pempno;
else update emp set sal = sal +400 where empno = pempno;
end if;
end loop
close cemp;
commit;
dbms_output.put_line('漲工資完成');
-- 對於oracle,預設的事務隔離級別是read committed
-- 事務的acid:原子性,一致性,隔離性,持久性,
end;
/
eg:
--使用帶參數的游標
declare
--定義一個帶參數的游標
cursor c_emp(dno number) is select ename from emp where deptno=dno;
p_ename emp.ename%type;
begin
--打開游標時需要參入實參
open c_emp(10);
loop
fetch c_emp into p_ename;
exit when c_emp%notfound;
DBMS_OUTPUT.PUT_LINE(p_ename);
end loop;
close c_emp;
end;
/
=================PL/SQL例外============================
例外是程式設計語言提供的一種功能,用來增強程式的健壯性和容錯性
1.No_date_found(沒有找到數據)
2.Too_many_rows (select...into語句匹配多個行)
3.Zero_Divide (被零除)
4.Value_error (算術或轉換錯誤) 如:負數在實數範圍開平方,abc字元串 轉換成 數字123
5.Timeout_on_resource (等待資源時發生超時)比較典型的場景:分散式資料庫
--系統例外:no_data_found
declare
pename emp.ename%type;
begin
select ename into pename from emp where empno=222222;
SYS.DBMS_OUTPUT.PUT_LINE(pename);
exception
when no_data_found then sys.dbms_output.put_line('沒有對應的記錄');
when others then sys.dbms_output.put_line('其它例外');
end;
/
--系統例外:too_many_rows;
declare
pename emp.ename%type;
begin
select ename into pename from emp where deptno=10;
SYS.DBMS_OUTPUT.PUT_LINE(pename);

exception
when no_data_found then sys.dbms_output.put_line('沒有對應的記錄');
when too_many_rows then sys.dbms_output.put_line('無法將多行記錄賦值給一個普通變數');
when others then sys.dbms_output.put_line('其它例外');
end;
/
--系統例外:zero_divide 被0除
declare
pnum number;
begin
pnum:=1/0;

exception
when zero_divide then
sys.dbms_output.put_line('0不能做除數');
sys.dbms_output.put_line('0真的不能做除數');
when others then sys.dbms_output.put_line('其它例外');
end;
/
--系統例外:value_error算術或轉換例外
declare
pnum number;
begin
pnum:='abd';
exception
when value_error then
sys.dbms_output.put_line('算術或者轉換錯誤');
when others then sys.dbms_output.put_line('其它例外');
end;
/
--自定義例外:查詢50號部門的員工姓名
set serveroutput on
declare
--定義游標
cursor cemp is select ename from emp where deptno=50;
pename emp.ename%type;
--自定義例外
no_emp_data exception;
begin
open cemp;
loop
fetch cemp into pename;
if cemp%notfound then raise no_emp_data;-- 拋出例外
exit when cemp%notfound;
end if;
end loop;
close cemp;-- 關閉游標,oracle自動啟動pmon(process monitor)
exception
when no_emp_data then dbms_output.put_line('沒有找到員工');
when others then dbms_output.put_line('其他');
end;
/
=====================程式設計方法============================
需求分析->概要設計->詳細設計->編碼->測試->上線
sql語句
變數:1、初始值是多少2、最終值如何得到

 


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

-Advertisement-
Play Games
更多相關文章
  • 之前的文章,在上面建立完config之後,UIl通過 來初始化ImageLoader對象,之後就可以用ImageLoader來載入圖片。 這裡,採用到單例模式來獲取ImageLoader對象,保證他全局初始化一次。再上面的分析中,我們可以看出單例模式的好處,創建ImageLoader對象的時候需要創 ...
  • 1、待會兒會用到RecyclerView,首先在app/build.gradle(註意有兩個build.gradle,選擇app下的那個)當中添加依賴庫,如下: 添加完之後記得點擊Sync Now進行同步。 2、開始編寫主界面,修改activity_main.xml中的代碼,如下: Recycler ...
  • 一、還原數據與還原表空間 還原數據是: • 原始的、修改之前的數據副本 • 針對更改數據的每個事務處理而捕獲 • 至少保留到事務處理結束 • 用於支持: – 回退操作 – 讀取一致性查詢 – Oracle 閃回查詢、Oracle 閃回事務處理和 Oracle 閃回表 – 從失敗的事務處理中進行恢復 ...
  • 昨晚某現場報一個重建索引失敗的問題,遠程查看後發現是自動收縮的內部會話引發的鎖申請超時,突然想起來自己的加鎖實驗還沒完成索引重建部分,今天有空正好做一下: 先試了下聚集索引的重建,以下是相關會話的所有加鎖情況: 從以上的鎖分佈情況來分析,首先我們過濾掉所有非相關表的鎖,那麼整個結果集只剩下了6行: ...
  • (1) mongodb的安裝 下載tgz解壓後,需要添加相應的環境變數才能在終端直接啟動mongod。 mongodb數據存儲在/data/db中,需要手動創建目錄樹,同時mongod執行的時候如果許可權不夠(不能往/data/db寫東西),需要改一下許可權。 (2) mongod的啟動 之後就可以在終 ...
  • 利用 MySQL proxies_priv(模擬角色)實現類似用戶組管理 角色(Role)可以用來批量管理用戶,同一個角色下的用戶,擁有相同的許可權。 MySQL5.7.X以後可以模擬角色(Role)的功能,通過mysql.proxies_priv模擬實現 本文參考自:http://www.innom ...
  • 一、下載 下載地址:http://download.csdn.net/detail/qq_35624642/9773986 這是Oracle Instant Client的CSDN下載地址。 要註意第三方工具如:PL/SQL Developer和Toad的版本,32位的要對應32位的OracleIn ...
  • 有時候別人需要連接你的資料庫,這個時候你就要開放資料庫的埠,讓別的主機可以連接上,步驟如下: 1.打開防火牆,新建入站規則,開放MySQL3306埠 2.執行以下兩個命令: (1)如果你想允許用戶從ip為192.168.1.3的主機連接到mysql伺服器,並使用mypassword作為密碼 GR ...
一周排行
    -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.數據驗證 在伺服器端進行嚴格的數據驗證,確保接收到的數據符合預期格 ...