Oracle 游标

文章分类:数据库

游标是SQL的一个内存工作区,由系统或用户以变量的形式定义。游标的作用就是用于临时存储从数据库中提取的数据块。在某些情况下,需要把数据从存放在磁盘的表中调到计算机内存中进行处理,最后将处理结果显示出来或最终写回数据库。这样数据处理的速度才会提高,否则频繁的磁盘数据交换会降低效率。

Oracle中的游标有两种:显式游标、隐式游标。

显示游标是用cursor...is命令定义的游标,它可以对查询语句(select)返回的多条记录进行处理,而隐式游标是在执行插入(insert)、删除(delete)、修改(update)和返回单条记录的查询(select)语句时由PL/SQL自动定义的。

ORACLE备份与恢复

文章分类:数据库

1)ORACLE:使用sysdba登录,执行以下命令备份数据库到数据库安装用户的目录下,通常数据库安装用户是dbserv30这样的用户:

-------------- 登录后查询到所有的数据库用户 --------------

%sqlplus / as sysdba

SQL> select username from all_users where username like '%30';

SQL> exit;

%exp sysdbname/passwd owner=sysdbname rows=y compress=n buffer=65536 feedback=100000 volsize=0 file=exp_sysdb.dmp

2)注意事项:SCP数据库被命名为OPS$SCP30这样的名称,密码不确定是什么,因此可以在备份SCP数据库时按如下步骤操作:

%sqlplus / as sysdba

SQL> alter user OPS$SCP30 identified by scp30;

SQL> exit;

%exp

3)还原操作:需要先删除数据库用户,然后再创建数据库用户,并赋权限后再执行导入即可;

SQL> drop user sysdb30 cascade;

SQL> create user sysdb30 identified by sysdb30 default tablespace CBS_DEFAULT_DAT temporary tablespace "TEMP";

grant dba,connect,resource to sysdb30;

grant select any dictionary to sysdb30;

grant create any sequence to sysdb30;

grant create any table to sysdb30;

grant create any procedure to sysdb30;

grant create any trigger to sysdb30;

grant create session to sysdb30;

grant create sequence to sysdb30;

grant create table to sysdb30;

grant create procedure to sysdb30;

grant create trigger to sysdb30;

%imp sysdb30/sysdb30@oracle fromuser=sysdb30 touser=sysdb30 rows=y commit=y buffer=65536 feedback=100000 ignore=y volsize=0 file=sysdb30.dmp;

注意(以下操作都是用dba用户执行,即用sqlplus / as sysdba登录):

A)上面的create user操作中默认表空间名应当在数据库中查找到实际用的表空间名,查询语句如下:

SQL> select username, default_tablespace from dba_users where username like '%30';

B)上面操作中执行drop user时如果不成功,则需要确保没有人使用PL/SQL工具或sqlplus连接到此数据库,如是确认没有连接仍然删除不成功,则可以使用以下方法解决:

SQL> select SID,USERNAME,PROCESS,serial# from v$session where USERNAME like '%30';

SQL> alter system kill session '<SID>,<serial#>' immediate;

ORACLE下面几个有用的存储过程

文章分类:数据库

删除视图

create or replace procedure DropViewProc(viewName in varchar2)

as

begin

execute immediate 'drop view ' || viewName;

dbms_output.put_line('success to drop view: ' || viewName);

end;

/

执行存储过程

exec DropViewProc('user_basetab');

删除存储过程

drop procedure DropViewProc;

删除表

create or replace procedure DropTableProc(tableName in varchar2)

as

tableCounts number(10) := 0;

begin

select count(*) into tableCounts from user_tables where upper(table_name) = upper(tableName);

if(tableCounts > 0) then

execute immediate 'drop table ' || tableName;

dbms_output.put_line('success to drop table: ' || tableName);

end if;

end;

/

删除sequence

create or replace procedure DropSeqProc(seqName in varchar2)

as

seqCounts number(10) := 0;

begin

select count(*) into seqCounts from user_sequences where upper(sequence_name) = upper(seqName);

if(seqCounts > 0) then

execute immediate 'drop sequence ' || upper(seqName);

dbms_output.put_line('success to drop sequence: ' || seqName);

end if;

end;

/

查询Oracle当前用户使用的SID

文章分类:数据库

select instance_name,host_name,version from v$instance;

Oracle中强行断开用户连接的方法

文章分类:数据库

首先查找目标用户的当前进程,注意是serial#而不是serial,网上有的介绍漏掉了#:

select sid,serial# from v$session where username='ERP';

使用此语句会返回一个进程列表,每行有两个数字,然后用数字替代下面的sid和serial

alter system kill session 'sid,serial';

例如

alter system kill session '222,123';

通过select 语句可能返回多行记录,所以要多次执行alter语句

char和varchar2的区别

区别:

1.CHAR的长度是固定的,而VARCHAR2的长度是可以变化的, 比如,存储字符串“abc",对于CHAR (20),表示你存储的字符将占20个字节(包括17个空字符),而同样的VARCHAR2 (20)则只占用3个字节的长度,20只是最大值,当你存储的字符小于20时,按实际长度存储。

2.CHAR的效率比VARCHAR2的效率稍高。

3.目前VARCHAR是VARCHAR2的同义词。工业标准的VARCHAR类型可以存储空字符串,但是oracle不这样做,尽管它保留以后这样做的权利。Oracle自己开发了一个数据类型VARCHAR2,这个类型不是一个标准的VARCHAR,它将在数据库中varchar列可以存储空字符串的特性改为存储NULL值。如果你想有向后兼容的能力,Oracle建议使用VARCHAR2而不是VARCHAR。

何时该用CHAR,何时该用varchar2?

CHAR与VARCHAR2是一对矛盾的统一体,两者是互补的关系.

VARCHAR2比CHAR节省空间,在效率上比CHAR会稍微差一些,即要想获得效率,就必须牺牲一定的空间,这也就是我们在数据库设计上常说的‘以空间换效率’。

VARCHAR2虽然比CHAR节省空间,但是如果一个VARCHAR2列经常被修改,而且每次被修改的数据的长度不同,这会引起‘行迁移’(Row Migration)现象,而这造成多余的I/O,是数据库设计和调整中要尽力避免的,在这种情况下用CHAR代替VARCHAR2会更好一些。

rowid解析

先对 rowid 有个感官认识:

select ROWID from Bruce_test where rownum<2;

ROWID

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

AAABnlAAFAAAAAPAAA

ROWID 的格式如下:

数据对象编号    文件编号      块编号      行编号

OOOOOO            FFF           BBBBBB     RRR

我们可以看出,从上面的 rowid 可以得知:

AAABnl 是数据对象编号

AAF 是相关文件编号

AAAAAP 是块编号

AAA 是行编号

