Oracle 的PL/SQL語言使用

来源:https://www.cnblogs.com/qingyundian/archive/2018/06/07/9148301.html
-Advertisement-
Play Games

--PL/SQL語言(procedure language 過程化語言) --1.聲明類型 declare k number; m number default 20; --Character String buffer too small問題 --pname varchar2(4); --所以更換... ...


--PL/SQL語言(procedure language 過程化語言)
--1.聲明類型
declare
  k number;
  m number default 20;
  --Character String buffer too small問題
  --pname varchar2(4);
  --所以更換聲明
  pname emp.ename%type;
  --查詢一行用表名聲明
  prow emp%rowtype;
begin
  k:=30;
  dbms_output.put_line(k);
  dbms_output.put_line('原樣輸出 m='||m);
  select ename into pname from emp where empno=7788;
  dbms_output.put_line(pname);
  --查詢結果是一行值
  select * into prow from emp where empno=7654;
  dbms_output.put_line
  (prow.empno||'-'||prow.ename||'-'||prow.job);
end;

--2.1 結構化判斷語句
declare
  k number;
begin
  k:=&這裡可以讓你輸入;
  if k>0 then 
     dbms_output.put_line(' k是正數'||k);
  elsif k<0 then
     dbms_output.put_line(' k是負數'||k);
  else
     dbms_output.put_line(' k是零'||k);
  end if;
end;

--2.2.1 結構化迴圈語句 loop輸出1-10
declare
  k number default 1;
begin
  loop
    dbms_output.put_line(k);
    exit when k=10;
    k:=k+1;
  end loop;
end;
--2.2.2 結構化迴圈語句 while輸出1-10
declare
  k number default 1;
begin
  while k<=10 loop
    dbms_output.put_line(k);
    k:=k+1;
  end loop;
end;
--2.2.3 結構化迴圈語句 for輸出1-10
--1..10 是集合 可稱為游標
declare
  k number default 1;
begin
  for k in 1..10 loop
    dbms_output.put_line(k);
  end loop;
end;

--2.2.4 結構化迴圈語句 for輸出1-10
-- 使用游標列印20號部門的員工姓名和工作 方法一
declare
  cursor cur is select ename,job from emp where deptno=20;
begin
  for k in cur loop
    dbms_output.put_line(k.ename||'-'||k.job);
  end loop;
end;
-- 使用游標列印20號部門的員工姓名和工作 方法二
declare
  pname emp.ename%type;
  pjob emp.job%type;
  cursor cur is select ename,job from emp where deptno=20;
begin
  open cur;
  loop
    fetch cur into pname,pjob;
    exit when cur%notfound;
    dbms_output.put_line(pname||'-'||pjob);
  end loop;
  close cur;
end;
-- 使用游標對20號部門的員工漲工資
declare
  k number;
  cursor cur is select empno from emp where deptno=20;
begin
  for k in cur loop
    update emp set sal=sal+100 where empno=k.empno;
  end loop;
end;
select * from emp;
-- 例外(基本異常)
declare
  pname emp.ename%type;
  m number;
begin
  m:='abc';
  select ename into pname from emp where deptno=20;
  dbms_output.put_line(pname);
  select ename into pname from emp where deptno=40;
  dbms_output.put_line(pname);
exception
  when no_data_found then
      dbms_output.put_line('沒有記錄');
  when too_many_rows then
      dbms_output.put_line('太多記錄');
  when value_error then
      dbms_output.put_line('類型轉換異常');
  when others then
      dbms_output.put_line('其他異常');
end;
-- 例外(自定義異常)
declare
  not_found exception;
  pname emp.ename%type;
  cursor cur is select ename from emp where deptno=40;
begin
  open cur;
  fetch cur into pname;
  if cur%notfound then
    raise not_found;
  end if;
  close cur;
exception
  when not_found then
      dbms_output.put_line('游標中沒發現記錄');
  when no_data_found then
      dbms_output.put_line('沒有記錄');
  when too_many_rows then
      dbms_output.put_line('太多記錄');
  when value_error then
      dbms_output.put_line('類型轉換異常');
  when others then
      dbms_output.put_line('其他異常');
end;
-- 3 存儲過程(感覺包含了PL/SQL所有)
--3.1 根據員工編號得到員工的年薪
create or replace procedure getYearSal(eno in number,
yearsal out number)
as --聲明變數
begin --過程化語句
      select sal*12+nvl(comm,0) into yearsal from emp
      where empno=eno;
end;
--訪問單值輸出的存儲過程
declare
      yearsal number;
begin
  getYearSal(7499,yearsal);
  dbms_output.put_line('年薪'||yearsal);
end;
--3.2 給某員工漲工資(列印漲前和漲後工資)
create or replace procedure updateSal(eno in number,
plussal in number)
is --聲明變數
   oldsal number;
   newsal number;
begin --過程化語句
      --漲前
      select sal into oldsal from emp where empno=eno;
      dbms_output.put_line('漲前的工資:'||oldsal);
      --漲工資
      update emp set sal=sal+plussal where empno=eno;
      commit;
      --漲後
      select sal into newsal from emp where empno=eno;
      dbms_output.put_line('漲後的工資:'||newsal);
