ORACLE 自动增长通过封装函数,方便调用

  好的编程习惯,是一个很有必要的过程。好的编程习惯,可以因人而异,但是简单地、基本地代码级别的就那些:写注释、合理的缩进、换行、变量命名等。

  对我们程序员来说,大部分时间都对着电脑,在对着电脑的大部分时间都在对着代码,要么是看别人代码,要么是在写代码。在看别人的代码的过程中,当看到别人 的代码很乱的时候,心里肯定会说,这他妈的谁写的代码,看起来真费劲,要注释没注释,该换行的时候没换行,缩进也没规则。所以,好的编程习惯,一个好处就是,方便自己,也方便别人看自己的代码。编程的时候很多情况是由于一些细节没有注意。在自己代码走读的过程成中会出现对应错误,良好的代码习惯,也有利于问题代码能快速的定位。好的编程习惯,好处就是,可以避免一些问题的发生,从而提高工作效率。

  一般情况下我们的ORACLE 使用关键字上要使用大写的,这样有利于 编程规范,所以这边提供一个小技巧:

  在PL/SQL Tool -> Preferences 中的:

  

Oracle 数据库中,创建一个表的过程,并且其中主键是自动增长的,因为ORACLE 不提供自动增长的自主id,所以,需要我们自己先创建序列然后在调用序列的方法实现自动增长一般过程如下:

-- Create table

CREATE TABLE T_Test(

        test_id INTEGER CONSTRAINT t_test_pk PRIMARY KEY,

        name VARCHAR2(10) NOT NULL

);      

-- Add comments to the table

COMMENT ON TABLE T_Test

  is ‘测试表‘;

-- Add comments to the columns

COMMENT ON COLUMN  T_Test.test_id

  is ‘自增主键‘;

COMMENT ON COLUMN  T_Test.name

  is ‘名称‘;

-- Create/Sequences

CREATE SEQUENCE SEQ_T_Test MINVALUE 1 MAXVALUE 1E27 START WITH 1 INCREMENT BY 1 NOCACHE CYCLE;

--insert

INSERT INTO t_test(test_id,NAME)VALUES(seq_t_test.nextval,‘linkepeng‘);

每次我这样插入数据的时候,如果开始的时候,没有创建对应的序列的化,我们还要先创建,而且,有可能命名冲突,等一些情况,感觉使用起来不方便

这边我写个函数,是为了解决,自动创建的函数这样调用者,不用去关心,序列是否已经创建,而且只要每次调用传入对应的表名字,这样就能获取对应的增长的ID。

第一步:
/*
   描述:取字符串左边几个字符
   作者:linkepeng
   日期:2016-08-07
*/
CREATE OR REPLACE FUNCTION LeftStr
(
       M_Text VARCHAR2,
       M_Count INTEGER
)
RETURN VARCHAR
AS
       L_Result VARCHAR(4000);
BEGIN
       L_Result:=‘‘;
       IF M_Text IS NOT NULL THEN
         L_Result:=Substr(M_Text,1,M_Count);
       END IF;
       RETURN L_Result;
END;

/*
   描述:创建序列对象
   作者:linkepeng
   日期:2016-08-07
*/
CREATE OR REPLACE PROCEDURE CreateSequence
(
       M_TableName IN VARCHAR2 --表名或序列对象名称
)
--这个在普通用户情况下,需要添加这条语句。
AUTHID CURRENT_USER
AS
  L_UserName         VARCHAR2(30);
  L_SqlString        VARCHAR2(1000);
  L_SequenceName_C   VARCHAR2(500);
  L_RowCount         INTEGER;
  L_MAXID            NUMBER;
  L_Key_FieldName    VARCHAR2(50);
