自拍偷在线精品自拍偷,亚洲欧美中文日韩v在线观看不卡

Oracle數(shù)據(jù)庫如何創(chuàng)建虛擬列和復(fù)合觸發(fā)器

數(shù)據(jù)庫 Oracle
Oracle的虛擬列解決了很多需要使用觸發(fā)器或者需要通過代碼進(jìn)行計(jì)算統(tǒng)計(jì)產(chǎn)生數(shù)據(jù)信息的問題。而復(fù)合觸發(fā)器實(shí)際上是作為一個(gè)整體定義的四個(gè)不同的觸發(fā)器來執(zhí)行操作。

本文我們主要介紹Oracle數(shù)據(jù)庫虛擬列復(fù)合觸發(fā)器方面的相關(guān)知識(shí),包括虛擬列和復(fù)合觸發(fā)器的創(chuàng)建等,并給出了創(chuàng)建示例,接下來就讓我們來一起了解這一過程吧。

一、虛擬列 

Oralce 的虛擬列解決了以前很多需要使用觸發(fā)器或者需要通過代碼進(jìn)行計(jì)算統(tǒng)計(jì)才能產(chǎn)生的數(shù)據(jù)信息。以前每次對(duì)其他的列進(jìn)行統(tǒng)計(jì),產(chǎn)生新列的時(shí)候都是采用在select 語句中通過統(tǒng)計(jì)計(jì)算增加新列的方法,執(zhí)行效率很低,而且由于使查詢SQL語句變得冗長、復(fù)雜很容易出錯(cuò)。嚴(yán)重的降低了開發(fā)效率和程序的執(zhí)行效率。Oralce虛擬列的引入解決了這個(gè)問題。

Oralce 的虛擬列也有一些問題。不能使用insert into talbe_name values ().語句,在向含有虛擬列的表中添加數(shù)據(jù)時(shí),要求insert語句的必須把添加的表的列名寫出來。insert into table_name (list1,list2,...listend)列名中不能出現(xiàn)虛擬列名,否則會(huì)提示錯(cuò)誤。

創(chuàng)建虛擬列的實(shí)例如下:

 

  1. create table sales  
  2.  
  3. (   
  4.  
  5. sales_id number,  
  6.  
  7. cust_id number,   
  8.  
  9. sales_amt number,   
  10.  
  11. sale_category varchar2(6) /* 虛擬列名及數(shù)據(jù)類型*/  
  12.  
  13. generated always as  
  14.  
  15. (  
  16.  
  17. case  when sales_amt <= 10000 then 'LOW'   
  18.  
  19. when sales_amt > 10000 and sales_amt <= 100000 then 'MEDIUM'   
  20.  
  21. when sales_amt > 100000 and sales_amt <= 1000000 then 'HIGH'  else 'ULTRA'  end   
  22.  
  23. ) virtual    /*虛擬列值函數(shù)內(nèi)容*/  
  24.  
  25. ); 

 

虛擬列被指定為“generated always as”,這意味著,列值在運(yùn)行時(shí)生成,而非作為表的一部分進(jìn)行存儲(chǔ)。該子句的后面是在詳細(xì)的 CASE 語句中計(jì)算值的方法。最后,指定了“virtual”以加強(qiáng)這是一個(gè)虛擬列的事實(shí)。

二、復(fù)合觸發(fā)器

復(fù)合觸發(fā)器實(shí)際上是作為一個(gè)整體定義的四個(gè)不同的觸發(fā)器。例如,UPDATE 復(fù)合觸發(fā)器將 before statement、before row、after statement 和 after row 都合并到一個(gè)復(fù)合觸發(fā)器中。這是一個(gè)單一代碼片段,因此您可以像任何其他單一 PL/SQL 代碼一樣來傳遞變量。