怎么依据这些编号得到具体的十进制的编码值呢,这是经常遇到的问题。这里需要明白 rowid 的是基于 64 位编码的 18 个字符显示(数据对象编号 (6) + 文件编号 (3) + 块编号 (6)+       行编号 (3)=18 位 ),其中

A-Z <==> 0 - 25 (26)

a-z <==> 26 - 51 (26)

0-9 <==> 52 - 61 (10)

+/ <==> 62 - 63 (2)

共 64 位,明白这个后,就可以计算出 10 进制的编码值,计算公式如下:

d * (b ^ p)

其中: b 就是基数,这里就是 64 , p 就是从右到左,已 0 开始的位置数

比如:上面的例子

文件号 AAF, 具体的计算应该是 :

刚才提到的是 rowid 的显示方式: 基于 64 位编码的 18 个字符显示,其实 rowid 的存储方式是: 10 个字 节即80位存储,其中 数据 对象编号 需 要 32 位,相关文件 编号 需 要 10 位,块 编号 需 要 22, 位行 编号 需 要 16 位,由此,我们可以得出:

32bit 的 object number ,每个数据库最多有 4G 个对象

10bit 的 file number ,每个对象最多有 1022 个文件( 2 个文件预留)

22bit 的 block number ,每个文件最多有 4M 个 BLOCK

16bit 的 row number ,每个 BLOCK 最多有 64K 个 ROWS

5*(64^0)=5 ;

0*(64^1)=0 ;

0*(64^2)=0 ;

文件号就是 0+0+5=5

rowid 相关的有用的 sql

最简单的基于 rowid 的显示方式得到的响应的 64 位编码对应值的 sql :

select rowid ,

substr(rowid,1,6) "OBJECT",

substr(rowid,7,3) "FILE",

substr(rowid,10,6) "BLOCK",

substr(rowid,16,3) "ROW"

from TableName;

sqlldr的用法

sql loader可以把一些以文本格式存放的数据顺利的导入到oracle数据库中,是一种在不同数据库之间进行数据迁移的非常方便而且通用的工具。缺点就速度比较慢,另外对blob等类型的数据就有点麻烦了。

用法: SQLLDR keyword=value [,keyword=value,...]

在命令行下执行 Oracle  的 sqlldr 命令,可以看到它的详细参数说明,要着重关注以下几个参数:

userid -- Oracle 的 username/password[@servicename]

control -- 控制文件,可能包含表的数据

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

log -- 记录导入时的日志文件,默认为 控制文件(去除扩展名).log

bad -- 坏数据文件,默认为 控制文件(去除扩展名).bad

data -- 数据文件,一般在控制文件中指定。用参数控制文件中不指定数据文件更适于自动操作

errors -- 允许的错误记录数,可以用他来控制一条记录都不能错

rows -- 多少条记录提交一次,默认为 64

skip -- 跳过的行数,比如导出的数据文件前面几行是表头或其他描述

还有更多的 sqlldr 的参数说明请参考:sql loader的用法。

用例子来演示 sqlldr 的使用,有两种使用方法:

1. 只使用一个控制文件,在这个控制文件中包含数据

2. 使用一个控制文件(作为模板) 和一个数据文件

下面来看示例

create table users(

user_id number,           --用户 ID

user_name varchar2(50),   --用户名

login_times number,       --登陆次数

last_login date           --最后登录日期

)

insert into users values(1,'Unmi',3,sysdate);

insert into users values(2,NULL,5,to_date('2008-10-15','YYYY-MM-DD'));

insert into users values(3,'隔叶黄莺',8,to_date('2009-01-02','YYYY-MM-DD'));

insert into users values(5,'不知秋',1,to_date('2008-12-23','YYYY-MM-DD'));

第二种方式: 使用一个控制文件(作为模板) 和一个数据文件

1) 建立数据文件,我们这里用 PL/SQL Developer 导出表 users 的记录为 users_data.csv 文件

建立一个控制文件 users.ctl,内容如下:

OPTIONS (skip=1,rows=128) -- sqlldr 命令显示的选项可以写到这里边来,skip=1 用来跳过数据中的第一行

LOAD DATA

INFILE "users_data.csv" --指定外部数据文件,可以写多个 INFILE "another_data_file.csv" 指定多个数据文件,也可以在此处不写,在后面指定

--这里还可以使用 BADFILE、DISCARDFILE 来指定坏数据和丢弃数据的文件,

truncate --操作类型,用 truncate table 来清除表中原有记录

INTO TABLE users -- 要插入记录的表

Fields terminated by "," -- 数据中每行记录用 "," 分隔

Optionally enclosed by '"' -- 数据中每个字段用 '"' 框起,比如字段中有 "," 分隔符时

trailing nullcols --表的字段没有对应的值时允许为空

(

virtual_column FILLER, --这是一个虚拟字段,用来跳过由 PL/SQL Developer 生成的第一列序号

user_id number, --字段可以指定类型,否则认为是 CHARACTER 类型, log 文件中有显示

user_name,

login_times,

last_login DATE "YYYY-MM-DD HH24:MI:SS" -- 指定接受日期的格式,相当用 to_date() 函数转换

)

说明:在操作类型 truncate 位置可用以下中的一值:

1) insert     --为缺省方式,在数据装载开始时要求表为空

2) append  --在表中追加新记录

3) replace  --删除旧记录(用 delete from table 语句),替换成新装载的记录

4) truncate --删除旧记录(用 truncate table 语句),替换成新装载的记录

执行命令

sqlldr userid=scott/anwei@orcl control=user.ctl data=user.cvs  log=user.log

执行完 sqlldr 后希望能留意一下生成的几个文件,如 users.log 日志文件、users.bad 坏数据文件等。特别是要看看日志文件,从中可让你更好的理解 Sql Loader,里面有对控制文件的解析、列出每个字段的类型、加载记录的统计、出错原因等信息。

Oracle中时间的函数

一、 常用日期数据格式

1.Y或YY或YYY 年的最后一位,两位或三位

SQL> Select to_char(sysdate,'Y') from dual;

TO_CHAR(SYSDATE,'Y')

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

7

SQL> Select to_char(sysdate,'YY') from dual;

TO_CHAR(SYSDATE,'YY')

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

07

SQL> Select to_char(sysdate,'YYY') from dual;

TO_CHAR(SYSDATE,'YYY')

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

007

2.Q 季度 1~3月为第一季度,2表示第二季度。

SQL> Select to_char(sysdate,'Q') from dual;

TO_CHAR(SYSDATE,'Q')

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

2

3.MM 月份数

SQL> Select to_char(sysdate,'MM') from dual;

TO_CHAR(SYSDATE,'MM')

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

05

4.RM 月份的罗马表示 (V在罗马数字中表示 5)

SQL> Select to_char(sysdate,'RM') from dual;

TO_CHAR(SYSDATE,'RM')

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

V

5.Month 用9个字符长度表示的月份名

SQL> Select to_char(sysdate,'Month') from dual;

TO_CHAR(SYSDATE,'MONTH')

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