BEGIN
   --根据表名得到序列名称
  L_SequenceName_C := REPLACE(M_TableName,‘-‘,‘_‘);
  IF UPPER(LeftStr(L_SequenceName_C,4))<>‘SEQ_‘ THEN
    L_SequenceName_C := ‘SEQ_‘ || L_SequenceName_C;
  END IF;
  L_SequenceName_C := UPPER(LeftStr(L_SequenceName_C,30));
   --根据表名取出主键字段
  BEGIN
    SELECT COLUMN_NAME INTO L_Key_FieldName
    FROM User_Cons_Columns
    WHERE CONSTRAINT_NAME IN (
          SELECT CONSTRAINT_NAME
          FROM User_Constraints
          WHERE CONSTRAINT_TYPE = ‘P‘ AND UPPER(TABLE_NAME)=UPPER(M_TableName)
    ) AND ROWNUM=1;
    --根据表名、主键字段取出最大值
    L_SqlString := ‘SELECT MAX(‘ || L_Key_FieldName || ‘) FROM ‘ || M_TableName;
    BEGIN
      EXECUTE IMMEDIATE L_SqlString INTO L_MAXID;
    EXCEPTION
       --捕捉错误
      WHEN OTHERS THEN
        L_MAXID:=0;
    END;
  EXCEPTION
    WHEN OTHERS THEN
      L_MAXID:=0;
  END;
  L_MAXID := NVL(L_MAXID, 0);
  --修改下一个值
  L_MAXID := L_MAXID + 1;
  L_SqlString := ‘CREATE SEQUENCE ‘ || L_SequenceName_C;
  L_SqlString:=L_SqlString ||‘ MINVALUE 1 MAXVALUE 1E27 START WITH ‘||to_char(L_MAXID) || ‘ INCREMENT BY 1 NOCACHE CYCLE‘;
  PRAGMA AUTONOMOUS_TRANSACTION;
  EXECUTE IMMEDIATE L_SqlString;
END;

/*
   描述:获取某个表主键新ID
   作者:linkepeng
   日期:2016-08-07
*/
CREATE OR REPLACE FUNCTION GetNewID
(
       M_TableName       IN VARCHAR2
)
RETURN INTEGER
AUTHID CURRENT_USER
AS
       L_StrSql VARCHAR2(1000);
       L_NewID INTEGER;
       L_RowCount INTEGER;
       L_SequenceName_T VARCHAR2(255);
BEGIN
       L_SequenceName_T :=LeftStr(‘Seq_‘||REPLACE(M_TableName,‘-‘,‘_‘),30);
        --判断序列是否存在
       SELECT COUNT(*) INTO L_RowCount FROM User_Objects
       WHERE Object_Type = ‘SEQUENCE‘ AND Upper(OBJECT_NAME) = Upper(L_SequenceName_T);
       IF L_RowCount=0 THEN
         --通过存储过程创建序列
         CreateSequence(M_TableName);
       END IF;
       L_StrSql:=‘SELECT ‘||L_SequenceName_T||‘.Nextval FROM dual‘;
       EXECUTE IMMEDIATE L_StrSql INTO L_NewID;
       RETURN L_NewID;
END;

其中 AUTHID CURRENT_USER 为的防止用户出现: EXECUTE IMMEDIATE 如果在执行DDL的时候,如果在存储过程没有这个的化,会出现权限不足的问题。

还有一种解决方案是:给用户提高权限:在sysdba权限 用户下,提高权限命令:       GRANT CREATE ANY TABLE TO ‘用户名‘;

这样创建以后,我们就可以这样调用我们的插入语句了:

  INSERT INTO t_test(test_id,NAME)VALUES(getnewid(‘t_test‘),‘linkepeng‘);

在写代码的时候,可能出现的序列未创建的异常就可以很好的避免了。

时间: 2024-11-03 03:33:37

ORACLE 自动增长通过封装函数,方便调用的相关文章

oracle添加数据时主键自动增长

CREATE TABLE STUDENT( --创建学生表  ID NUMBER(10) PRIMARY KEY,   --主键ID  SNAME VARCHAR2(20), ); 此时给学生表添加数据时 必须指定id INSERT INTO STUDENT VALUES(1,'Tom'); 下面用触发器和序列结合使得添加数据时id自动增长 不要指定了 --创建序列CREATE SEQUENCE SEQ_STUINCREMENT BY 1  ID每次自增几START WITH 1 ID从几开始自

