注意,為了能在終端看見put_line的輸出,還需要先開啟
set serveroutput on
?
--用來(lái)測(cè)試的表create table test_tri(
a1 int,
a2 int
)
tablespace test
-----行級(jí)insert觸發(fā)器-----
1) 插入的一行新數(shù)據(jù)保存在:new
2) insert觸發(fā)器沒有:old值3) 對(duì):new的修改,只能定義在before類型的觸發(fā)器中---觸發(fā)器語(yǔ)法---create or replace trigger 名稱
[after|before] [delete|update|insert]
[of 列名] [on 表名]
[referencing new as 新行別名 old as 舊行別名]
[for each row] [when(條件)]
declare
....
begin
...
exception
....
end; --定義create or replace trigger test_before_insert
before insert on test_tri
for each row
when(new.a2 is null)begin
?? ?dbms_output.put_line('insert row original: a1=' || :new.a1 || ' a2=' || :new.a2);
?? ?:new.a2 := :new.a1 * 2;? ?
end;
/
create or replace trigger test_after_insert
after insert on test_tri
for each row
begin
?? ?dbms_output.put_line('insert row actual: a1=' || :new.a1 || ' a2=' || :new.a2);? ?
end;
/
--測(cè)試SQL> insert into test_tri(a1) values(1);
insert row original: a1=1
a2=insert row actual: a1=1 a2=2
SQL> insert into test_tri values(2,3);
insert row actual: a1=2 a2=3
SQL> select * from test_tri;
??????? A1???????? A2
---------- ----------
???????? 1?????????
2(由觸發(fā)器生成的值)???????? 2????????? 3
-----DDL觸發(fā)器-----
--任何create語(yǔ)句都會(huì)觸發(fā)這個(gè)語(yǔ)句create or replace trigger test_ddl_trigger
before create on schema
begin
??? dbms_output.put_line( 'DDL Trigger' );
??? insert into test_tri values(9,9);
end;
Oracle建好后,tnsnames和listener中自動(dòng)就帶有如下內(nèi)容,這里咱們就來(lái)解釋一下這些東西是干什么用的
----TNSNAMES.ora----
EXTPROC_CONNECTION_DATA =
? (DESCRIPTION =
??? (ADDRESS_LIST =
????? (ADDRESS = (PROTOCOL =
IPC)(KEY =
EXTPROC1))
??? )
??? (CONNECT_DATA =
????? (SID =
PLSExtProc)
????? (PRESENTATION = RO)
??? )
? )
----LISTENER.ora----SID_LIST_LISTENER =
? (SID_LIST =
??? (SID_DESC =
????? (SID_NAME =
PLSExtProc)
????? (ORACLE_HOME = /opt/oracle/10gR2)
????? (PROGRAM =
extproc)
??? )
? )
LISTENER =
? (DESCRIPTION_LIST =
??? (DESCRIPTION =
????? (ADDRESS = (PROTOCOL =
IPC)(KEY =
EXTPROC1))
????? (ADDRESS = (PROTOCOL = TCP)(HOST = dcm)(PORT = 1521))
??? )
? )
IPC - Inner Process CommunicationWhen a process is on the same machine as the server, use the IPC protocol for connectivity instead of TCP. Inner Process Communication on the same machine does not have the overhead of packet building and deciphering that TCP has.
I've seen a SQL job that runs in 10 minutes using TCP on a local machine run as fast as one minute using an IPC connection. The difference in time is most dramatic when the Oracle process has to send and/or receive large amounts of data to and from the database.
For example, a SQL*Plus connection that counts the number of rows of some tables will run about the same amount of time, whether the database connection is made via IPC or TCP. But if the SQL*Plus connection spools much data to a file, the IPC connection will often be much faster -- depending on the data transmitted and the machine workload on the TCP stack.
For how to configure it:
1. you should add one IPC line in the LISTENER.ORA
2. You should also add one IPC line in the TNSNAMES.ORA
PLSExtPro - PL/Sql External Procdure默認(rèn)安裝時(shí),會(huì)安裝一個(gè)PL/SQL外部程序(
extproc--這是程序名)條目在listener.ora中,是oracle為調(diào)用外部程序默認(rèn)配置的監(jiān)聽,它的名字(也就是SID)通常是ExtProc或
PLSExtProc。
但一般不會(huì)使用它,可以直接從listener.ora中將這項(xiàng)移除,因?yàn)閷?duì)ExtProc已經(jīng)有多種攻擊手段了,在不使用外部程序時(shí),Oracle也是建議刪除的。
extproc的作用就是在pl/sql中調(diào)用
外部語(yǔ)句,如c,java寫的過(guò)程。
現(xiàn)在,Oracle已經(jīng)全面支持JAVA了,這東西也就過(guò)時(shí)了,之所以繼續(xù)保留是考慮到兼容以前老版本的數(shù)據(jù)庫(kù)實(shí)例。
[oracle@dcm bin]$ extproc
Oracle Corporation --- TUESDAY?? JAN 05 2010 21:58:23.878
Heterogeneous Agent Release 10.2.0.1.0 - Production
--登錄sys用戶,創(chuàng)建一個(gè)測(cè)試用戶,權(quán)限可以給大點(diǎn)
SQL> create user test identified by xxxxx;
SQL> grant connect to test;
SQL> grant resource to test;
SQL> grant dba to test;
--登錄test用戶,開始測(cè)試--建個(gè)測(cè)試表create table test_table(id int, time timestamp);
--創(chuàng)建Jobbegin
dbms_scheduler.create_job(
?? ?job_name => 'test_job',
?? ?job_type => 'PLSQL_BLOCK',
?? ?job_action => 'insert into test_table
????????????????? (select
nvl(max(id),0)+1, systimestamp from test_table, dual);',
--nvl函數(shù)同SQLServer的isnull函數(shù)?? ?start_date => null,
--一激活,就開始?? ?repeat_interval => '
FREQ=SECONDLY;INTERVAL=10');
end;
FREQ用來(lái)指定間隔的時(shí)間周期,可選參數(shù)有:YEARLY,MONTHLY,WEEKLY,DAILY,HOURLY,MINUTELY,SECONDLY。--光創(chuàng)建沒用,還需要激活;也可以在創(chuàng)建時(shí),直接把enable屬性設(shè)置為true(enabled => true)select job_name, enabled, run_count from user_scheduler_jobs;
JOB_NAME?????????????????????? ENABL? RUN_COUNT
------------------------------ ----- ----------
TEST_JOB?????????????????????? FALSE????????? 0begin
dbms_scheduler.enable('test_job');
end;
--查看效果select id, to_char(time,'HH24:MI:SS:FF3') from test_table;
?
????? ID? TO_CHAR(TIME,'HH24
---------- ------------------
???????? 1 16:13:29:542
???????? 2 16:13:39:506
???????? 3 16:13:49:109
???????? 4 16:13:59:097
???????? 5 16:14:09:109
???????? 6 16:14:19:103
???????? 7 16:14:29:101
???????? 8 16:14:39:099
???????? 9 16:14:49:105
??????? 10 16:14:59:100--停止任務(wù)begin
dbms_scheduler.disable('test_job');
end;
--刪除任務(wù)begin
dbms_scheduler.drop_job('test_job');
end;
一致和并發(fā)是對(duì)立的,需要根據(jù)應(yīng)用,選擇權(quán)宜之計(jì)
數(shù)據(jù)不一致的現(xiàn)象
---事務(wù)內(nèi)單SQL的情況---
1.
臟讀-Dirty Read:本事務(wù)讀取了其它事務(wù)尚未提交的修改數(shù)據(jù)
例子:讀了不該讀的
1:00 x=1
1:01 A用戶 Update x=2(但未commit)
1:02 B用戶 Select x --> x=2
合理的情況是x仍然等于1---事務(wù)內(nèi)多SQL的情況(典型的如,先查再改)---2.
不可重復(fù)讀-Non Repeatable Read
例子1:自相矛盾
1:00 x=1 y=2
1:01 B用戶 Select x,y --> x=1 y=2
1:02 A用戶 Update x=2; Commit;
1:03 B用戶 Select x+y --> x+y=4
首先這個(gè)結(jié)果從單條SQL的角度看,是沒有問(wèn)題的。但是,如果把B的兩次查詢看作一個(gè)整體(事務(wù)),那么合理的情況應(yīng)該是
? x+y仍然等于3
? 或者B再進(jìn)行一次事務(wù),得出 x=2 y=2 x+y=4 的結(jié)果例子2:更新丟失
1:00 x=1
1:01 B用戶 Select x --> x=1
1:02 A用戶 Select x --> x=1
1:03 A用戶 Update x=2; Commit;
1:04 B用戶 Update x=3; Commit;
同樣,從單條SQL來(lái)講,沒有任何問(wèn)題。
但是從邏輯的合理性講,一般的更新操作都是先查再改,換言之
? A真正想做的是Update x from 1 to 2
? B真正想做的是Update x from 1 to 3
但最終卻造成了在B不知情的情況下,把B的初衷改為了Update x from 2 to 33.
幻影讀-Phantom Read
例子:讀到了未來(lái)
1:00 X1=1 X2=2
1:01 B用戶 Select Xi --> X1=1 X2=2
1:02 A用戶 Insert X3=3; Commit;
1:03 B用戶 Select sum(Xi) --> re=6
其實(shí)道理和之前的不可重復(fù)讀相同,只不過(guò)是由Insert引起的罷了。
(甚至Delete也會(huì)引起類似的問(wèn)題,但好像學(xué)術(shù)界并沒有對(duì)Delete進(jìn)行討論)Isolation LevelRead Uncommitted:1,2,3都會(huì)發(fā)生
? Oracle中嚴(yán)格禁止臟讀
? 在SQL Server 7.0中,是可以選擇該級(jí)別的
Read Committed:發(fā)生2,3(Oracle的默認(rèn)級(jí)別)
Repeatable Read:發(fā)生3
Serializable:都不發(fā)生
Oracle的實(shí)現(xiàn)方式Read Committed:默認(rèn)就實(shí)現(xiàn)
Repeatable Read:
? 1. 悲觀鎖(select ... for update),影響并發(fā)
? 2. 樂觀鎖(update where 所有字段都作為條件),不影響并發(fā)
Serializable:
? alter session set isolation_level=serializable/read only
因?yàn)樵诳蛻裟枪ぷ鞑荒苌暇W(wǎng),決定辦一張3G上網(wǎng)卡(公司報(bào)銷),中午分別去電信和移動(dòng)了解了一下:
電信 960元? 7個(gè)月? 300小時(shí)/月
移動(dòng) 880元? 7個(gè)月? 15G/月 (目前推廣期,不限流量)
(都包含上網(wǎng)貓)
這樣算下來(lái)還是移動(dòng)的便宜,去搞了個(gè)移動(dòng)的。
關(guān)于移動(dòng)的上網(wǎng)貓,開始給我測(cè)試的時(shí)候用的是華為的、白色、流線型還挺好看。最終給我的是一個(gè)鳥公司的(敏訊),方形真難看,太大了,號(hào)稱還是升級(jí)版。
速度嘛,看網(wǎng)頁(yè)沒啥問(wèn)題,Outlook下郵件也很快,在線聽歌也沒問(wèn)題,在線電影就不去嘗試了,免得傷自尊,辦公足夠了。玩開心網(wǎng)有點(diǎn)卡。(我以前就用過(guò)聯(lián)通的CDMA-2G上網(wǎng),那叫一個(gè)慢呀)
這個(gè)帖子就是用3G網(wǎng)絡(luò)發(fā)的,哈哈。同時(shí)紀(jì)念一下2年后重回BMW做項(xiàng)目。
扇區(qū)(sector):最小的可尋址單元,512byte
磁道(track):一圈扇區(qū)
磁柱(cylinder):一摞磁道
每一磁道的扇區(qū)數(shù)是一樣的,但是存儲(chǔ)密度不同,外疏內(nèi)密。
為什么要外疏內(nèi)密?
角速度相同時(shí),線速度與半徑成正比:
硬盤為了提高其軸壽命,軸的轉(zhuǎn)動(dòng)速度是一定的。磁頭在硬盤上讀寫數(shù)據(jù)是近乎于圓弧的路線,而越往外,線速度就越快。為了保證讀取的準(zhǔn)確性只能減小外道的密度使磁頭讀取數(shù)據(jù)的時(shí)間間隔是相同的。
有待研究:早期的磁盤每個(gè)磁道上的扇區(qū)數(shù)目是一樣,顯然浪費(fèi)了外圈的容量,后來(lái)為了增大磁盤容量采用了新技術(shù),也就是說(shuō)越往外每磁道扇區(qū)數(shù)目越多。
字符設(shè)備:按照字符流的方式被有序訪問(wèn),不能隨機(jī)存取,如鍵盤、串口打印機(jī)、磁帶。
塊設(shè)備:能夠隨機(jī)(不需要按順序)訪問(wèn)固定大小數(shù)據(jù)片(chunks),采用塊緩沖技術(shù),如硬盤、軟盤、光驅(qū)。
裸設(shè)備:是一種沒有經(jīng)過(guò)格式化,不被Unix通過(guò)文件系統(tǒng)來(lái)讀取的特殊字符設(shè)備。
現(xiàn)在問(wèn)題來(lái)了,Oracle在使用裸設(shè)備時(shí)(如ASM、甚或表空間直接建在裸設(shè)備上),難道還是順序存???顯然不符合事實(shí)。
其實(shí),說(shuō)裸設(shè)備是字符設(shè)備,只是從操作系統(tǒng)的角度來(lái)說(shuō)的;從使用裸設(shè)備的應(yīng)用程序(如Oracle)的角度,還是塊設(shè)備,Oracle會(huì)去對(duì)磁盤進(jìn)行分塊管理。
邏輯卷是邏輯概念,可以包含多塊物理硬盤,實(shí)現(xiàn)了存儲(chǔ)跨盤功能,同時(shí)提供了數(shù)據(jù)復(fù)制機(jī)制,提供了數(shù)據(jù)安全保護(hù)機(jī)制。
--------------
裸設(shè)備適用于每次改動(dòng)數(shù)據(jù)較小、需大量并發(fā)交易,OLTP;
對(duì)于大規(guī)模順序讀寫,裸設(shè)備性能是最差的,所以對(duì)OLAP,應(yīng)使用塊設(shè)備或卷。
--創(chuàng)建一個(gè)分區(qū)表
create table scott.testpart
(
?? ?TEXTDATE?? VARCHAR2(8)
)
partition by range ( TEXTDATE )
(
?? ? partition p1 values less than ('20090201'),
??? ?partition
"p2" values less than ('20090301'),
--注意這里的雙引號(hào)?? ? partition pm values less than (MAXVALUE) ?
)
--插入一些數(shù)據(jù)(順便實(shí)踐一下雙層循環(huán))DECLARE
?? ?i int:=1;
?? ?j int:=1;
BEGIN
? ??? ?WHILE i<=3 LOOP
?? ??? ???? WHILE j<=3 LOOP
?? ??? ??? ???? insert into scott.testpart values (2009*10000+i*100+j);
???? ??? ??? ?? j:=j+1;
?? ??? ???? END LOOP;???? ??? ?
?? ???? i:=i+1;?? ?
?? ???? j:=1;
--注意要重置j,否則就回不到j(luò)循環(huán)里面了?? ???? END LOOP;
END;
--需要先進(jìn)行分析,否則num_rows列將為空analyze table scott.testpart compute statistics;
--查看各個(gè)分區(qū)的情況select table_name, partition_name, num_rows from DBA_TAB_PARTITIONS
where table_owner='SCOTT' and table_name='TESTPART';
TABLE_NAME??????????????? PARTITION_NAME?????????? NUM_ROWS
-------------------------- ------------------------------ ----------
TESTPART?????????????????????? P1?????????????????????????????????? ? ?? ?? ?? 3
TESTPART?????????????????????? PM????????????????????????????????? ? ? ?? ?? 3
TESTPART??????????????????????
p2?????????????????????????????????????? ? ? ? 3
注意p2因?yàn)榧恿艘?hào)仍然是小寫(但并不顯示引號(hào),這點(diǎn)比較討厭),沒加引號(hào)的會(huì)顯示為大寫--驗(yàn)證數(shù)據(jù)確實(shí)進(jìn)入了正確的分區(qū)select * from scott.testpart partition(p1);
TEXTDATE
--------
20090101
20090102
20090103
--創(chuàng)建p2時(shí)有引號(hào),使用p2時(shí)也就需要引號(hào)。--特別的,用一些第三方客戶端創(chuàng)建分區(qū)表時(shí),生成的SQL往往會(huì)自動(dòng)加上引號(hào),而查看DBA_TAB_PARTITIONS時(shí)又看不出來(lái),所以遇到下面的問(wèn)題,可以加個(gè)引號(hào)試試。select * from scott.testpart partition(p2);
ERROR at line 1:
ORA-02149: Specified partition
does not existselect * from scott.testpart partition(
"p2");
TEXTDATE
--------
20090201
20090202
20090203
--其它相關(guān)select * from scott.testpart;
truncate table scott.testpart;
drop table scott.testpart;
股票的面值,是股份公司在所發(fā)行的股票票面上標(biāo)明的票面金額,它以元/股為單位,其作用是用來(lái)表明每一張股票所包含的資本數(shù)額。
在我國(guó)上海和深圳證券交易所流通的股票的面值均為壹元,即每股一元。一般來(lái)說(shuō),股票的發(fā)行價(jià)格都會(huì)高于其面值。當(dāng)股票進(jìn)入流通市場(chǎng)后,股票的面值就與股票的價(jià)格沒有什么關(guān)系了。股民愛將股價(jià)炒到多高,它就有多高。
按股東權(quán)利分類,股票可分為普通股、優(yōu)先股和后配股。
在我國(guó)上交所與深交所上市的股票都是普通股。
股息紅利作為股東的投資收益,是以股份為單位計(jì)算的貨幣金額,如每股多少元。但在上市公司實(shí)施具體分派時(shí),其形式可以有四種:這就是現(xiàn)金股利、財(cái)產(chǎn)股利、負(fù)債股利和股票股利等。
滬深股市的上市公司進(jìn)行利潤(rùn)分配一般只采用股票紅利和現(xiàn)金紅利兩種,即統(tǒng)稱所說(shuō)的送紅股和派現(xiàn)金。
當(dāng)上市公司向股東分派股息時(shí),就要對(duì)股票進(jìn)行除息;當(dāng)上市公司向股東送紅股時(shí),就要對(duì)股票進(jìn)行除權(quán)。
我國(guó)上市公司中約有一半以上的股份為國(guó)家股,且其股權(quán)代表基本上都是上市公司的經(jīng)營(yíng)管理人員。由于切身利益的影響,經(jīng)營(yíng)管理人員基本上都贊同企業(yè)的發(fā)展與擴(kuò)張,所以我國(guó)上市公司的分紅中,送紅股的現(xiàn)象就非常普遍。
硬鏈接
[oracle@dcm ~]$ ln original.file hard.link
軟鏈接
[oracle@dcm ~]$ ln
-s original.file soft.link
[oracle@dcm ~]$ ls -l
-rw-r--r--
2 oracle oinstall??? 4 Jul 14 17:21 original.file
-rw-r--r--
2 oracle oinstall??? 4 Jul 14 17:21 hard.link
lrwxrwxrwx 1 oracle oinstall?? 13 Jul 14 17:23
soft.link -> original.file
鏈接數(shù)只是和硬鏈接相關(guān)的一個(gè)概念
從鏈接文件可以跟蹤到軟鏈接的指向(無(wú)法反向跟蹤)
---------------
由于inode這種文件系統(tǒng)結(jié)構(gòu)不是雙向的,不能查找一個(gè)inode被reference了多少次。我們只能通過(guò)一些技巧來(lái)跟蹤硬鏈接。
1. 通過(guò)鏈接數(shù),我們可以知道哪個(gè)文件有硬鏈接(大于1)
2. 查找該文件的inode id
[oracle@dcm ~]$ ls -i hard.link
1573158 hard.link
3. 通過(guò)inode id查找文件(如果需要遍歷的目錄很多,速度自然可想而知)
[oracle@dcm ~]$ find -inum 1573158
./hard.link
./original.file
4. 硬鏈接本質(zhì)上是多個(gè)dentry指向同一個(gè)inode,所以并沒有主從之分,每個(gè)dentry都是平等的。