5月

6.WW 当年第几周 (2007年5月29日为2007年第22周)

SQL> Select to_char(sysdate,'WW') from dual;

TO_CHAR(SYSDATE,'WW')

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

22

7.W 本月第几周 (2007年5月29日为5月第5周)

SQL> Select to_char(sysdate,'W') from dual;

TO_CHAR(SYSDATE,'W')

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

5

8.DDD 当年第几天 (2007年5月29日为2007年第149天)

SQL> Select to_char(sysdate,'DDD') from dual;

TO_CHAR(SYSDATE,'DDD')

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

149

9. DD 当月第几天

SQL> Select to_char(sysdate,'DD') from dual;

TO_CHAR(SYSDATE,'DD')

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

29

10.D 周内第几天

SQL> Select to_char(sysdate,'D') from dual;

TO_CHAR(SYSDATE,'D')

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

3

11.DY 中文的星期几 ( (2007年5月29日为星期二))

SQL> Select to_char(sysdate,'DY') from dual;

TO_CHAR(SYSDATE,'DY')

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

星期二

12.HH或HH12 12进制小时数 (16:09分为用12小时制计时为4点)

SQL> Select to_char(sysdate,'HH') from dual;

TO_CHAR(SYSDATE,'HH')

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

04

13.HH24 24小时制

SQL> Select to_char(sysdate,'HH24') from dual;

TO_CHAR(SYSDATE,'HH24')

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

16

二、常用时间函数

1.trunc(sysdate,'Q') 本季度第一天

SQL> select trunc(sysdate,'Q') from dual;

TRUNC(SYSDATE,'Q')

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

2007-4-1

2.trunc(sysdate,'D') 本周的第一天(周日)

SQL> select trunc(sysdate,'D')from dual;

TRUNC(SYSDATE,'D')

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

2007-5-27

3.last_day(sysdate) 本月最后一天

SQL> select last_day(sysdate) from dual;

LAST_DAY(SYSDATE)

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

2007-5-31 15:20:3

4.add_months(sysdate,2) 日期sysdate后推2个月

SQL> select add_months(sysdate,2) from dual;

ADD_MONTHS(SYSDATE,2)

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

2007-7-29 15:21:14

5.next_day(sysdate,2) 日期sysdate之后的第一周中,第2(指定星期的第几天)是什么日期

SQL> select next_day(sysdate,2) from dual;

NEXT_DAY(SYSDATE,2)

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

2007-6-4 15:22:10

6.Months_between(f,s) 日期f和s间相差月数

SQL> select months_between(sysdate,to_date('2007-04-12','yyyy-mm-dd'))from dual;

MONTHS_BETWEEN(SYSDATE,TO_DATE

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

1.56909908900836

7.得到SYSDATE+5所在的月份

SQL> SELECT to_char(SYSDATE+5,'mon','nls_date_language=american') FROM dual;

TO_CHAR(SYSDATE+5,'MON','NLS_D

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

jun

8.current_date()返回当前会话时区中的当前日期 。

9.select dbtimezone from dual;

10.extract()找出日期或间隔值的字段值

SQL> select extract(month from sysdate) "This Month" from dual;

This Month

----------

5

SQL> select extract(year from sysdate) "This year" from dual;

This year

----------

2007

SQL> select extract(month from add_months(sysdate,2)) " Month" from dual;

Month

----------

7

==================================================================

三、一些实践后的用法:

1.上月末天:

select to_char(add_months(last_day(sysdate),-1),'yyyy-MM-dd') LastDay from dual;

2.上月今天

SQL> select to_char(add_months(sysdate,-1),'yyyy-MM-dd') PreToday from dual;

3.上月首天

SQL> select to_char(add_months(last_day(sysdate)+1,-2),'yyyy-MM-dd') firstDay from dual;

4.要找到某月中所有周五的具体日期

SELECT to_char(b.a,'YY-MM-DD')

FROM ( SELECT trunc(SYSDATE,'mm')+ROWNUM-1 a

FROM dba_objects where rownum < 32 ) b

WHERE to_char(b.a,'day')='星期五';

如果把where to_char(t.d, 'MM') = to_char(sysdate, 'MM')改成sysdate-90,即为查找当前月份的前三个月中

的每周五的日期。

5.得到系统当前月及以后的日期

select trunc(sysdate, 'MM')+ROWNUM-1 FROM dba_objects ;

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

to_date 字符串类型转为换日期类型

字符串中的相应位置上的字符,必须符合时间范围的限制

14.MI 分钟数(0~59)

提示注意不要将MM格式用于分钟(分钟应该使用MI)。MM是用于月份的格式,将它用于分钟也能工作,但结果是错误的。

15.SS 秒数(0~59)

Oracle中to_char函数的用法

数字

to_char(1210.73, '9999.9') would return '1210.7'

to_char(1210.73, '9,999.99') would return '1,210.73'

to_char(1210.73, '$9,999.00') would return '$1,210.73'

to_char(21, '000099') would return '000021'

日期的用法

to_char(sysdate, 'yyyy/mm/dd'); would return '2003/07/09'

to_char(sysdate, 'Month DD, YYYY'); would return 'July 09, 2003'

to_char(sysdate, 'FMMonth DD, YYYY'); would return 'July 9, 2003'

to_char(sysdate, 'MON DDth, YYYY'); would return 'JUL 09TH, 2003'

to_char(sysdate, 'FMMON DDth, YYYY'); would return 'JUL 9TH, 2003'

to_char(sysdate, 'FMMon ddth, YYYY'); would return 'Jul 9th, 2003'

Oracle常用函数

*在一个字符串中搜索指定的字符,返回发现指定的字符的位置

函数 INSTR(C1,C2,I,J)

C1    被搜索的字符串

C2    希望搜索的字符串I     搜索的开始位置,默认为1

J     出现的位置,默认为1

select instr('oracle traning','ra',1,2) instring from dual;

*返回字符串的长度

函数 LENGTH

select HIREDATE,length(to_char(HIREDATE)) from emp;

*将字符串转化为小写

函数  LOWER

select lower(ename) from emp;

*REPLACE('string','s1','s2')

string   希望被替换的字符或变量

s1       被替换的字符串

s2       要替换的字符串

select replace('he love you','he','i') from dual;

*将字符串转化为大写

函数 upper

select upper(ename) from emp;

*RPAD和LPAD(粘贴字符)

RPAD  在列的右边粘贴字符

LPAD  在列的左边粘贴字符

select lpad(rpad('gao',10,'*'),17,'*')from dual;

*LTRIM和RTRIM

LTRIM  删除左边出现的字符串

RTRIM  删除右边出现的字符串

select ltrim(rtrim('   gao qian jing   ',' '),' ') from dual;

*SUBSTR(string,start,count)

取子字符串,从start开始,取count个

select substr('13088888888',3,8) from dual;

Informix onstat 命令详解

几个常用的onstat选项实例解释

• ONstat -m :显示消息日志的最后20行.

消息日志的内容包括:

1)、检查点信息

2)、读写错误信息

