我的需求是:要保存一个密码到数据库,这个密码必须为6位数字。
如果我将number类型当做数据类型的话,假如最前面几位为0的话,直接用number保存,前面几位为0的就会丢失,所以我想用varcher类型保存,但是要加一个约束。也就是说这个约束必须满足下面几个条件:
1,大于0
2,必须为6位
3,必须全部为数字
我不想通过JAVA、C等语言在读取写入的时候去做判断,而是直接通过oracle数据库去完成这一工作,请问应该怎么做呢?
假如我的表是这样的:
表名:use  主键:use_id
use_id use_name  password
1      张三      001234
2      李四      022222

解决方案 »

  1.   

    数据库是用来存东西的java是用来实现逻辑的何苦呢?何况每次校验都要连接一次数据库,性能也不行啊。
      

  2.   

    没明白楼上的意思,你的意思是在oracle上面不加约束,而是在java加判断性能要好吗?
    我倒是觉得在oracle里面加约束性能要好一些,因为在我看来,数据库只有一个,但是java类将会有很多个,假如有很多个JAVA类都要读写这一个表呢?那么我改进一个数据库肯定比改进很多个JAVA类要好要快,至于性能,我现在还真说不明白,毕竟没有实操过
    在说了,我不这样做的话,密码就会有数据丢失,必然就会有不好的因素产生,当然我现在还说不清楚为什么不好,哪里不好
      

  3.   


    个人赞成楼上的,业务逻辑在java/C等宿主语言中实现,这样效率上会好很多,尤其是当操作比较频繁的情形下。存在多个类写一个表的情形,只能说明LZ的设计存在问题。尤其是象这种简单的应用。密码会有数据丢失?用varchar2或者char保存,不会丢的。是建议你将密码的校验逻辑放在宿主语言中,没有建议你用number去存密码。
      

  4.   

    怕是没有你要求的这个约束哦..
    你非不想用JAVA或C实现的话,只能用ORACLE了,可参考以下
    CREATE TABLE usermsg(use_id NUMBER(5),use_name VARCHAR2(30),password VARCHAR2(6));
    CREATE OR REPLACE PROCEDURE pusermsgins(p_id IN NUMBER,p_name IN VARCHAR2,ppassword IN VARCHAR2) IS 
    v_password NUMBER; 
    BEGIN 
      SELECT To_Number(ppassword) INTO v_password FROM dual;
      INSERT INTO usermsg VALUES (p_id,p_name,ppassword);
      COMMIT;
      EXCEPTION WHEN OTHERS THEN 
        raise_application_error(-20102,'** plz input the Correct password **' ||sqlerrm);
    END;