`

oracle结合序列和触发器生成表的主键

阅读更多

/***
*@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自增序列和触发器生成工具.zip

    总的来说,"Oracle自增序列和触发器生成工具"是数据库开发者的实用工具,它简化了在Oracle数据库中创建和管理自增序列及触发器的过程,使得数据表的设计和维护变得更加高效。通过熟练掌握和使用这样的工具,开发者...

    详解Oracle序列和触发器的使用

    序列用于生成唯一的整数序列,常作为主键,而触发器则允许在特定事件发生时自动执行代码,两者结合可以实现数据的自动管理和更新,提高数据管理的效率和准确性。正确理解和使用这些概念,对于优化Oracle数据库的应用...

    oracle快速批量生成表和触发器和序列.zip

    3. **序列(Sequence)**:Oracle序列是一种自增数字生成器,常用于生成唯一的ID,尤其是在没有自动增长字段的表中。使用`CREATE SEQUENCE`语句可以创建序列,可以指定初始值、增长步长、是否循环等属性。批量生成...

    oracle触发器实现主键自动增长

    总之,通过Oracle的触发器和序列,我们可以轻松地实现主键的自动增长,这不仅简化了数据管理流程,也提高了数据的一致性和安全性。然而,在具体应用中,还需根据实际业务需求和系统环境,合理设计和优化触发器与序列...

    powerdesigner创建oracle_数据库表,设置表主键列为自动增长

    - 执行这些脚本来创建表、序列和触发器。 #### 六、测试自动增长功能 1. **插入新记录:** - 在Oracle客户端中,向创建的表中插入新记录。 - 观察主键列是否按预期自增。 示例SQL脚本: ```sql CREATE TABLE...

    oracle序列和触发器的建立

    ### Oracle序列和触发器的建立 #### 序列(Sequence) 在Oracle数据库中,序列是一种自动产生数值的对象,常用于为主键字段提供唯一值。序列主要用于实现表中的自增ID功能,例如,当用户需要为某张表的主键设置自...

    Oracle数据库表序列ID自增生成器

    总结来说,Oracle数据库表序列ID自增生成器结合了序列和触发器的概念,实现了主键ID的自动增长。这种机制在处理大量数据和并发操作时,能确保数据的完整性和一致性。了解并熟练运用这些知识点,对于进行高效的Oracle...

    oracle通过触发器,实现序列自增

    #### 一、理解Oracle序列 在开始之前,首先需要了解Oracle中的序列。序列是一个数据库对象,它能够生成连续的整数序列。序列主要用于当需要为表中的某列自动生成唯一值时。例如,在插入新记录时,可以使用序列生成...

    如何实现Oracle自增,序列,触发器都有

    这种结合使用序列和触发器的方法是Oracle中一种常见的主键自增实现方式。它不仅确保了主键的唯一性和连续性,还大大提高了数据插入效率。在实际应用中,根据具体需求调整序列的参数以及触发器的逻辑是非常重要的。...

    SQL语句_设置序列和触发器

    这些序列和触发器的设计思路一致,都是为了确保每个表的主键能够自动且唯一地生成。 #### 四、总结 通过以上介绍可以看出,序列和触发器是数据库中非常实用的功能,可以帮助开发者实现更高效的数据管理和操作。...

    oracle数据库主键自动生成

    Oracle 数据库主键自动生成 在 Oracle 数据库中,主键自动生成是指在插入数据时自动生成唯一的主...Oracle 数据库主键自动生成可以通过序列和触发器来实现,简化了数据录入和维护工作,并提高了数据的一致性和安全性。

    创建Oracle触发器用于表中序列值自增长(Helloblock写作)

    在Oracle数据库中,为了实现表中某个字段的自动递增功能,通常会使用序列(sequence)结合触发器(trigger)的方式来完成。这种方式不仅能够确保数据的一致性和完整性,还能提高数据处理效率。本文将详细解释如何...

    Oracle数据库创建表tuser设置主键自动增长

    本篇详细介绍了如何在Oracle数据库中创建一张包含自动增长主键的表`tuser`,并通过创建序列和触发器实现了这一功能。这种做法不仅能够简化主键管理的工作量,还能够确保数据的一致性和完整性。对于实际应用来说,这...

    创建oracle数据库中表的主键和自增

    ### 创建Oracle数据库中表的主键和自增 在Oracle数据库中实现自增主键是一项常见但非常重要的功能。这不仅有助于确保数据的唯一性,还能简化开发过程中的某些环节,尤其是在需要自动增长的主键时。下面将详细介绍...

    oracle设置主外键即主键序列自动增长

    下面将详细介绍如何在Oracle中创建包含主键和外键的表,并利用触发器(Trigger)和序列实现主键的自动增长。 #### 一、创建包含主键和外键的表 首先,我们来看一下创建包含主键和外键的表的基本语法和步骤。 ####...

    Oracle存储过程和触发器实例

    序列在Oracle中提供了一种方便的方式来生成主键或其他唯一标识符。序列可以设置最小值、最大值、初始值和增量。 ```sql create sequence TEST_SEQ minvalue 100 maxvalue 999 start with 102 increment by 1 no...

    Oracle数据库中主键的智能生成.pdf

    总的来说,Oracle数据库中智能生成主键通常涉及序列和触发器的结合使用,通过序列保证生成的主键值唯一,通过触发器在插入新行时自动设置主键值。在处理并发插入时,还需要考虑锁定机制以防止主键冲突。这种方案虽然...

    Oracle复制表数据的两种用法

    在本文中,我们将深入探讨Oracle复制表数据的两种主要方法,并结合提供的“测试插入.sql”文件,理解其在实际操作中的应用。 首先,让我们了解第一种方法:使用`INSERT INTO SELECT`语句。这种方法适用于将一个表的...

    oracle 触发器方式实现行ID自增加

    总结起来,Oracle数据库通过触发器和序列对象相结合,能有效实现行ID的自增加功能。这种技术在需要自动维护唯一标识符的场景下非常实用,例如主键列。但需要注意的是,过度使用触发器可能会影响数据库性能,因此在...

    oracle主键自动增长

    #### 一、Oracle序列(Sequence)的使用方法 在Oracle数据库中,并没有像MySQL那样的自动增长字段特性,因此在实际应用中,我们常常需要手动实现这一功能。序列(Sequence)是Oracle提供的一种用于生成一系列唯一...

Global site tag (gtag.js) - Google Analytics