Jcat
宠辱不惊,闲看庭前花开花落~~
posts - 173,comments - 67,trackbacks - 0
注意,为了能在终端看见put_line的输出,还需要先开启
set serveroutput on

 

--用来测试的表
create table test_tri(
a1 int,
a2 int
)
tablespace test


-----行级insert触发器
-----
1) 插入的一行新数据保存在:new
2)
insert触发器没有:old值
3) 对:new的修改,只能定义在before类型的触发器中

---触发器语法---
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;
/

--测试

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(由触发器生成的值)
         2          3



-----DDL触发器-----
--任何create语句都会触发这个语句

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;
posted @ 2010-01-11 14:58 Jcat 阅读(242) | 评论 (0)编辑 收藏
Oracle建好后,tnsnames和listener中自动就带有如下内容,这里咱们就来解释一下这些东西是干什么用的

----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 Communication
When 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
默认安装时,会安装一个PL/SQL外部程序(extproc--这是程序名)条目在listener.ora中,是oracle为调用外部程序默认配置的监听,它的名字(也就是SID)通常是ExtProc或PLSExtProc
但一般不会使用它,可以直接从listener.ora中将这项移除,因为对ExtProc已经有多种攻击手段了,在不使用外部程序时,Oracle也是建议删除的。



extproc的作用
就是在pl/sql中调用外部语句,如c,java写的过程。
现在,Oracle已经全面支持JAVA了,这东西也就过时了,之所以继续保留是考虑到兼容以前老版本的数据库实例。

[oracle@dcm bin]$ extproc
Oracle Corporation --- TUESDAY   JAN 05 2010 21:58:23.878
Heterogeneous Agent Release 10.2.0.1.0 - Production

posted @ 2010-01-05 21:59 Jcat 阅读(634) | 评论 (0)编辑 收藏
--登录sys用户,创建一个测试用户,权限可以给大点
SQL> create user test identified by xxxxx;
SQL> grant connect to test;
SQL> grant resource to test;
SQL> grant dba to test;


--登录test用户,开始测试
--建个测试表
create table test_table(id int, time timestamp);

--创建Job
begin
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函数同SQLServer的isnull函数
    start_date => null, --一激活,就开始
    repeat_interval => 'FREQ=SECONDLY;INTERVAL=10');
end;

FREQ用来指定间隔的时间周期,可选参数有:YEARLY,MONTHLY,WEEKLY,DAILY,HOURLY,MINUTELY,SECONDLY。

