1

使用 MyGeneration、doodads 和 Oracle XE,是否可以实现“自动编号主键”方案?

问题事实:我正在使用 Oracle XE。我已经实现了下表和触发器:

CREATE TABLE  "USERS" 
(   
    "ID" NUMBER(38,0), 
    "USER_NAME" VARCHAR2(50), 
    "PASSWORD" VARCHAR2(50), 
    "EMAIL" VARCHAR2(100), 
     CONSTRAINT "USERS_PK" PRIMARY KEY ("ID") ENABLE
)
/

CREATE OR REPLACE TRIGGER  "BI_USERS" 
  before insert on "USERS"               
  for each row  
begin   
    select "USERS_SEQ".nextval into :NEW.ID from dual; 
end; 

/
ALTER TRIGGER  "BI_USERS" ENABLE
/

MyGeneration / Doodads 创建了以下存储过程...

CREATE OR REPLACE PROCEDURE "XXX"."PI_USERS"
(
    p_ID IN USERS.ID%type,
    p_USER_NAME IN USERS.USER_NAME%type,
    p_PASSWORD IN USERS.PASSWORD%type,
    p_EMAIL IN USERS.EMAIL%type
)
IS
BEGIN


    INSERT
    INTO USERS
    (
        ID,
        USER_NAME,
        PASSWORD,
        EMAIL
    )
    VALUES
    (
        p_ID,
        p_USER_NAME,
        p_PASSWORD,
        p_EMAIL
    );
END PI_USERS;

序列和触发器组合工作正常。C# 中的 BusinessEntity 类不接收新 ID。

允许调用代码接收新记录 ID 的任何推荐方法?

4

2 回答 2

2

我没有使用 Doodads,所以不确定这是否是它所期望的,但是如果您使用returning子句更改下面的过程并设置 p_ID 参数in out,那么 p_ID 参数应该在执行后保存新添加的 ID。

CREATE OR REPLACE PROCEDURE "XXX"."PI_USERS"
(
    p_ID IN OUT USERS.ID%type,
    p_USER_NAME IN USERS.USER_NAME%type,
    p_PASSWORD IN USERS.PASSWORD%type,
    p_EMAIL IN USERS.EMAIL%type
)
IS
BEGIN


    INSERT
    INTO USERS
    (
        ID,
        USER_NAME,
        PASSWORD,
        EMAIL
    )
    VALUES
    (
        p_ID,
        p_USER_NAME,
        p_PASSWORD,
        p_EMAIL
    )
    RETURNING ID INTO p_ID;

END PI_USERS;
于 2010-04-25T00:40:31.203 回答
1

为什么不使用序列?如果您更喜欢使用 TAPI,我仍然认为 ID 和 WHO 列最好在序列的触发器中提供。问题是否需要一个没有跳过数字的纯密集序列?

于 2011-04-06T15:14:11.417 回答