/***
*@PARAM STNAME 不要创建序列的表,多个表则以“,”隔开
**/
CREATE OR REPLACE PROCEDURE PROC_CREATE_SEQ_TRIG(STNAME IN VARCHAR2)
AS
STRSQL VARCHAR2(4000);
TABLENAME VARCHAR2(50);
PID VARCHAR2(50);
PIDTYPE VARCHAR2(50);
MAX_ID NUMBER(20);
CNT NUMBER(20);
CURSOR CUR IS
SELECT TABLE_NAME FROM USER_TABLES;
BEGIN
--创建HIBERNATE 专用序列
SELECT COUNT(*) INTO CNT FROM USER_SEQUENCES T WHERE T.SEQUENCE_NAME = 'HIBERNATE_SEQUENCE';
IF (CNT = 0) THEN
STRSQL := 'CREATE SEQUENCE HIBERNATE_SEQUENCE INCREMENT BY 1 START WITH 1 ORDER MAXVALUE 999999999999999 CYCLE CACHE 10';
EXECUTE IMMEDIATE STRSQL;
END IF;
OPEN CUR;
LOOP
FETCH CUR INTO TABLENAME;
--判断当前表是否需要创建序列
SELECT INSTR(UPPER(STNAME),TABLENAME) INTO CNT FROM DUAL;
IF(CNT = 0) THEN
--判断当前表是否存在主键
SELECT COUNT(*) INTO CNT FROM USER_CONS_COLUMNS WHERE CONSTRAINT_NAME = (SELECT CONSTRAINT_NAME FROM USER_CONSTRAINTS
WHERE TABLE_NAME = TABLENAME AND CONSTRAINT_TYPE = 'P');
IF CNT = 1 THEN
--获取当前表的主键名称
SELECT COLUMN_NAME INTO PID FROM USER_CONS_COLUMNS WHERE CONSTRAINT_NAME = (SELECT CONSTRAINT_NAME FROM USER_CONSTRAINTS
WHERE TABLE_NAME = TABLENAME AND CONSTRAINT_TYPE = 'P');
--获取主键的数据类型
SELECT DATA_TYPE INTO PIDTYPE FROM USER_TAB_COLS WHERE TABLE_NAME = TABLENAME AND COLUMN_NAME = PID;
IF (PID IS NOT NULL AND PIDTYPE = 'NUMBER') THEN
--判断当前序列是否存在
SELECT COUNT(*) INTO CNT FROM USER_SEQUENCES T WHERE T.SEQUENCE_NAME = 'SEQ_' || TABLENAME;
IF (CNT = 0) THEN
--获取当前表主键的最大值
STRSQL := 'SELECT MAX('|| PID ||') FROM '|| TABLENAME;
EXECUTE IMMEDIATE STRSQL INTO MAX_ID;
IF MAX_ID IS NULL THEN
MAX_ID := 1;
ELSE
MAX_ID := MAX_ID + 1;
END IF;
--根据最大值创建序列
STRSQL := 'CREATE SEQUENCE SEQ_' || TABLENAME || ' INCREMENT BY 1 START WITH ' || MAX_ID || ' NOMAXVALUE NOCYCLE CACHE 10';
DBMS_OUTPUT.put_line(STRSQL);
EXECUTE IMMEDIATE STRSQL;
--创建触发器
STRSQL := 'CREATE OR REPLACE TRIGGER TRIG_' || TABLENAME || ' BEFORE INSERT ON '|| TABLENAME ||' FOR EACH ROW BEGIN IF INSERTING THEN
SELECT SEQ_' || TABLENAME || '.NEXTVAL INTO :NEW.' || PID || ' FROM DUAL; END IF; END;';
EXECUTE IMMEDIATE STRSQL;
END IF;
END IF;
END IF;
ELSE
--判断当前序列或触发器是否存在,如果存在则删除
SELECT COUNT(*) INTO CNT FROM USER_SEQUENCES T WHERE T.SEQUENCE_NAME = 'SEQ_' || TABLENAME;
IF (CNT > 0) THEN
STRSQL := 'DROP SEQUENCE SEQ_' || TABLENAME;
EXECUTE IMMEDIATE STRSQL;
END IF;
SELECT COUNT(*) INTO CNT FROM USER_TRIGGERS T WHERE T.TRIGGER_NAME = 'TRIG_' || TABLENAME;
IF (CNT > 0) THEN
STRSQL := 'DROP TRIGGER TRIG_' || TABLENAME;
EXECUTE IMMEDIATE STRSQL;
END IF;
END IF;
EXIT WHEN CUR%NOTFOUND;
END LOOP;
CLOSE CUR;
END PROC_CREATE_SEQ_TRIG;
/
--为当前用户授予动态创建序列和触发器的权限
CONN SYS/ORCL@ORCL AS SYSDBA;
GRANT CREATE ANY SEQUENCE TO ESTATE_TM;
GRANT CREATE ANY TRIGGER TO ESTATE_TM;
CONN ESTATE_TM/ESTATE@ORCL;
--创建序列和触发器
DECLARE
STRFORM VARCHAR2(4000);
BEGIN
STRFORM := 'DF_AFORM,DF_BIGOPT,DF_CITY,DF_FORM,DF_GRANTRIGHT,DF_HOLIDAY,DF_MENU,DF_PARAMETERS,DF_REPORT,
DF_RMENU,DF_RREPORT,DF_RRIGHT,DF_SFORM,DF_SMLOPT,DF_UINPUTOPT,DF_UMENU,DF_UREPORT,DF_URIGHT,WF_GRANTRIGHT,
WF_OMSG,WF_RRIGHT,WF_SFORM,WF_URIGHT';
PROC_CREATE_SEQ_TRIG(STRFORM);
END;
/
分享到:
相关推荐
总的来说,"Oracle自增序列和触发器生成工具"是数据库开发者的实用工具,它简化了在Oracle数据库中创建和管理自增序列及触发器的过程,使得数据表的设计和维护变得更加高效。通过熟练掌握和使用这样的工具,开发者...
序列用于生成唯一的整数序列,常作为主键,而触发器则允许在特定事件发生时自动执行代码,两者结合可以实现数据的自动管理和更新,提高数据管理的效率和准确性。正确理解和使用这些概念,对于优化Oracle数据库的应用...
3. **序列(Sequence)**:Oracle序列是一种自增数字生成器,常用于生成唯一的ID,尤其是在没有自动增长字段的表中。使用`CREATE SEQUENCE`语句可以创建序列,可以指定初始值、增长步长、是否循环等属性。批量生成...
总之,通过Oracle的触发器和序列,我们可以轻松地实现主键的自动增长,这不仅简化了数据管理流程,也提高了数据的一致性和安全性。然而,在具体应用中,还需根据实际业务需求和系统环境,合理设计和优化触发器与序列...
- 执行这些脚本来创建表、序列和触发器。 #### 六、测试自动增长功能 1. **插入新记录:** - 在Oracle客户端中,向创建的表中插入新记录。 - 观察主键列是否按预期自增。 示例SQL脚本: ```sql CREATE TABLE...
### Oracle序列和触发器的建立 #### 序列(Sequence) 在Oracle数据库中,序列是一种自动产生数值的对象,常用于为主键字段提供唯一值。序列主要用于实现表中的自增ID功能,例如,当用户需要为某张表的主键设置自...
总结来说,Oracle数据库表序列ID自增生成器结合了序列和触发器的概念,实现了主键ID的自动增长。这种机制在处理大量数据和并发操作时,能确保数据的完整性和一致性。了解并熟练运用这些知识点,对于进行高效的Oracle...
#### 一、理解Oracle序列 在开始之前,首先需要了解Oracle中的序列。序列是一个数据库对象,它能够生成连续的整数序列。序列主要用于当需要为表中的某列自动生成唯一值时。例如,在插入新记录时,可以使用序列生成...
这种结合使用序列和触发器的方法是Oracle中一种常见的主键自增实现方式。它不仅确保了主键的唯一性和连续性,还大大提高了数据插入效率。在实际应用中,根据具体需求调整序列的参数以及触发器的逻辑是非常重要的。...
这些序列和触发器的设计思路一致,都是为了确保每个表的主键能够自动且唯一地生成。 #### 四、总结 通过以上介绍可以看出,序列和触发器是数据库中非常实用的功能,可以帮助开发者实现更高效的数据管理和操作。...
Oracle 数据库主键自动生成 在 Oracle 数据库中,主键自动生成是指在插入数据时自动生成唯一的主...Oracle 数据库主键自动生成可以通过序列和触发器来实现,简化了数据录入和维护工作,并提高了数据的一致性和安全性。
在Oracle数据库中,为了实现表中某个字段的自动递增功能,通常会使用序列(sequence)结合触发器(trigger)的方式来完成。这种方式不仅能够确保数据的一致性和完整性,还能提高数据处理效率。本文将详细解释如何...
本篇详细介绍了如何在Oracle数据库中创建一张包含自动增长主键的表`tuser`,并通过创建序列和触发器实现了这一功能。这种做法不仅能够简化主键管理的工作量,还能够确保数据的一致性和完整性。对于实际应用来说,这...
### 创建Oracle数据库中表的主键和自增 在Oracle数据库中实现自增主键是一项常见但非常重要的功能。这不仅有助于确保数据的唯一性,还能简化开发过程中的某些环节,尤其是在需要自动增长的主键时。下面将详细介绍...
下面将详细介绍如何在Oracle中创建包含主键和外键的表,并利用触发器(Trigger)和序列实现主键的自动增长。 #### 一、创建包含主键和外键的表 首先,我们来看一下创建包含主键和外键的表的基本语法和步骤。 ####...
序列在Oracle中提供了一种方便的方式来生成主键或其他唯一标识符。序列可以设置最小值、最大值、初始值和增量。 ```sql create sequence TEST_SEQ minvalue 100 maxvalue 999 start with 102 increment by 1 no...
总的来说,Oracle数据库中智能生成主键通常涉及序列和触发器的结合使用,通过序列保证生成的主键值唯一,通过触发器在插入新行时自动设置主键值。在处理并发插入时,还需要考虑锁定机制以防止主键冲突。这种方案虽然...
在本文中,我们将深入探讨Oracle复制表数据的两种主要方法,并结合提供的“测试插入.sql”文件,理解其在实际操作中的应用。 首先,让我们了解第一种方法:使用`INSERT INTO SELECT`语句。这种方法适用于将一个表的...
总结起来,Oracle数据库通过触发器和序列对象相结合,能有效实现行ID的自增加功能。这种技术在需要自动维护唯一标识符的场景下非常实用,例如主键列。但需要注意的是,过度使用触发器可能会影响数据库性能,因此在...
#### 一、Oracle序列(Sequence)的使用方法 在Oracle数据库中,并没有像MySQL那样的自动增长字段特性,因此在实际应用中,我们常常需要手动实现这一功能。序列(Sequence)是Oracle提供的一种用于生成一系列唯一...