3)、ONLINE模式转换信息

4)、长事务

5)、日志文件满(LOG FILE FULL )

若想显示完整信息,可直接编译消息日志文件.

• ONstat -d:磁盘空间的使用情况,包括DBSPACE和CHUNK的信息

Dbspaces

address  number   flags    fchunk   nchunks  flags    owner    name

c57ef158 1        1        1        1        N        informix rootdbs

c57efd18 2        2001     2        1        N T      informix tmpdbs

c57efdd8 3        1        3        1        N        informix llogdbs

c57efe98 4        1        4        1        N        informix plogdbs

c57eff58 5        1        5        8        N        informix datadbs1

5 active, 2047 maximum

Chunks

address  chk/dbs offset   size     free     bpages   flags pathname

c57ef218 1   1   0        150000   148715            PO-   /dev/vg01/lvol1

c57ef378 2   2   0        250000   249881            PO-   /dev/vg01/lvol2

c57ef458 3   3   0        125000   197               PO-   /dev/vg01/lvol3

c57ef538 4   4   0        125000   2447              PO-   /dev/vg01/lvol4

其中的FREE项,显示了该CHUNK的空闲空间大小(Kbytes).

• ONstat -l :日志文件情况

Physical Logging

Buffer bufused  bufsize  numpages numwrits pages/io

P-2  42       256      123414   1068     115.56

phybegin physize  phypos   phyused  %used

400035   122500   110222   42       0.03

Logical Logging

Buffer bufused  bufsize  numrecs  numpages numwrits recs/pages pages/io

L-2  0        64       6150454  194478   8434     31.6       23.1

Subsystem    numrecs  Log Space used

OLDRSAM      6150454  385076912

address  number   flags    uniqid   begin        size     used    %used

c128d020 1        U-B----  6776     300035      12500    12500   100.00

c128d03c 2        U-B----  6777     303109      12500    12500   100.00

c128d058 3        U-B----  6778     3061dd      12500    12500   100.00

c128d074 4        U-B----  6779     3092b1      12500    12500   100.00

c128d090 5        U-B----  6780     30c385      12500    12500   100.00

c128d0ac 6        U---C-L  6781     30f459      12500     6768    54.14

c128d0c8 7        U-B----  6772     31252d      12500    12500   100.00

c128d0e4 8        U-B----  6773     315601      12500    12500   100.00

c128d100 9        U-B----  6774     3186d5      12500    12500   100.00

c128d11c 10       U-B----  6775     31b7a9      12250    12250   100.00                              

其中:%USED: 使用百分比

FLAGS字段的含义:

F: 空闲 B:已备份 C: 正在接收事物记录

U: 正在使用 A: 新增日志 L: 包含最后一个检查点

• ONstat - u:ONLINE的用户情况

Userthreads

address  flags   sessid   user     tty      wait     tout locks nreads   nwrites

c57f1018 ---P--D 1        informix -        0        0    0     757      36481

c57f1504 ---P--F 0        informix -        0        0    0     0        377273

c57f19f0 ---P--- 5        informix -        0        0    0     0        6742

c57f1edc ---P--B 6        informix -        0        0    0     29       257

其中:flages字段的含义:

第一列:(S:等待mutex;Y:等待条件;L:等待锁;B:等待缓冲区;

      C:等待检查点;X:长事务清理;G:等待长缓冲写;T:等待事务)

第二列:(*:事务执行时,发生I/O错误)

第三列:(A:正在备份;B:操作已被记录在日志中;P:分布处理已准备好; 

      C:正在提交;R:正在回滚)

第四列:(P:会话的主线索)

第五列:(R:在read rsam 调用中;X:进程在关键分区)

第七列:(M:特殊监控;D:特殊线索;C:清理线索;F:特殊清页进程;

       B:特殊B+树清页线索)

• ONstat -k :用户持有锁的情况

锁按照粒度分为6种: 库锁、表锁、页锁、行锁、字节锁、键锁

字节锁:更新包含有VARCHAR类型的行时,加在该行上的锁。

键锁:用于索引树上的锁。一般在相应字节上加删除标志。

这几种锁的识别如下:

    TYPE  ONLSNUM  ROWID   SIZE 

库锁  HDR+X  1000002   205     0 

表锁       100000e   0      0

页锁             100      0

行锁             101 

字节锁  HDR+B               909

键锁             很大的16进制数

锁的生命期:1、不使用事务时,操作完成即会释放对应的锁;

2、 若使用事务,锁将伴随整个事务。(即随这COMMIT WORK或ROLLBACK WORK而释放)  

(**锁的几种类型:共享锁(SHARE),排它锁(EXCLUSIVE),可升级锁**)

• ONstat -p : 显示系统资源状况(是否充分)

Profile

dskreads pagreads bufreads %cached dskwrits pagwrits bufwrits %cached

2112876  5085802  697502689 99.70   469082   1154138  9885314  95.25

isamtot  open     start    read     write    rewrite  delete   commit   rollbk

269117818 4202839  19282008 199402561 3286406  981022   270765   261330   20733

gp_read  gp_write gp_rewrt gp_del   gp_alloc gp_free  gp_curs

0        0        0        0        0        0        0

ovlock   ovuserthread ovbuff   usercpu  syscpu   numckpts flushes

0        0            0        66354.52 3954.04  341      682

bufwaits lokwaits lockreqs deadlks  dltouts  ckpwaits compress seqscans

721270   153      794000443 0        0        246      72878    784815

ixda-RA  idx-RA   da-RA    RA-pgsused lchwaits

458268   5293     1041489  1480397    1904

OVONLS:指示ONLSPACE值不够 ,ONLSPACES值应增大

OVLOCK:锁溢出  LOCKS应增大

OVUSER:用户表资源不够  USERS

OVBUF:缓冲区资源不够   BUFFERS

以上数字若持续增加,表明相应参数值应调整

DEADLOCKS:检测到的死锁数

DLTOUTS:网络超时死锁

DEADLOCK_TIMEOUT:一般为60秒,若增大此数字,可以减少死锁数,但会增加响应时间,用户看来性能更差;若减少此数字,死锁数可能会增大,但会减少响应时间,在用户看来,响应时间变快了。

Oralce表解锁

ORACLE里锁有以下几种模式:

0:none

1:null      空

2:Row-S     行共享(RS):共享表锁

3:Row-X     行专用(RX):用于行的修改

4:Share     共享锁(S):阻止其他DML操作

5:S/Row-X   共享行专用(SRX):阻止其他事务操作

6:exclusive 专用(X):独立访问使用

数字越大锁级别越高, 影响的操作越多。

一般的查询语句如select ... from ... ;是小于2的锁, 有时会在v$locked_object出现。

select ... from ... for update;      是2的锁。