oracle 数据表中实现字段的自动增长

由于一直用的是Mysql数据库,今天刚好心血来潮,想着和Java都是同一个老板出来的oracle自己却不会,说出去会不会有点丢人,故就开始翻资料,看视频搞起来,一步一个脚 印,想着写点什么,就开始从创建表开始吧,好了,废话不多说了,开始上正题创建一个表: User表: create table user(    id number(5,0) not null primary key auto_increment,    deptid number(5,0) not null,    userna

oracle ORA-01653 表空间不能自动增长的原因及处理方法

背景:表空间已经设置自动增长,但达到一定大小后仍会报ORA-01653. 解决过程: 查阅相关资料,多数只给出了解决办法,但这个解决办法经过验证也是临时了,到了一定大小仍旧会报错,到时只能再次采取同样办法进行操作. 通过几台机器的观察发现,报出该错误时,数据表文件的大小是一致的32G.因此判断,某种原因导致了该限制.于是进行相关搜索,最终找到了答案,但是,对于这一问题描述,有2个说法:1.windows系统下,单文件有32G的限制,但该说法我没有查到有力的支持证据,即便有其他人提到该说法,但并没

oracle 12c之前用sequence 和 trigger来生成自动增长的列

SQL> create table scott.t1 (id number, val varchar2(8)); Table created. SQL> CREATE SEQUENCE scott.t1_id_seq INCREMENT BY 1 START WITH 1 NOMAXVALUE NOCYCLE ; Sequence created. SQL> create or replace trigger scott.t1_id_trigger 2 before insert on

oracle中如何设置主键并且让其自动增长

由于oracle中是没有自动增长的的,需要自己去进行写触发器等方式去进行设置: 找了一下他人写的,有两种方法可以设置主键,一种是自增长主键,另一种就是生成唯一序列. 一.自增长主键 我创建一个用户的信息表 -- Create tablecreate table USERINFO( USERNO NUMBER not null, USERNAME NVARCHAR2(20), USERPWD NVARCHAR2(20))tablespace MYPRODUCT pctfree 10 initran

Mysql,SqlServer,Oracle主键自动增长的设置

1.把主键定义为自动增长标识符类型 MySql 在mysql中,如果把表的主键设为auto_increment类型,数据库就会自动为主键赋值.例如:   customers(id  auto_increment    , name (  customers(name)  id  customers; 以上sql语句先创建了customers表,然后插入两条记录,在插入时仅仅设定了name字段的值.最后查询表中id字段,查询结果为: 由此可见,一旦把id设为auto_increment类型,mys

oracle 数据库主键自动增长sql

我们都知道,在MySQL中,要实现主键的自动递增非常简单.只需要在主键定义的后面加上auto_increment即可, 但是在Oracle中就不是这样,需要分几步来完成 1.建立一个表 create table 户口本  (    户号                   INTEGER                         not null,    户别                   CHAR(20)                        not null,    户主

Oracle 中的自动增长字段

环境:PLSQL Developer 7.1.5 Oracle 11.2.0 Oracle 中不像MYSQL和MSSQLServer中那样指定一个列为自动增长列的方式,不过在Oracle中可以通过SEQUENCE序列来实现自动增长字段.在Oracle中SEQUENCE被称为序列,每次取的时候它会自动增加,一般用在需要按序列号排序的地方. 在使用SEQUENCE前需要首先定义一个SEQUENCE,定义SEQUENCE的语法如下: CREATE SEQUENCE sequence_name INCR

oracle 主键应用序列和触发器实现自动增长

oracle 主键自动增长 这几天搞Oracle,想让表的主键实现自动增长,查网络实现如下: create table simon_example ( id number(4) not null primary key, name varchar2(25) ) -- 建立序列: -- Create sequence create sequence SIMON_SEQUENCE minvalue 1 maxvalue 999999999999999999999999999 start with 1