一区二区三区在线-一区二区三区亚洲视频-一区二区三区亚洲-一区二区三区午夜-一区二区三区四区在线视频-一区二区三区四区在线免费观看

服務器之家:專注于服務器技術及軟件下載分享
分類導航

Mysql|Sql Server|Oracle|Redis|MongoDB|PostgreSQL|Sqlite|DB2|mariadb|Access|數據庫技術|

服務器之家 - 數據庫 - Oracle - Oracle中 關于數據庫存儲過程和存儲函數的使用

Oracle中 關于數據庫存儲過程和存儲函數的使用

2019-11-21 15:26Oracle教程網 Oracle

本篇文章,小編將為大家介紹,在Oracle中 關于數據庫存儲過程和存儲函數的使用,有需要的朋友可以參考一下

存儲過程和存儲函數指存儲在數據庫中供所有用戶程序調用的子程序叫存儲過程、存儲函數
存儲過程沒有返回值。存儲函數有返回值

  創建存儲過程
      用CREATE PROCEDURE命令建立存儲過程和存儲函數。

      語法:
create [or replace] PROCEDURE過程名(參數列表) 
AS 
        PLSQL子程序體;

  存儲過程示例:為指定的職工在原工資的基礎上長10%的工資
 
/*
為指定的職工在原工資的基礎上長10%的工資,并打印工資前和工資后的工資
*/
SQL> create or replace procedure raiseSalary(empid in number)
    as
    pSal emp.sal%type;--保存員工當前 工資
    begin
--查詢該員工的工資
    select sal into pSal from emp where empno=empid;
--給該員工漲工資
    update emp set sal = sal*1.1 where empno=empid;
--打印漲工資前后的工資
    dbms_output.put_line('員工號:' || empid || '漲工資前
   ' || psal || '漲工資后' || psal*1.1);
    end;
 1  /

Procedure created
--存儲過程調用
--方法一
SQL> set serveroutput on
SQL> exec raisesalary(7369);

員工號:7369漲工資前
800漲工資后880

方法二
    set serveroutput on
begin
 raisesalary(7369);
end;
/

PL/SQL procedure successfully completed

 
      存儲函數
      函數(Function)為一命名的存儲程序,可帶參數,并返回一計算值。函數和過程的結構類似,但必須有一個RETURN子句,用于返回函數值。函數說明要指定函數名、結果值的類型,以及參數類型等。

     建立存儲函數的語法:

CREATE [OR REPLACE] FUNCTION函數名(參數列表)
RETURN 函數值類型
AS
PLSQL子程序體;

 
示例:查詢某職工的年收入。

SQL> /**/
    /* 
    查詢某職工的總收入
    */
    create or replace function queryEmpSalary(empid in number)
    return number
   as
    pSal number; --定義變量保存員工的工資
    pComm number; --定義變量保存員工的獎金
   begin
   select sal,comm into psal,pcomm from emp where empno = empid;
   return psal*12+nvl(pcomm,0);
   end;
   /

Function created

   l   函數的調用

SQL> declare
    v_sal number;
    begin
    v_sal:=queryEmpSalary(7934);
    dbms_output.put_line('salary is:'|| v_sal);
    end;
    /

salary is:15600

PL/SQL procedure successfully completed

SQL> begin
    dbms_output.put_line('salary is:'|| queryEmpSalary(7934));
    end;
    /

salary is:15600

PL/SQL procedure successfully completed

 
       觸發器
       數據庫觸發器是一個與表相關聯的、存儲的PL/SQL程序。每當一個特定的數據操作語句(Insert,update,delete)在指定的表上發出時,Oracle自動地執行觸發器中定義的語句序列。

       觸發器的類型
         語句級觸發器
        在指定的操作語句操作之前或之后執行一次,不管這條語句影響了多少行。

         行級觸發器(FOR EACH ROW)
        觸發語句作用的每一條記錄都被觸發。在行級觸發器中使用old和new偽記錄變量,識別值的狀態。

      創建觸發器
CREATE  [or REPLACE] TRIGGER 觸發器名
   {BEFORE | AFTER}
   {DELETE | INSERT | UPDATE [OF列名]}
   ON  表名
   [FOR EACH ROW [WHEN(條件) ] ]
   PLSQL 塊

       示例1:限制非工作時間向數據庫插入數據
SQL> create or replace
    trigger securityEmp
    before insert on emp
    declare
    begin
    if to_char(sysdate,'day')in('星期四','星期六','星期日')
    or to_number(to_char(sysdate,'hh24'))not between 8 and 18 then
    raise_application_error(-20001,'不能在非工作時間插入數據。');
    end if;
   end;
   /

Trigger created

觸發語句與偽記錄變量的值

觸發語句

:old

:new

Insert

所有字段都是空(null)

將要插入的數據

Update

更新以前該行的值

更新后的值

delete

刪除以前該行的值

所有字段都是空(null)

示例2:確認數據(檢查emp表中sal的修改值不低于原值)
SQL> create or replace trigger checkSal
    before update of sal on emp
    for each row
    declare
    begin
    if :new.sal<:old.sal then
    raise_application_error(-20001,'更新后的薪水比更新前小');
    end if;
    end;
   /

Trigger created
運行后結果:
SQL> update emp set sal=260 where empno=7499;

update emp set sal=260 where empno=7499

ORA-20001: 更新后的薪水比更新前小
ORA-06512: 在 "SCOTT.CHECKSAL", line 4
ORA-04088: 觸發器 'SCOTT.CHECKSAL'執行過程中出錯

       觸發器總結
      觸發器可用于
•         數據確認 
•         實施復雜的安全性檢查
•         做審計,跟蹤表上所做的數據操作等

      查詢觸發器、過程及函數
•         Select * from user_triggers;
•         Select * from user_source;

延伸 · 閱讀

精彩推薦
主站蜘蛛池模板: 日本乱人伦中文在线播放 | 精品在线播放 | 九九九国产在线 | jzzjlzz亚洲乱熟在线播放 | 波多野结衣之高校教师 | 色在线影院 | 女被男啪到哭 | 亚洲欧美自偷自拍另类小说 | 欧美怡红院视频一区二区三区 | 国产精品模特hd在线 | 四虎永久在线精品国产馆v视影院 | 91精品综合国产在线观看 | 6080伦理久久精品亚洲 | 国产精品永久免费视频 | 日本视频在线观看 | 1769在线观看 | 美女伊人网 | 亚洲 欧美 国产 综合 在线 | 关晓彤一级做a爰片性色毛片 | 白发在线视频播放观看免费 | 免费的强动漫人物的 | 日韩一区二区三区免费 | 成年男人永久免费看片 | 欧美四区 | 欧美一级鲁丝片免费看 | 风间由美在线播放 | 性姿势女人嗷嗷叫图片 | www.毛片网站 | 黄网在线观看免费网站台湾swag | 欧美成人aa | 青青青青久久国产片免费精品 | 97色蜜桃 | 亚洲 欧美 日韩 综合 | 亚洲精品电影天堂网 | 欧美艳星kagney1ynn | 国产精品刺激好大好爽视频 | 爱情岛永久成人免费网站 | 91久操| 国产第7页| 久久毛片视频 | 日韩欧美在线观看综合网另类 |