当对话使用for update子串打开一个游标时,

所有返回集中的数据行都将处于行级(Row-X)独占式锁定,

其他对象只能查询这些数据行,不能进行update、delete或select...for update操作。

insert / update / delete ... ;      是3的锁。

没有commit之前插入同样的一条记录会没有反应,

因为后一个3的锁会一直等待上一个3的锁, 我们必须释放掉上一个才能继续工作。

创建索引的时候也会产生3,4级别的锁。

locked_mode为2,3,4不影响DML(insert,delete,update,select)操作,

但DDL(alter,drop等)操作会提示ora-00054错误。

有主外键约束时 update / delete ... ; 可能会产生4,5的锁。

DDL语句时是6的锁。

以DBA角色, 查看当前数据库里锁的情况可以用如下SQL语句:

select object_id,session_id,locked_mode from v$locked_object;

select t2.username,t2.sid,t2.serial#,t2.logon_time

from v$locked_object t1,v$session t2

where t1.session_id=t2.sid order by t2.logon_time;

如果有长期出现的一列,可能是没有释放的锁。

我们可以用下面SQL语句杀掉长期没有释放非正常的锁:

alter system kill session 'sid,serial#';

如果出现了锁的问题, 某个DML操作可能等待很久没有反应。

当你采用的是直接连接数据库的方式,

也不要用OS系统命令 $kill process_num 或者 $kill -9 process_num来终止用户连接,

因为一个用户进程可能产生一个以上的锁, 杀OS进程并不能彻底清除锁的问题。

记得在数据库级别用alter system kill session 'sid,serial#';杀掉不正常的锁。

解锁

用DBA用户登陆

查锁

select t2.username,t2.sid,t2.serial#,t2.logon_time

from v$locked_object t1,v$session t2

where t1.session_id=t2.sid order by t2.logon_time;

解锁

alter system kill session 'sid,serial#,'

表的锁定

锁的概念

锁出现在数据共享的场合,用来保证数据的一致性。当多个会话同时修改一个表时,需要对数据进行相应的锁定。

锁有“只读锁”、“排它锁”,“共享排它锁”等多种类型,而且每种类型又有“行级锁”(一次锁住一条记录),“页级锁”(一次锁住一页,即数据库中存储记录的最小可分配单元),“表级锁”(锁住整个表)。

排它锁和共享锁

排它锁又称为写锁((Exclusive lock,简记为X锁)),若事务T对数据对象A加上X锁,则只允许T读取和修改A,其它任何事务都不能再对A加任何类型的锁,直到T释放A上的锁。它防止任何其它事务获取资源上的锁,直到在事务的末尾将资源上的原始锁释放为止。在更新操作(INSERT、UPDATE 或 DELETE)过程中始终应用排它锁。

共享锁又称为读锁(Share lock,简记为S锁),若事务T对数据对象A加上S锁,则其它事务只能再对A加S锁,而不能加X锁,直到T释放A上的S锁。

共享锁:由非更新(读取)操作创建的锁。其他用户可以并发读取数据,但任何事务都不能获取数据上的排它锁,直到已释放所有共享锁。

若为“行级排它锁”,则除被锁住的行外,该表中其他行均可被其他的用户进行修改(Update)或删除(delete)。若为“表级排它锁”,则所有其他用户只能对该表进行查询(select)操作,而无法对其中的任何记录进行修改或删除。当程序对所做的修改进行提交(commit)或回滚(rollback)后,锁住的资源便会得到释放,从而允许其他用户进行操作。

有时,由于程序的原因,锁住资源后长时间未对其工作进行提交;或是由于用户的原因,调出需要修改的数据后,未及时修改并提交,而是放置于一旁;或是由于客户服务器方式中客户端出现“死机”,而服务器端却并未检测到,从而造成锁定的资源未被及时释放,影响到其他用户的操作。

如果两个事务,分别锁定一部分数据,而都在等待对方释放锁才能完成事务操作,这种情况下就会发生死锁。

隐式锁和显式锁

在Oracle数据库中,修改数据操作时需要一个隐式的独占锁,以锁定修改的行,直到修改被提交或撤销为止。如果一个会话锁定了数据,那么第二个会话要想对数据进行修改,只能等到第一个会话对修改使用COMMIT命令进行提交或使用ROLLBACK命令进行回滚撤销后,才开始执行。因此应养成一个良好的习惯:执行修改操作后,要尽早地提交或撤销,以免影响其他会话对数据的修改。

【训练1】  对emp表的SCOTT雇员记录进行修改,测试隐式锁。

步骤1:启动第一个SQL*Plus,以SCOTT账户登录数据库(第一个会话),修改SCOTT记录,隐式加锁。

UPDATE emp SET sal=3500 where empno=7788;

执行结果:

已更新 1 行。

步骤2:启动第二个SQL*Plus,以SCOTT账户登录数据库(第二个会话),进行记录修改操作。

UPDATE emp SET sal=4000 where empno=7788;

执行结果,没有任何输出(处于等待解锁状态)。

步骤3:对第一个会话进行解锁操作:

COMMIT;

步骤4:查看第二个会话,此时有输出结果:

已更新 1 行。

步骤5:提交第二个会话,防止长时间锁定。

说明:两个会话对同一表的同一条记录进行修改。步骤1修改SCOTT工资为3500,没有提交或回滚之前,SCOTT记录处于加锁状态。步骤2的第二个会话对SCOTT进行修改处于等待状态。

步骤3解锁之后(即第一个会话对SCOTT的修改已经完成),第二个会话挂起的修改此时可以执行。最后结果为第二个会话的修改结果,即SCOTT的工资修改为4000。读者可以使用查询语句检查。

以上是隐式加锁,用户也可以使用如下两种方式主动锁定行或表,防止其他会话对数据的修改。表3-3是对行或表进行锁定的语句。

表的显式锁定操作语句

select fror update   锁定表行,防止其他会话对行的修改

lock table 锁定表,防止其它会话话对表的修改

锁定行

【训练1】  对emp表的部门10的雇员记录加显式锁,并测试。

步骤1:对部门10加显式锁:

SELECT empno,ename,job,sal FROM emp WHERE deptno=10 FOR UPDATE;

结果为:

EMPNO ENAME   JOB              SAL

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

7782  CLARK    MANAGER        2450

7839  KING      PRESIDENT       5000

7934  MILLER    CLERK           1300

步骤2:启动第二个SQL*Plus(第二个会话),以SCOTT账户登录数据库,对部门10的雇员CLARK进行修改操作。

UPDATE emp SET sal=sal+100 where empno=7782;

执行结果:

没有任何输出(处于等待解锁状态)。

步骤3:在第一个会话进行解锁操作:

COMMIT;

步骤4:查看第二个会话,有输出结果:

已更新 1 行。