下面我們來引用一個(gè)示例,以幫助說明。注:創(chuàng)建了一個(gè)與sales表相同的表sales_log.

 

  1. create or replace trigger tri_sales  
  2.  
  3. for update of sales_amt on SALES  
  4.  
  5. compound trigger  
  6.  
  7. type ty_sales_log is table of sales_log%rowtype  
  8.  
  9. index by pls_integer;  
  10.  
  11. coll_sales_log ty_sales_log;  
  12.  
  13. ctr pls_integer:=0;  
  14.  
  15. before statement is  
  16.  
  17. begin  
  18.  
  19. dbms_output.put_line('in before statement');  
  20.  
  21. end before statement;  
  22.  
  23. before each row is  
  24.  
  25. begin  
  26.  
  27. dbms_output.put_line('in before each row');  
  28.  
  29. end before each row;  
  30.  
  31. after each row is  
  32.  
  33. begin  
  34.  
  35. ctr :ctr+1;  
  36.  
  37. dbms_output.put_line('in after each row.sales_amt'||:new.sales_amt);  
  38.  
  39. coll_sales_log(ctr).sales_id := :old.sales_id;  
  40.  
  41. coll_sales_log(ctr).cust_id := :old.cust_id;  
  42.  
  43. coll_sales_log(ctr).sales_amt := :new.sales_amt;  
  44.  
  45. end  after each row;  
  46.  
  47. after statement is  
  48.  
  49. begin  
  50.  
  51. dbms_output.put_line('in after statement');  
  52.  
  53. forall counter in 1..coll_sales_log.count()  
  54.  
  55. insert into sales_log(sales_id,cust_id,sales_amt)    
  56.  
  57. values (coll_sales_log(counter).sales_id,coll_sales_log(counter).cust_id,coll_sales_log(counter).sales_amt);  
  58.  
  59. end after statement;             /* 不能使用Insert into sales_log  values    
  60.  
  61. (coll_sales_log(counter));添加*/  
  62.  
  63. end tri_sales; 

 

上面實(shí)例包含了4個(gè)不同觸發(fā)形式,它們之間是獨(dú)立的執(zhí)行的。

需要注意的是:sales_log 表中有虛擬列是不能使用Insert into sales_log  values  (coll_sales_log(counter));直接進(jìn)行添加操作的,我們需要標(biāo)明表中的列名。否則會(huì)出現(xiàn)錯(cuò)誤。

關(guān)于Oracle數(shù)據(jù)庫虛擬列和復(fù)合觸發(fā)器的知識(shí)就介紹到這里了,如果您想了解更多Oracle數(shù)據(jù)庫的知識(shí),可以到這里看一下:http://database.51cto.com/oracle/,相信一定可以給您帶來收獲的!

【編輯推薦】

  1. Oracle數(shù)據(jù)庫賬號(hào)頻繁被鎖定的原因排查
  2. Oracle數(shù)據(jù)庫中序列(SEQUENCE)的用法詳解
  3. 虛擬機(jī)安裝Oracle錯(cuò)誤ORA-12514的解決方案
  4. Oracle數(shù)據(jù)庫如何創(chuàng)建DB Link操作遠(yuǎn)程數(shù)據(jù)庫
  5. Oracle數(shù)據(jù)庫的物理存儲(chǔ)結(jié)構(gòu)之?dāng)?shù)據(jù)庫控制文件詳解
責(zé)任編輯:趙鵬 來源: CSDN博客
相關(guān)推薦

2011-03-03 14:04:48

Oracle數(shù)據(jù)庫觸發(fā)器

2011-05-20 14:06:25

Oracle觸發(fā)器

2010-04-23 12:50:46

Oracle觸發(fā)器

2011-08-10 16:46:01

DB2數(shù)據(jù)庫觸發(fā)器

2019-04-30 15:28:46

數(shù)據(jù)庫存儲(chǔ)過程觸發(fā)器

2015-07-23 17:02:55

oracle創(chuàng)建數(shù)據(jù)庫

2010-09-13 16:46:10

SQL Server觸

2009-11-18 13:15:06

Oracle觸發(fā)器

2011-04-14 13:54:22

Oracle觸發(fā)器

2011-05-19 14:29:49

Oracle觸發(fā)器語法

2019-10-22 07:50:45

SqlServer數(shù)據(jù)庫觸發(fā)器

2024-01-19 09:37:19

MySQL數(shù)據(jù)庫

2011-04-02 15:05:23

觸發(fā)器數(shù)據(jù)庫

2011-08-04 13:31:50

數(shù)據(jù)庫記錄更改日志觸發(fā)器

2011-08-09 14:54:01

OracleDATABASE LI

2010-04-15 15:32:59

Oracle操作日志

2010-06-30 09:36:25

SQL Server

2011-04-01 16:35:09

SQL Server數(shù)觸發(fā)器

2023-11-16 17:12:33

數(shù)據(jù)庫oracle

2010-10-11 14:52:43

Mysql觸發(fā)器
點(diǎn)贊
收藏

51CTO技術(shù)棧公眾號(hào)