表加序列3种方法及lock处理

SQL> create sequence seq1;

Sequence created.

SQL> set long 2000;

SQL> select dbms_metadata.get_ddl('SEQUENCE','SEQ1','HR') from dual;  查下默认序列号产生了什么

也证明了默任是nocycle也就是达到大值会出现错误

DBMS_METADATA.GET_DDL('SEQUENCE','SEQ1','HR')

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

 

   CREATE SEQUENCE  "HR"."SEQ1"

 MINVALUE 1             最小

MAXVALUE 9999999999999999999999999999  最大

INCREMENT BY 1   增加

START WITH 1    开始

CACHE 20    缓存增加性能如异常会产生断号

NOORDER   不集群

NOCYCLE  不循环

NOKEEP   ?

NOSCALE   ?

GLOBAL

 

SQL> alter sequence seq1 cache 30;

Sequence altered.

 

SQL> drop sequence seq1;

Sequence dropped.

 

 

Select sequencename.nextval from dual;

这个是下一个,在不同会话预期结果都是下一个,数据会全局增加

 

 

Select sequencename.currval from dual;

而虽然是当前的值,但是它只代表的是当前会话中的值(实际中用的会非常少了)

 

方法一

SQL> create table orders (order_id number(10),order_date date,customer_id varchar2(5));

Table created.

SQL> create sequence order_seq start with 10;

Sequence created.

insert into orders (order_id,order_date,customer_id) values(order_seq.nextval,sysdate,1000);

SQL> select * from orders;

  ORDER_ID ORDER_DATE        CUSTOMER_I

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

10 07-FEB-21        1000

SQL>  insert into orders (order_id,order_date,customer_id) values(order_seq.nextval,sysdate,1001);

1 row created.

SQL> select * from orders;

  ORDER_ID ORDER_DATE        CUSTOMER_I

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

10 07-FEB-21        1000

11 07-FEB-21        1001

这样就让Order表的Order_id序列递增了

 

方法二

SQL> create  table orders (order_id number(10),order_date date,customer_id varchar2(5));

Table created.

 

insert into orders (order_id,order_date,customer_id) values((select max(order_id)+1 from orders),sysdate,'1000');

Update orders set order_id=1 where order_id is null;

 

 

 

 

方法三

只时候oracle 12及以后版本

SQL> create table orders2(id number generated by default as identity,name varchar2(100));

 

Table created.

 

SQL> insert into orders2(name) values('p1');

SQL> insert into orders2(name) values('p1');  不给值用默认值

SQL> insert into orders2(id,name) values('5','p1'); 给值就用给的值

SQL> insert into orders2(name) values('p1');  不给值用默认值,而且与人工输入的值没关系只与自动产生的值去相加

SQL> select * from orders2;

1 p1

2 p1

5 p1

3 p1

 

SQL> create table orders3(id number generated always,name varchar2(10));

create table orders3(id number generated always,name varchar2(10))

                                               *

ERROR at line 1:

ORA-02000: missing AS keyword

SQL> create table orders3(id number generated always as identity,name varchar2(10));

Table created.

SQL> insert into orders3(id,name) values(1,'a');  给值就报错只能总数系统本身产生序号

insert into orders3(id,name) values(1,'a')

                    *

ERROR at line 1:

ORA-32795: cannot insert into a generated always identity column

SQL> insert into orders3(name) values('a');

1 row created.

SQL> select * from orders3;

ID NAME

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

 1 a

以上方法2,可能会产生资源冲突。方法3只有新版本支持。

 

发现删除表的时候提示忙,正好处理下

SQL> drop table orders;

drop table orders

           *

ERROR at line 1:

ORA-00054: resource busy and acquire with NOWAIT specified or timeout expired

 

SQL> 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;  2    3 

 

USERNAME        SID    SERIAL#        LOGON_TIME

HR                      83        38136           07-FEB-21

 

SQL> select sql_text from v$session a,v$sqltext_with_newlines b

  where DECODE(a.sql_hash_value, 0, prev_hash_value, sql_hash_value)=b.hash_value

  and a.sid=&sid order by piece;     83

 

SQL_TEXT

select * from orders

 

SQL> alter system kill session '83,38136';

 

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值