说明:步骤1对选定的部门10的雇员加锁,之后其他会话不能对部门10的雇员数据进行修改或删除。如果此时要进行修改或删除,则会处于等待状态。使用COMMIT语句进行解锁之后,如果有挂起的修改或删除操作,则等待的操作此时可以执行。

锁定表

LOCK语句用于对整张表进行锁定。语法如下:

LOCK TABLE 表名 IN {SHARE|EXCLUSIVE} MODE

对表的锁定可以是共享(SHARE)或独占(EXCLUSIVE)模式。共享模式下,其他会话可以加共享锁,但不能加独占锁。在独占模式下,其他会话不能加共享或独占锁。

【训练1】  对emp表添加独占锁。

步骤1:对emp表加独占锁:

LOCK TABLE emp IN EXCLUSIVE MODE;

结果为:

表已锁定。

步骤2:对表进行解锁操作:

COMMIT;

说明:当使用LOCK语句显式锁定一张表时,死锁的概率就会增加。同样地,使用COMMIT或ROLLBACK命令可以释放锁。

注意:必须没有其他会话对该表的任何记录加锁,此操作才能成功

快速删除ORACLE重复记录

*通过创建临时表来实现

create table temp_emp as (select distinct * from employee)

truncate table employee; (清空employee表的数据)

insert into employee select * from temp_emp;

*通过rowid来实现

delete from employee where rowid not in (

select max(t1.rowid) from employee t1 group by t1.emp_id,t1.emp_name,t1.salary);

Oracle中锁定用户以及解锁

操作用户必须有DBA权限

alter user test account lock;

alter user test account unlock;

Oracle 操作表总结

/*============创建Customer表==========*/

create table Customer

(

Customer_id number(6) not null,

Customer_name varchar2(50) not null,

Password varchar2(20) not null,

True_name varchar2(20),

Email_address varchar2(50) not null,       --唯一

Password_question varchar2(50) not null,

Password_anwser varchar2(50) not null,

Status char(1),                            --默认是1,取值0或1

Customer_level char(1),                    --默认是1,取值1,2,3

Score number(6),

Register_date date,                        --默认为系统时间

Login_time timestamp,

Login_count number(6),

Login_ip char(6)

);

/*===========创建Orders表==========*/

create table Orders

(

Order_id varchar2(10) not null,

Order_Customer_id number(6) not null,

Order_date date not null,

Order_price number not null

);

/*==========查询Customer表===========*/

select * from Customer

/*==========向表中添加数据===========*/

insert into Customer values

(220077,'wantingqiang','wtq','万廷强','lovezhqj@qq.com','你是哪个?','wtq','1','3',150,sysdate,sysdate,15789,'172.26')

/*==========修改表Customer===========*/

alter table Customer

modify Login_ip char(16);

/*=========修改第一条记录中的ip=====*/

update Customer set Login_ip='172.26.3.145' where Customer_id='220077';--ip地址修改成功

/*=========添加一个列===============*/

alter table Customer

add LoginOut_time date;                                             --新列增加成功

/*=========删除一个列LoginOut_time========*/

alter table Customer

drop column LoginOut_time;                                          --列删除成功

/*========给列添加注释===========*/

comment on column

Customer.Customer_Name is '客户姓名';

/*========给表添加注释==========*/

comment on table Customer is '客户表,为了保持与客户的联系';

/*========重新命名表============*/

alter table Customer rename to Customer_Change;

select * from Customer_Change

alter table Customer_Change rename to Customer;

/*==========添加非空约束========*/

alter table Customer

modify status not null;                                            --非空约束添加成功

/*==========添加主键约束========*/

alter table Customer

add constraint customer_id_pk primary key(Customer_id);            --主键添加成功

/*==========添加外键约束========*/

--向Orders表中添加外键,与Customer表关联

--在下面的列子末尾加上:

--on delete 表示允许级联删除

--on update 表示允许级联更新

alter table Orders

add constraint Orders_Customer_fk  foreign key(Order_Customer_id) references Customer(Customer_id);

--外键添加成功

/*==========删除外键约束=========*/

alter table Orders

drop constraint "ORDERS_CUSTOMER_FK";                              --外键删除成功,这个要注意大小写哈

/*=========添加唯一约束========*/

alter table Customer

add constraint un_email unique(Email_address);                     --添加唯一约束成功

/*=========修改默认约束========*/

alter table Customer

modify Status default('1');

/*=========添加检查约束========*/

alter table Customer

add constraint ck_status check(Status in ('1','0'));               --检查约束添加成功

/*==========禁止检查约束=======*/

alter table Customer

disable constraint ck_status;                                      --禁止成功

/*==========激活检查约束=======*/

alter table Customer

enable constraint ck_status;                                       --激活成功

/*==========删除检查约束========*/

alter table Customer

drop constraint ck_status;                                         --删除检查约束成功

/*==========最后事删除表========*/

drop table Customer;

从一个表中读取的数据插入到另外一张表中的sql语句

insert into 新表 select 字段1,字段2,字段3,字段4  from 旧表

insert into Customer  select * from Customer;

Delete与Truncate以及Drop的区别

truncate和不带where子句的delete, 以及drop都会删除表内的数据

1. truncate和 delete只删除数据不删除表的结构(定义)

drop语句将删除表的结构被依赖的约束(constrain),触发器(trigger),索引(index); 依赖于该表的存储过程/函数将保留,但是变为invalid状态.

2.delete语句是dml,这个操作会放到rollback segement中,事务提交之后才生效;如果有相应的trigger,执行的时候将被触发.

truncate,drop是ddl, 操作立即生效,原数据不放到rollback segment中,不能回滚. 操作不触发trigger.

3.delete语句不影响表所占用的extent, 高水线(high watermark)保持原位置不动

显然drop语句将表所占用的空间全部释放

truncate 语句缺省情况下见空间释放到 minextents个 extent,除非使用reuse storage;   truncate会将高水线复位(回到最开始).

4.速度,一般来说: drop> truncate > delete

5.安全性:小心使用drop 和truncate,尤其没有备份的时候.否则哭都来不及

使用上,想删除部分数据行用delete,注意带上where子句. 回滚段要足够大.

想删除表,当然用drop

想保留表而将所有数据删除. 如果和事务无关,用truncate即可. 如果和事务有关,或者想触发trigger,还是用delete.

如果是整理表内部的碎片,可以用truncate跟上reuse stroage,再重新导入/插入数据

Oracle常用表查询

--查看所有的数据文件

select * from DBA_DATA_FILES ;

--查看当前用户

select * from user_users;

--查看所有用户

select * from all_users;

--查看用户或角色系统权限

select * from user_sys_privs;

--查看角色所包含的权限

select * from role_sys_privs;

--查看所用的用户的可操作表权限

select * from all_tab_privs;

--查看当前用户的表可操作权限

select * from user_tab_privs;

---查看当前用户的角色

select * from user_role_privs;

--查看所有的表对象信息

select * from all_tables   ;

--查看当用户下的所有表

