PostgreSQL字符串到存储过程中的int转换

时间:2014-02-15 13:24:29

标签: java postgresql stored-procedures

我正在努力实现这个问题的接受答案:

How to model a (Java) Enum in a Database (with SQL92)

这是我目前的实施:

性别枚举:

public enum Gender {

    MALE,
    FEMALE

}

性别表:

create table gender (
    gender_id bigserial not null,
    name text not null,
    primary key(gender_id)
);

用户表:

create table system_user (
    user_id bigserial not null,
    username text not null,
    gender_id bigint references gender(gender_id),
    primary key(user_id)
);

create trigger update_gender_enum_table before insert or update on system_user
    for each row execute procedure update_gender_enum_table();

触发:

create or replace function update_gender_enum_table() returns trigger as $update_gender_enum_table$
    begin
        if not exists(select name from gender g where g.name = new.gender_id::text limit 1)
        then
             insert into gender (name) values (new.gender_id);
        end if;

        new.gender_id = (select gender_id from gender g where g.name = new.gender_id::text limit 1);

        return new;

    end;
$update_gender_enum_table$ language plpgsql;

目前插入语句失败,因为第二个参数是文本而不是整数:

insert into system_user (username, gender_id) values ('my_username', 'MALE');

ERROR: invalid input syntax for integer: "MALE"

有没有办法将字符串作为值传递给整数字段?或者我是以错误的方式接近这个。

2 个答案:

答案 0 :(得分:0)

您可以为枚举添加ID字段。

public enum Gender {

    private int id;

    MALE(1),
    FEMALE(2);

    Gender(int id) {
        this.id=id;
    }

    public int getId() {
        return this.id;
    }

    public static Gender valueById(int id) {
        for(Gender gender : values()) {
            if(id == gender.id) {
                return gender;
            }
        }
        throw new IllegalArgumentException("Unsupported id: "+id+" for enum "+Gender.class.getSimpleName());
    }
}

我已将代码直接编写到此编辑器中,因此它可能包含som语法错误。

您也可以使用枚举的序数,但要注意,如果添加更多性别(即未知),此值可能会更改,因此可能不是一个好主意

答案 1 :(得分:0)

首先,您为什么要尝试将整数与文本进行比较?

select name from gender g where g.name = new.gender_id::text limit 1

所以你试图比较,例如MALE有3?

您的应用程序如何向用户显示性别?它不是来自性别表吗?

如果要添加新的性别(因此性别表中的新行),您需要知道名称值,并将其插入性别,id列并不重要,您只需将值插入引用system_user表。