oracle生成测试数据

网上找了一个sql可以大批量生成测试数据:

create table myTestTable as 
  select 
    rownum as id, 
    to_char(sysdate + rownum/24/3600, 'yyyy-mm-dd hh24:mi:ss') as inc_datetime, 
    trunc(dbms_random.value(0, 100)) as random_id, 
    dbms_random.string('x', 20) random_string 
  from dual 
    connect by level <= 1200000; 


执行时报错:
ORA-01536: 超出表空间 'USERS' 的空间限额

增加表空间:

alter user liu quota unlimited on users;

再执行时又报错:
ORA-30009: CONNECT BY 操作内存不足
or
ORA-30009: Not enough memory for CONNECT BY operation
继续阅读oracle生成测试数据

oracle rownum使用

rownum是oracle中神奇的列,它是一个伪列,是在sql查询出结果之后加在表上的。

oracle中rownum只能:
1)大于0,
2)等于1,
3)小于任何值。

1、大于0
比较:

select * from emp where rownum > 0;
select * from emp where rownum > 1;

rownum大于0,结果记录都返回。
rownum大于1,结果为空。

在执行过程中,rownum是从1开始的,判断rownum > 1时,第一条不满足会去掉,第二条又变成了1,所以最后结果会空。

2、等于1
比较:

select * from emp where rownum = 1;
select * from emp where rownum = 2;

rownum等于1,结果记录返回。
rownum等于2,结果为空。
继续阅读oracle rownum使用

Linux time函数

Linux下time函数都在time.h头文件中。

1、头文件
和时间有关的头文件有以下几个:

time.h
sys/time.h
sys/times.h
sys/timeb.h
sys/timex.h

time.h是C标准库的头文件,其余sys开头的都是Linux系统自己的头文件。
/usr/include/time.h定义了常用的time函数。
到/usr/include/sys目录下查看这几个文件:
sys/time.h定义了timezone结构体和Linux系统的时间函数。
sys/times.h定义了进程使用CPU时间的结构体tms。
sys/timeb.h定义了ftime函数的返回值的结构体timeb。
sys/timex.h定义了关于时钟调整算法的结构体timex。

2、常用函数和结构体
time函数原型(time.h中):

time_t time(time_t *calptr);

参数:
time_t类型变量的指针。
返回值:
time_t类型相当于一个long,time用于取Epoch记年以来到现在经过的秒数(系统当前时间),Epoch记年从1970年1月1日开始。把取到的时间存在指针指向的变量中。
继续阅读Linux time函数

oracle minus使用

minus返回在第一个查询结果中与第二个查询结果不相同的那部分记录,minus的作用简单来说是对第一个表去同留异。

表A、表B,表A和表B有交集,我们要取表A中去掉交集后的所有记录。也就是下图中单独画红线的部分。

例如:
表t111内值为1、2、3,表t222内值为3、4。以t111为基表使用minus之后返回结果是:1、2。

代码:

drop table t111;
drop table t222;

create table t111
(
id varchar2(2)
);

create table t222
(
id varchar2(2)
);

insert into t111 values ('1');
insert into t111 values ('2');
insert into t111 values ('3');

insert into t222 values ('3');
insert into t222 values ('4');

(select * from t111)
MINUS
(select * from t222);

执行结果:

ID
----------
1
2

参考资料:
http://bbs.csdn.net/topics/270003462
http://www.cnblogs.com/chshnan/archive/2011/11/14/2248731.html
http://hi.baidu.com/wangzhiqing99/item/8281bae7c251bf2c6cabb82b

oracle in使用

oracle in可以用来筛选某个字段等于多个值的情况。

1、in对后面写数字的有1000个的数量限制,如果超过1000个要用:in(1000个数字) or in (剩余数字)
2、in后面跟子查询没有数量限制:in(select XXXXXXXXX)

简单的例子:
1)

select * from emp where deptno in ('20', '30');

–in后面是单引号引起来的值,有数量限制。

2)

select * from emp t0 where t0.deptno in (select t1.deptno from dept t1);

–in后面是一个子查询,没有数量限制。

3)

select * from emp where empno in
(
select rownum as id from dual connect by level <= 7500 );

--查询empno在7500范围内的记录。

oracle with as子句

oracle中with as子句相当于把一个子查询的语句块定义一个别名(临时表),在之后紧跟的select查询中可以重复使用。

格式:
WITH <alias_name> AS
(
subquery_sql_statement
)
SELECT <column_name_list> FROM <alias_name>;

要注意的是在with as子句后面只能跟一个select查询语句,with生成的临时表在select结束后就会被释放掉。
使用with的好处是使代码的结构更清晰。在多次对一个子查询使用时,效率更高。

例子:
–查询出部门的总工资