select * from user_tables   ;

--查看所有的sequences

select * from all_sequences;

--查看当用户下的sequences

select * from user_sequences;

--查看所有的view

select *  from all_views;

--查看当用户下的view

select *  from user_views;

--查看所有的数据库对象索引的信息

select * from all_indexes  ;

--查看当前的数据库对象索引的信息

select * from user_indexes  ;

--sys用户查看任一用户的权限和角色

select * from dba_tab_privs;

select * from dba_role_privs;

--查看某表的创建时间

select * from  user_objects where OBJECT_NAME=upper('cbe_subscriber');

--查看表的大小

select sum(bytes)/(1024*1024) as "size(M)" from user_segments where segment_name=upper('cbe_subscriber');

--查看某表的约束条件

select constraint_name, constraint_type,search_condition, r_constraint_name from user_constraints where table_name = upper('cbe_subscriber');

Oracle中tableSpace操作

*创建临时表空间

create temporary tablespace test_temp

tempfile 'E:/oracle/product/10.1.0/oradata/orcl/test_temp01.dbf'

size 32m

autoextend on next 32m maxsize 2048m extent management local;

*创建用户表间

create tablespace test_data

logging datafile 'E:/oracle/product/10.1.0/oradata/orcl/test_temp01.dbf'

size 32m

autoextend on next 32m maxsize 2048m extent management local;

*重设表间大小

有两种方法,一种是为表空间增加数据文件

alter tablespace tablespace_name add datafile 'filepath' size filesize autoextend on next autosize maxsize filemaxsize

  alter tablespace users add datafile 'E:/oracle/ora81/oradata/sid/user002.dbf' size 100M;

 另一种方法是增加表空间原有数据文件尺寸:

alter database datafile 'filepath' resize filesize

alter database datafile 'c:/oracle/ora81/oradata//sid/users.dbf' resize 1000M;

  alter database datafile 'c:/oracle/ora81/oradata//sid/users.dbf' resize 1000M;

*关闭表空间的自动扩展属性

alter database datafile 'filepath' autoextend off

*打开表空间的自动扩展属性

alter database datafile 'filepath' autoextend on

*使表空间脱机

alter tablespace tablespace_name offline

*使表空间联机

alter tablespace tablespace_name online

*设置表空间为只读

alter tablespace tablespace_name read only

*设置表空间为读写

alter tablespace tablespace_name read write

*删除表空间

drop tablespace tablespace_name

*删除表空间的同时,删除数据文件

drop tablespace tablespace_name including contents and datefiles

*移动表空间数据文件步骤

a.使表空间脱机:

alter tablespace tablespace_name offline

b.物理移动数据文件到目的地(可以是表空间的部分数据文件或者是修改数据文件的名称)

c.逻辑移动:alter tablespace tablespace_name rename datafile '源文件地址'to '目的文件地址'--注意可以将多个源文件转移到同一个目的文件地址(多个源文件地址用逗号分隔)

d.将表空间联机:alter tablespace tablespace_name online

*查看表空间使用状况

select a.a1 表空间名称,c.c2 类型,c.c3 区管理,b.b2/1024/1024 表空间大小M,(b.b2-a.a2)/1024/1024 已使用M,substr((b.b2-a.a2)/b.b2*100,1,5) 利用率

from

(select  tablespace_name a1, sum(nvl(bytes,0)) a2 from dba_free_space group by tablespace_name) a,

(select tablespace_name b1,sum(bytes) b2 from dba_data_files group by tablespace_name) b,

(select tablespace_name c1,contents c2,extent_management c3  from dba_tablespaces) c

where a.a1=b.b1 and c.c1=b.b1;

*查看表空间对应的文件

select * from dba_data_files

Oracle用户管理

文章分类:数据库

下面介绍下 oracle10g 创建用户

创建用户步骤:

* 连接到sqlplus

打开“运行”,输入“sqlplus "as sysdba"” 回车,用户名 sys,密码 ******,登陆成功;

* 创建用户(同时分配空间,解除锁定)

create user userdb identified by ****** DEFAULT TABLESPACE **** quota unlimited on system account unlock;

* 授权 连接、操作 权限

grant connect,resource to userdb;

grant dba to userdb ; --授予DBA权限

grant unlimited tablespace to userdb ;--授予不限制的表空间

grant select any table to userdb ; --授予查询任何表

grant select any dictionary to userdb ;--授予 查询任何字典

grant create view to userdb ; --创建视图

* 撤权:

revoke   权限 from  用户名;

删除用户

drop user username(用户名) cascade;

Linux下启动与关闭Oralce 10G

启动

1.切换到oracle用户:

su - oracle

2.启动监听:

lsnrctl start

3.进入sqlplus:

sqlplus / as sysdba

4.启动数据库:

startup

关闭

shutdown

shutdown的参数

Normal 需要等待所有的用户断开连接

Immediate 等待用户完成当前的语句

Transactional 等待用户完成当前的事务

Abort 不做任何等待,直接关闭数据库

normal需要在所有连接用户断开后才执行关闭数据库任务,所以有的时候看起来好象命令没有运行一样!在执行这个命令后不允许新的连接

immediate在用户执行完正在执行的语句后就断开用户连接,并不允许新用户连接。

transactional 在拥护执行完当前事物后断开连接,并不允许新的用户连接数据库。

abort 执行强行断开连接并直接关闭数据库。

前三种方式不回丢失用户数据。第四种在不的已的情况下,不建议采用!

Oracle时间操作

http://yjlogo.javaeye.com/blog/196720

http://www.javaeye.com/topic/150762

http://jinyan798.javaeye.com/blog/335497

http://wallimn.javaeye.com/blog/481016

http://jinguo.javaeye.com/blog/336548

oracle基本操作

http://www.blogjava.net/WshmAndLily/articles/144115.html

Oralce中关于表和索引的表移动表空间

1、查询当前用户下的所有表

select 'alter table  '|| table_name ||'  move tablespace tablespacename;'  from user_all_tables;

2、查询当前用户下的所有索引

select 'alter index '|| index_name ||' rebuild tablespace tablespacename;' from user_indexes;

3.表查询到的结果中,把tablespace换成具体的名称

ALTER TABLE ANWEI  MOVE TABLESPACE CBS_DEFAULT_DAT;

ALTER INDEX IDX_CUSTOMERE REBUILD TABLESPACE CBS_DEFAULT_DAT;

移动表或索引带来的问题

表移动到表空间时,可能会引起索引失效,对数据库操作报ORA-01502

解决办法

查看索引是否有效

select index_name,index_type,tablespace_name,status from user_indexes

如果有索引的STATUS为UNUSABLE,解决办法

alter index *** rebuild

其中***为失效的索引

忘记Oracle密码时,修改用户密码

Oracle提供两种验证方式,一种是OS验证,另一种密码文件验证方式

第一种方式的修改

1、控制面板->管理工具->服务 中打开

