一、虛擬列
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 ...