Oracle資料建立虛擬列和復合觸發器的方法

2022-09-24 10:36:10 字數 2741 閱讀 7669

一、虛擬列

oralce 的虛擬列解決了以前很多需要使用觸發器或者需要通過**進行計算統計才能產生的資料資訊。以前每次對其他的列進行統計,產生新列的時候都是採用在select 語句中通過統計計算增加新列的方法,執行效率很低,而且由於使查詢sql語句變得冗長、複雜很容易出錯。嚴重的降低了開發效率和程式的執行效率。oralce虛擬列的引入解決了這個問題。

oralce 的虛擬列也有一些問題。不能使用insert into talbe_name values ().語句,在向含有虛擬列的表中新增資料時,要求insert語句的必須把新增的表的列名寫出來。insert into table_name (list1,list2,...listend)列名中不能出現虛擬列名,否則會提示錯誤。

建立虛擬列的例項如下:

create table sales (

sales_id number,

cust_id number,

sales_amt number,

sale_category varchar2(6) /* 虛擬列名及資料型別*/

generated always as (

case when sales_amt <= 10000 then 'lphrwpow'

when sales_amt > 10000 and sales_amt <= 100000 then 'medium'

when sales_amt > 100000 and sales_amt <= 1000000 then 'high' else 'ultra' end

) virtual /*虛擬列值函式內容*/

);虛擬列被指定為「generated always as」,這意味著,列值在執行時生成,而非作為表的一部分進行儲存。該子句的後面是在詳細的 case 語句中計算值的方法。最後,指定了「virtual」以加強這是乙個虛擬列的事實。

二、復合觸發器

復合觸發器實際上是作為乙個整體定義的四個不同的觸發器。例如,update 復合觸發器將 before statement、before row、after statement 和 after row 都合併到乙個復合觸發器中。這是乙個單一**片段,因此您程式設計客棧可以像任何其他單一 pl/sql **一樣來傳遞變數。

下面我們來引用乙個示例,以幫助說明。注:建立了乙個與sales表相同的表sales_log.

create or replace trigger tri_sales

for update of sales_amt on sawww.cppcns.comles

compound trigger

type ty_sales_log is table of sales_log%rowtype

index by pls_integer;

coll_sales_log ty_sales_log;

ctr pls_integer:=0;

before statement is

begin

dbms_output.put_line('in before statement');

end before statement;

before each row is

begin

dbms_output.程式設計客棧put_line('in before each row');

end before each row;

after each row is

begin

ctr := ctr+1;

dbms_output.put_line('in after each row.sales_amt'||:new.sales_amt);

coll_sales_log(ctr).sales_id := :old.sales_id;

coll_sales_log(ctr).cust_id := :old.cust_id;

coll_sales_log(ctr).sales_amt := :new.sales_amt;

end after each row;

after statement is

程式設計客棧begin

dbms_output.put_line('in after statement');

forall counter in 1..coll_sales_log.count()

insert into sales_log(sales_id,cust_id,sales_amt)

values (coll_sales_log(counter).sales_id,coll_sales_log(counter).cust_id,coll_sales_log(counter).sales_amt);

end after statement; /* 不能使用insert into sales_log values

(coll_sales_log(counter));新增*/

end tri_sales;

上面例項包含了4個不同觸發形式,它們之間是獨立的執行的。

需要注意的是:sales_log 表中有虛擬列是不能使用insert into sales_log  values  (coll_sales_log(counter));直接進行新增操作的,我們需要標明表中的列名。否則會出現錯誤。

關於oracle資料建立虛擬列和復合觸發器的方法就介紹到這裡了,希望本次的介紹能夠對您有所收穫!

本文標題: oracle資料建立虛擬列和復合觸發器的方法

本文位址:

mysql 基於虛擬列建立函式索引

1.建立虛擬列 alter table otc transaction complete add column create time index datetime generated always as date format create time,y m d 上面這條語句解釋 執行上面這語句後...

Oracle中建立自動標識列

在oracle中建立標識列,不同於sql server中的是,sqlserver中叫自動標識列entity,而oracle中叫序列 sequence 在oracle中建立序列 sequence 分為如下幾步 建立乙個測試表 create tabletb test useridnumber prima...

Oracle中建立自動標識列

1 建立測試表admin create table admin id varchar2 20 name varchar2 10 2 建立乙個序列 sequence 針對主鍵id create sequence innerid 建立乙個序列 minvalue 1 該序列的最小值是1 maxvalue ...