OracleOraHome92TNSListener服务

和OracleServiceORACLE(ORACLE可能在具体的系统中名称不一样,他与你装Oracle时指定的名称有关)服务

2、打开命令行,在命令行中输入:

sqlplus "/ as sysdba"

注意:以上的引号是必不可少的

*上指示的ORACLE就是服务名即OracleService后面的部分

3、在SQL>后面输入:

alter user system identified by password(密码);

4、SQL>后输入:

commit;

5、试验成果

第二种方式的修改

orapwd file=pwdxxx.ora password=你设定的新密码 entries=10

设定完后,重新启动服务,再次登陆就可以了。

Oracle数据库自动增长列的实现过程:

◆1.创建序列

-- Create sequence

create sequence INNERID

minvalue 1

maxvalue 99999999999999

start with 1

increment by 1

cache 20

order;

◆2.--INNERID.currval 指当前序列

--INNERID.nextval 指下一个序列

create table admin

(id varchar2(20),name varchar2(10));

insert into admin values (INNERID.nextval,'a');

insert into admin values (INNERID.nextval,'b');

insert into admin values (INNERID.nextval,'c');

insert into admin values (INNERID.nextval,'d');

--不断的插入序列的下一个值.

◆3.创建触发器(注:此处无法设置id的默认值为INNERID.nextval )

CREATE OR REPLACE TRIGGER admin_tg

--admin id 的触发器

BEFORE INSERT ON admin FOR EACH ROW

BEGIN

SELECT INNERID.NEXTVAL INTO :NEW.id FROM DUAL;

END;

insert into admin (username) values ( 'zdz');

informix和oracle锁表解锁

文章分类:数据库

Oracle 和 Informix 数据库的锁收藏

对于informix数据库

选择sysmaster数据库

select * from syslocks; 查到锁表的owner

然后在informix下onmode -z owner;

对于Oracle数据库的锁:

查看被锁的表:

select   p.spid,c.object_name,b.session_id,b.oracle_username,b.os_user_name

from   v$process   p,v$session   a,   v$locked_object   b,all_objects   c

where   p.addr=a.paddr

and   a.process=b.process

and   c.object_id=b.object_id  ;

解锁:

alter system kill session '146';(其中146为锁住的进程号)

oracle的经典总结相关推荐

  1. [转载]oracle常用经典SQL查询

    原文地址:oracle常用经典SQL查询作者:来者 oracle常用经典SQL查询 1.查看表空间的名称及大小  select t.tablespace_name, round(sum(bytes/( ...

  2. oracle入门很简单豆瓣,Oracle入门经典

    <Oracle入门经典>以初学者为核心,全面介绍了Oracle数据库管理与开发相关的各种技术.在内容排列上由浅入深,让读者循序渐进地掌握Oracle数据库技术:在内容讲解上结合丰富的图解和 ...

  3. oracle中右击出现的含义,Oracle中经典的问题解决方案-Oracle

    对于 Oracle 数据库的开发,我们可能有时候会遇到一些奇怪的问题,与其它数据库存在不同的差异的问题,在这里我列举了一些比较有趣的问题 问题一:解决Oracle中时间问题 Oracle默认date类 ...

  4. Oracle GoldenGate经典架构

    可以使用Oracle GoldenGate Classic Architecture从命令行配置和管理数据复制. 图示的说明logicalarch2.png 注意: 这是基本配置.根据业务需求和用例, ...

  5. oracle数据库经典练习题及答案

    最近下载了一套oracle数据库习题(无答案),本人自己在oracle上练习得到的答案,如果不对的地方,请不要见怪.保存到博客方便自己以后查阅. 相关表: /*学生表*/ create table s ...

  6. oracle数据库课后习题答案,oracle数据库经典练习题及答案

    最近下载了一套oracle数据库习题(无答案),本人自己在oracle上练习得到的答案,如果不对的地方,请不要见怪.保存到博客方便自己以后查阅. 相关表: /*学生表*/ create table s ...

  7. 中移动Oracle,Oracle中国移动经典面试题(附代码跟两种答案)

    /* 中国移动sql面试题: create table test( id number(10) primary key, type number(10) , t_id number(10), valu ...

  8. Oracle DBA 经典面试题

    1.输出100以内的所有素数 DECLAREZ INT; BEGINFOR X IN 2 .. 100 LOOPIF X = 2 THENDBMS_OUTPUT.PUT_LINE(X);ELSIF X ...

  9. Oracle数据库经典案例之学生选课四表联合查询

    四表联合查询之学生选课查询 问题及描述: 学生和成绩表 学生是主表,成绩是子表 课程和成绩表 课程是主表,成绩是子表 老师和课程表 老师是主表,课程是子表 1.学生表 Student(S#,Sname ...

最新文章

  1. 如何解决CentOS下使用yum安装python-pip失败
  2. 一图看懂《中关村人工智能产业培育行动计划》
  3. Android跨进程通信二——AIDL
  4. word-breakword-wrap
  5. 【Python】Python基础
  6. javascript之变量
  7. STM32——SPI接口
  8. java数据库的量级_程序员学Python还是Java?分析了8张图后得出这个结论
  9. 剑指offer值二叉树的下一个结点
  10. 阶段5 3.微服务项目【学成在线】_day05 消息中间件RabbitMQ_3.RabbitMQ研究-工作原理...
  11. 项目:心肺复苏按压仪+沁恒赤兔ch32v307+嵌入式开发
  12. Farrago for Mac 1.1.0 音频效果和音乐剪辑工具 破解版下载
  13. 电脑版微信提示音mp3_安卓充电提示音修改教程,可以自定义哦~
  14. MySql新增、修改、删除表字段、字段数据类型、长度等(附带各种实际案例语句)
  15. 震撼的真相,这些照片告诉你什么叫“色即是空”
  16. 双目视觉(五)立体匹配算法之动态规划全局匹配
  17. 第一章cp2102 USB to UART controller 的安装
  18. 如何成为一名软件测试高手? 月薪3K到17K,我做了什么?
  19. 基于docker的高可用openldap(包含lam-admin网页和sudo,ppolicy模块)
  20. 行锁(锁住的是一行记录)

热门文章

  1. 以YOLOv5为基准实现布匹缺陷检测(Fabric Defect Detection)
  2. 简单认识一下苹果笔记本以及使用MBP开发一年的心得体会
  3. Python:画三角形
  4. app inventor+tinywebDB远程控制掌控板
  5. TVS管和稳压管两者比较
  6. 平面设计师怎么找素材?
  7. Stability Analysis Of Voltage-Feedback Op Amps,Including Compensation Technique
  8. EDA技术与应用上机任务 电子信息类 Quartus II或Quartus Prime D触发器、半减器、全减器、可加减控制的50进制加减计数器。
  9. poj1125 Stockbroker Grapevine Floyd算法
  10. 使用echarts生成漂亮的3D地图