end;
--訪問存儲過程
--方法一
declare
begin
  updateSal(7499,888.88);
end;
--方法二 訪問只有輸入的存儲過程也可以使用call
call updateSal(7499,888.88);
--3.3 得到某部門所有員工的信息
create or replace procedure getEmps(dno in number,
emps out sys_refcursor)
is --聲明變數

begin --過程化語句
      open emps for select * from emp where deptno=dno;   
end;
--訪問存儲過程
-- 訪問輸出參數為游標的存儲過程
declare
  emps sys_refcursor;
  prow emp%rowtype;
begin
  getEmps(20,emps);
  --打開游標在存儲過程中了
  loop
    fetch emps into prow;
    exit when emps%notfound;
    dbms_output.put_line(prow.empno||'-'||prow.job||'-'||prow.sal||'-'||prow.ename);
  end loop;
  close emps;
end;
--對比普通游標的使用,不能使用for迴圈
declare
  cursor emps is select * from emp where deptno=20;
  k number;
begin
  for k in emps loop
    dbms_output.put_line(k.empno||'-'||k.job||'-'||k.sal||'-'||k.ename);
  end loop;
end;


-- 4 觸發器
-- 星期三不能插入數據
create or replace trigger notInsertPerson
before
insert
on emp
for each row
declare
 weekend varchar2(20);
begin
  select to_char(sysdate,'day') into weekend from dual;
  if trim(weekend)=('wednesday') then
    raise_application_error(-20003,'不能在周三辦理入職');
  end if;
  
end;
select to_char(sysdate,'d') from dual;

insert into emp (empno,ename,job,mgr,hiredate,sal,comm,deptno)
VALUES(8943,'MLDN','MANAGER',7369,sysdate,2000,500,40);

/*綜合練習:每一位雇員都要根據其收入上繳所得稅,假設所得稅的上繳原則為:
--2000以下上繳3%、
--2000 ~ 5000上繳8%、5000以上上繳10%,現在要求建立一張新的數據表,
--可以記錄出雇員的編號、姓名、工資、佣金、上繳所得稅數據,
--並且在每次修改雇員表中sal和comm欄位後可以自動更新記錄。*/
  

 


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

-Advertisement-
Play Games
更多相關文章
  • VMware下載與安裝 一、虛擬機的下載 1.進入VMware官網,點擊左側導航欄中的下載,再點擊圖中標記的Workstation Pro,如下圖所示。 2.根據操作系統選擇合適的產品,在這裡以Windows系統為例,點擊轉至下載,如下圖所示。 3.在1處可以選擇版本,預設為最新版本。選擇好版本後點 ...
  • 我們用的是jdk1.8.0_171 1、從官網下載JDK 2、創建java目錄 $ sudo mkdir /usr/lib/java 3、將下載的jdk移入該文件夾下麵 $ sudo mv /home/holder/下載/jdk-8u171-linux-x64.tar.gz /usr/lib/jav ...
  • 有時我想玩玩蘋果系統,但自己有沒有mac,只能在虛擬機上裝一個蘋果玩玩,但又由於某些原因虛擬機軟體VMware不支持安裝蘋果系統,還在有大佬出於不明目的,在網上散佈了適用於Windows版本的VMware解鎖安裝Mac OS的補丁( Unlocker),顯然我起碼需要先搞到二個東西,1.Unlock ...
  • 層級目錄結構的Makefile編寫方法. 層級目錄結構的Makefile編寫方法.0.前言1.如何編譯整個工程2.過濾每層不需要編譯的目錄3將所有輸出文件定向輸出. 層級目錄結構的Makefile編寫方法.0.前言1.如何編譯整個工程2.過濾每層不需要編譯的目錄3將所有輸出文件定向輸出. 層級目錄結 ...
  • 索引: 開源Spring解決方案--lm.solution 參看代碼 GitHub: jdk.txt 一、Linux (DeepinOS) 環境 1.官網下載 2.創建目錄 3.提取文件 4.打開.profile文件 5.在.profile文件追加環境變數 6.生效環境變數 7.移除多餘 8.重啟L ...
  • 一、Windows Server 2008 R2 介紹 1、Windows Server 2008 R2 基本概念 2、Windows Server 2008 R2 家族系列 二、VMware虛擬機安裝 Windows Server 2008 R2 1、準備Windows Server 2008 R ...
  • 官網配置步驟:https://docs.docker.com/install/linux/docker-ce/ubuntu/#install-docker-ce-1 安裝Docker社區版倉庫 Update the apt package index: $ sudo apt-get update $ ...
  • 原文地址:https://www.cnblogs.com/memento/p/9148721.html準備說明:jdk:jdk-8u161-windows-x64.exehadoop:hadoop-2.7.5.tar.gzOS:Window 10一、JDK 安裝配置詳見:JDK 環境配置(圖文)二、... ...
一周排行
    -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.數據驗證 在伺服器端進行嚴格的數據驗證,確保接收到的數據符合預期格 ...