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');
在写代码的时候,可能出现的序列未创建的异常就可以很好的避免了。
ORACLE 自动增长通过封装函数,方便调用的更多相关文章
- oracle 自动增长
在SQLSERVER和MYSQL里面自动增长字段直接设置就可以.在ORACLE里面就复杂多了.特别是我这样的初学者,不过网络是最好的老师,看了很多相关介绍,本人使用的是使用触发器.具体如下: 首先要创 ...
- Oracle自动增长的序列号
首先建立序列: Create sequence user_id Increment Start Maxvalue .0E28 Minvalue nocycle Cache Noorder; 然后建立触 ...
- oracle添加数据时主键自动增长
CREATE TABLE STUDENT( --创建学生表 ID NUMBER(10) PRIMARY KEY, --主键ID SNAME VARCHAR2(20), ); 此时给学生表添加数 ...
- Oracle创建自动增长列
前言: Oracle中不像SQL Server在创建表的时候使用identity(1001,1)来创建自动增长列,而是需要结合序列(Sequences)和触发器(Triggers)来实现 创建测试表 ...
- oracle建表并设置ID为自动增长
CREATE TABLESPACE shopping DATAFILE 'D:\oracle\mypc\oradata\orcl\shopping.dbf' SIZE 20M AUTOEXTEND O ...
- Oracle中的自动增长字段
Oracle中的自动增长字段 Oracle 中不像MYSQL 和MSSQLServer 中那样指定一个列为自动增长列的方式,不过在Oracle中可以通过SEQUENCE序列来实现自动增长字段. 在Or ...
- Hibernate注解映射sequence时出现无序增长问题+hibernate 映射 oracle ID自动增长:
Hibernate注解映射sequence时出现无序增长问题+hibernate 映射 oracle ID自动增长: 通过Hibernate注解的方式映射oracel数据库的sequence主键生成器 ...
- PowerDesigner连接Oracle数据库建表序列号实现自动增长
原文:PowerDesigner连接Oracle数据库建表序列号实现自动增长 创建表就不说了.下面开始介绍设置自动增长列. 1 在表视图的列上创建.双击表视图,打开table properties — ...
- Mysql,SqlServer,Oracle主键自动增长的设置
1.把主键定义为自动增长标识符类型 MySql 在mysql中,如果把表的主键设为auto_increment类型,数据库就会自动为主键赋值.例如: )); insert into customers ...
随机推荐
- {POJ}{3903}{Stock Exchange}{nlogn 最长上升子序列}
题意:求最长上升子序列,n=100000 思路:O(N^2)铁定超时啊....利用贪心的思想去找答案.利用栈,每次输入数据检查栈,二分查找替换掉最小比他大的数据,这样得到的栈就是更优的.这个题目确实不 ...
- 用贝赛尔曲线把图片, 按钮, label 绘成圆 或圆角矩形
//创建圆形遮罩,把用户头像变成圆形 /* *CGPointMake(35, 35) 是绘图的中心点, 如果想把控件居中绘圆, 一般用控件的中心点, radius 是圆半径 startAn ...
- VC++ 如何让ScrollView视图显示滚动条
CSize sizeTotal; sizeTotal.cx = ;//值设大点 sizeTotal.cy = ;//值设大点 SetScrollSizes(MM_TEXT, sizeTotal); 显 ...
- 将复杂查询写到SQL配置文件--SOD框架的SQL-MAP技术简介
引言 今天看到一片热门的博客, .NET高级工程师面试题之SQL篇 ,要求找出每一个系的最高分,并且按系编号,学生编号升序排列.这个查询比较复杂,也比较典型,自从用了ORM后,很久没有写过SQL语句了 ...
- javascript篇-----函数apply()和call()
转自:http://www.jb51.net/article/28013.htm 如果没接触过动态语言,以编译型语言的思维方式去理解javaScript将会有种神奇而怪异的感觉,因为意识上往往不可能的 ...
- mysql - join two derived tables
select t1.uid from (select uid from table1) t1 inner join (select uid from table2) t2 where t1.uid=t ...
- 试一下CANVAS
// 此应用源代码如下: document.getElementById("codetext").innerHTML = document.getElementById(" ...
- NPOI 2.0版本的使用
详细教程: http://blog.csdn.net/xxs77ch/article/details/50216033 using System; using System.Collections.G ...
- angular+ionic返回上一页并刷新
假定当前页面为editCata页面,要返回的是cataDetail页面.目前我找到两种方法实现返回上一页并刷新,如果以后有其它方法,再继续添加. 1.在editCataCtrl.js中注入$ionic ...
- I/O复用
1.I/O模型 一个输入操作通常包括两个不同阶段:等待数据准备好:从内核到进程拷贝数据. 阻塞I/O模型 非阻塞I/O模型 I/O复用模型:内核发现进程指定的一个或多个I/O条件就绪,它就通知进程,由 ...