WITH DEPT_COSTS AS
(SELECT D.DNAME, SUM(E.SAL) DEPT_TOTAL
FROM DEPT D, EMP E
WHERE E.DEPTNO = D.DEPTNO
GROUP BY D.DNAME)
select * from DEPT_COSTS;

参考资料:
http://blog.itpub.net/11759632/viewspace-1060884/

Linux信号掩码和信号处理函数

1、信号掩码——被阻塞的信号集
每个进程都有一个用来描述哪些信号传送来将被阻塞的信号集,如果某种信号在某个进程的阻塞信号集中,则传送到该进程的此种信号将会被阻塞。当前被进程阻塞的信号集也叫信号掩码,类型为sigset_t。每个进程都有自己的信号掩码,且创建子进程时,子进程会继承父进程的信号掩码。

2、信号阻塞和忽略的区别
阻塞的概念与忽略信号是不同的:操作系统在信号被进程解除阻塞之前不会将信号传递出去,被阻塞的信号也不会影响进程的行为,信号只是暂时被阻止传递;当进程忽略一个信号时,信号会被传递出去,但进程将信号丢弃。

每个进程都有一个信号掩码,信号掩码是一个“位图”,如果位图中某位标识1,表示该位对应的信号被暂时屏蔽。如果标识为0,表示进程可以接收这个信号。

System V signal API信号处理函数除了sigset外,还有以下几个。

sighold()函数
把指定的信号增加到信号掩码中去(将位图中对应的位标识为1),这样就暂时屏蔽了该信号。
返回值:成功返回0,失败返回-1。

sigrelse()函数
从信号掩码中移除指定的信号,这样进程就可以接收该信号了。
返回值:成功返回0,失败返回-1。

sigignore()函数
将信号配置为SIG_IGN,即忽略该信号。
返回值:成功返回0,失败返回-1。
sigignore(SIGALRM)相当于sigset(SIGALRM, SIG_IGN)
继续阅读Linux信号掩码和信号处理函数

Linux中alarm函数和信号处理

alarm函数作用是设定一个计时器,到时间后会向进程发送信号。
它向进程发送SIGALRM信号。要注意的是,一个进程只能有一个闹钟时间,如果在调用alarm之前已设置过闹钟时间,则任何以前的闹钟时间都被新值所代替。
我们还可以调用alarm(0)来取消此闹钟,并返回剩余时间。

函数原型:
unsigned int alarm(unsigned int seconds);
函数参数:
seconds:指定的秒数
继续阅读Linux中alarm函数和信号处理

oracle中update和for update

update
对表中一行记录的修改,修改时会加锁。

select … for update
对满足条件的select结果集加锁。
如果结果集只要有一行记录被另一个session加锁,那么就会阻塞,直到那个session最后commit或者rollback之后执行。

select … for update nowait
如果满足条件的结果集只要有一行已经加锁了,不等待立即返回错误:
ORA-00054: resource busy and acquire with NOWAIT specified

for update和for update nowait加上的是一个行级排它锁。update加上的是一个共享锁,也就是说在update的时候可以对记录查询,但是查询出的结果可能就是update之前的值了。

Linux下消息队列学习(2)

一、消息队列系统参数设置
在Linux系统下有两个参数可以设置消息队列的大小:

vim /etc/sysctl.conf

加入:

# Controls the default maxmimum size of a mesage queue
kernel.msgmnb = 6553600

# Controls the maximum size of a message, in bytes
kernel.msgmax = 65536

参数说明:
kernel.msgmnb:每个消息队列的大小(字节)
kernel.msgmax:消息队列中一个消息的最大长度(字节)

按照以上设置,一个消息队列最大长度可以为6553600字节,每个消息最大长度65536字节,所以该消息队列可存储100条消息。

二、消息队列的特点
1)消息队列就是一个消息的链表。消息队列允许一个或多个进程向它写入或读取消息,而且消息是按消息类型访问与写入。如果读队列使用的消息类型为0,则读取消息队列中的第一条消息。
2)消息队列是随内核持续的,即当使用该消息队列的进程结束,或者已关闭该消息队列,该队列中的消息不会随之消失,只有在内核重新初始化,即计算机重启之后才会消失,因此成为内核的持续性,这点也是与管道和FIFO的区别。
3)消息队列的另一个特性是,在某一个进程往消息队列写消息之前不需要另外某个进程在该消息队列上等待消息的到达,即不会像管道、FIFO那样,如果往管道和FIFO写数据时,如果没有一个进程已经将读端打开,那么写操作会被阻塞。当然如果从消息队列读取数据时,消息队列为空时可以按设置的flag决定是否阻塞。
继续阅读Linux下消息队列学习(2)

软件及互联网爱好者