--光创建没用,还需要激活;也可以在创建时,直接把enable属性设置为true(enabled => true
select job_name, enabled, run_count from user_scheduler_jobs;
JOB_NAME                       ENABL  RUN_COUNT
------------------------------ ----- ----------
TEST_JOB                       FALSE          0


begin
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


--停止任务
begin
dbms_scheduler.disable('test_job');
end;

--删除任务
begin
dbms_scheduler.drop_job('test_job');
end;
posted @ 2009-12-17 16:13 Jcat 阅读(226) | 评论 (0)编辑 收藏

一致和并发是对立的,需要根据应用,选择权宜之计


数据不一致的现象

---事务内单SQL的情况---
1.脏读-Dirty Read:本事务读取了其它事务尚未提交的修改数据
例子:读了不该读的
1:00 x=1
1:01 A用户 Update x=2(但未commit)
1:02 B用户 Select x --> x=2
合理的情况是x仍然等于1

---事务内多SQL的情况(典型的如,先查再改)---
2.不可重复读-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
首先这个结果从单条SQL的角度看,是没有问题的。但是,如果把B的两次查询看作一个整体(事务),那么合理的情况应该是
  x+y仍然等于3
  或者B再进行一次事务,得出 x=2 y=2 x+y=4 的结果


例子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来讲,没有任何问题。
但是从逻辑的合理性讲,一般的更新操作都是先查再改,换言之
  A真正想做的是Update x from 1 to 2
  B真正想做的是Update x from 1 to 3
但最终却造成了在B不知情的情况下,把B的初衷改为了Update x from 2 to 3


3.幻影读-Phantom Read
例子:读到了未来
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
其实道理和之前的不可重复读相同,只不过是由Insert引起的罢了。
(甚至Delete也会引起类似的问题,但好像学术界并没有对Delete进行讨论)




Isolation Level
Read Uncommitted:1,2,3都会发生
  Oracle中严格禁止脏读
  在SQL Server 7.0中,是可以选择该级别的
Read Committed:发生2,3(Oracle的默认级别)
Repeatable Read:发生3
Serializable:都不发生


Oracle的实现方式
Read Committed:默认就实现
Repeatable Read:
  1. 悲观锁(select ... for update),影响并发
  2. 乐观锁(update where 所有字段都作为条件),不影响并发
Serializable:
  alter session set isolation_level=serializable/read only
posted @ 2009-12-05 17:45 Jcat 阅读(195) | 评论 (0)编辑 收藏


因为在客户那工作不能上网,决定办一张3G上网卡(公司报销),中午分别去电信和移动了解了一下:
电信 960元  7个月  300小时/月
移动 880元  7个月  15G/月 (目前推广期,不限流量)
(都包含上网猫)
这样算下来还是移动的便宜,去搞了个移动的。

关于移动的上网猫,开始给我测试的时候用的是华为的、白色、流线型还挺好看。最终给我的是一个鸟公司的(敏讯),方形真难看,太大了,号称还是升级版。

速度嘛,看网页没啥问题,Outlook下邮件也很快,在线听歌也没问题,在线电影就不去尝试了,免得伤自尊,办公足够了。玩开心网有点卡。(我以前就用过联通的CDMA-2G上网,那叫一个慢呀)

这个帖子就是用3G网络发的,哈哈。同时纪念一下2年后重回BMW做项目。
posted @ 2009-09-17 19:09 Jcat 阅读(208) | 评论 (0)编辑 收藏
扇区(sector):最小的可寻址单元,512byte
磁道(track):一圈扇区
磁柱(cylinder):一摞磁道

每一磁道的扇区数是一样的,但是存储密度不同,外疏内密。

为什么要外疏内密?
角速度相同时,线速度与半径成正比:
硬盘为了提高其轴寿命,轴的转动速度是一定的。磁头在硬盘上读写数据是近乎于圆弧的路线,而越往外,线速度就越快。为了保证读取的准确性只能减小外道的密度使磁头读取数据的时间间隔是相同的。


有待研究:早期的磁盘每个磁道上的扇区数目是一样,显然浪费了外圈的容量,后来为了增大磁盘容量采用了新技术,也就是说越往外每磁道扇区数目越多。

posted @ 2009-09-14 15:50 Jcat 阅读(357) | 评论 (0)编辑 收藏
字符设备:按照字符流的方式被有序访问,不能随机存取,如键盘、串口打印机、磁带。

块设备:能够随机(不需要按顺序)访问固定大小数据片(chunks),采用块缓冲技术,如硬盘、软盘、光驱。

裸设备:是一种没有经过格式化,不被Unix通过文件系统来读取的特殊字符设备。
现在问题来了,Oracle在使用裸设备时(如ASM、甚或表空间直接建在裸设备上),难道还是顺序存取?显然不符合事实。
其实,说裸设备是字符设备,只是从操作系统的角度来说的;从使用裸设备的应用程序(如Oracle)的角度,还是块设备,Oracle会去对磁盘进行分块管理。

逻辑卷是逻辑概念,可以包含多块物理硬盘,实现了存储跨盘功能,同时提供了数据复制机制,提供了数据安全保护机制。

--------------

裸设备适用于每次改动数据较小、需大量并发交易,OLTP;
对于大规模顺序读写,裸设备性能是最差的,所以对OLAP,应使用块设备或卷。

posted @ 2009-09-14 13:45 Jcat 阅读(573) | 评论 (0)编辑 收藏
--创建一个分区表
create table scott.testpart
(
    TEXTDATE   VARCHAR2(8)
)
partition by range ( TEXTDATE )
(
     partition p1 values less than ('20090201'),
     partition "p2" values less than ('20090301'), --注意这里的双引号
     partition pm values less than (MAXVALUE)  
)


--插入一些数据(顺便实践一下双层循环)

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循环里面了
        END LOOP;
END;


--需要先进行分析,否则num_rows列将为空
analyze table scott.testpart compute statistics;

--查看各个分区的情况
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因为加了引号仍然是小写(但并不显示引号,这点比较讨厌),没加引号的会显示为大写


--验证数据确实进入了正确的分区
select * from scott.testpart partition(p1);
TEXTDATE
--------
20090101
20090102
20090103

--创建p2时有引号,使用p2时也就需要引号。
--特别的,用一些第三方客户端创建分区表时,生成的SQL往往会自动加上引号,而查看DBA_TAB_PARTITIONS时又看不出来,所以遇到下面的问题,可以加个引号试试。
select * from scott.testpart partition(p2);
ERROR at line 1:
ORA-02149: Specified partition does not exist

select * from scott.testpart partition("p2");
TEXTDATE
--------
20090201
20090202
20090203


--其它相关
select * from scott.testpart;
truncate table scott.testpart;
drop table scott.testpart;

posted @ 2009-08-18 18:17 Jcat 阅读(247) | 评论 (0)编辑 收藏
股票的面值,是股份公司在所发行的股票票面上标明的票面金额,它以元/股为单位,其作用是用来表明每一张股票所包含的资本数额。在我国上海和深圳证券交易所流通的股票的面值均为壹元,即每股一元。
一般来说,股票的发行价格都会高于其面值。当股票进入流通市场后,股票的面值就与股票的价格没有什么关系了。股民爱将股价炒到多高,它就有多高。

按股东权利分类,股票可分为普通股、优先股和后配股。在我国上交所与深交所上市的股票都是普通股

股息红利作为股东的投资收益,是以股份为单位计算的货币金额,如每股多少元。但在上市公司实施具体分派时,其形式可以有四种:这就是现金股利、财产股利、负债股利和股票股利等。沪深股市的上市公司进行利润分配一般只采用股票红利和现金红利两种,即统称所说的送红股和派现金。
当上市公司向股东分派股息时,就要对股票进行除息;当上市公司向股东送红股时,就要对股票进行除权。
我国上市公司中约有一半以上的股份为国家股,且其股权代表基本上都是上市公司的经营管理人员。由于切身利益的影响,经营管理人员基本上都赞同企业的发展与扩张,所以我国上市公司的分红中,送红股的现象就非常普遍。
posted @ 2009-07-29 11:17 Jcat 阅读(151) | 评论 (0)编辑 收藏
硬链接
[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

链接数只是和硬链接相关的一个概念
从链接文件可以跟踪到软链接的指向(无法反向跟踪)



---------------
由于inode这种文件系统结构不是双向的,不能查找一个inode被reference了多少次。我们只能通过一些技巧来跟踪硬链接。
1. 通过链接数,我们可以知道哪个文件有硬链接(大于1)
2. 查找该文件的inode id
[oracle@dcm ~]$ ls -i hard.link
1573158 hard.link
3. 通过inode id查找文件(如果需要遍历的目录很多,速度自然可想而知)
[oracle@dcm ~]$ find -inum 1573158
./hard.link
./original.file
4. 硬链接本质上是多个dentry指向同一个inode,所以并没有主从之分,每个dentry都是平等的。

posted @ 2009-07-14 17:40 Jcat 阅读(237) | 评论 (0)编辑 收藏
仅列出标题
共17页: 上一页 1 2 3 4 5 6 7 8 9 下一页 Last