C# 我为主表的get事务创建了日志表,但当我在主表中插入时,日志表中的id为NULL
首先,我创建了C# 我为主表的get事务创建了日志表,但当我在主表中插入时,日志表中的id为NULL,c#,oracle,C#,Oracle,首先,我创建了Main表,然后,为了执行一条记录的插入、更新、删除事务,我创建了Log表。请注意,我在Main表中使用了自动增量 主表的表结构 主表数据 日志表的表结构 日志表数据-事务 表定义: CREATE TABLE departments ( ID NUMBER(10) NOT NULL, DESCRIPTION VARCHAR2(50) NOT NULL ); ALTER TABLE departments ADD ( CO
Main
表,然后,为了执行一条记录的插入、更新、删除事务,我创建了Log
表。请注意,我在Main
表中使用了自动增量
主表的表结构
主表数据
日志表的表结构
日志表数据-事务
表定义:
CREATE TABLE departments
(
ID NUMBER(10) NOT NULL,
DESCRIPTION VARCHAR2(50) NOT NULL
);
ALTER TABLE departments ADD (
CONSTRAINT dept_pk PRIMARY KEY (ID));
CREATE SEQUENCE dept_seq START WITH 1;
触发器定义:
CREATE OR REPLACE TRIGGER dept_bir
BEFORE INSERT ON departments
FOR EACH ROW
BEGIN
SELECT dept_seq.NEXTVAL
INTO :new.id
FROM dual;
END;`enter code here
/
我的问题是:若我在日志表中插入一行,但id的值为NULL
我在Oracle中的存储过程,用于插入和更新Main
&Log
表:
CREATE OR REPLACE PROCEDURE P_SAVE_YARDMASTER_DATA(
IP_YARD_NAME IN VARCHAR2,
IP_MATERIAL_TYPE IN VARCHAR2,
IP_MATERIAL_NAME IN VARCHAR2,
IP_CAPACITY IN VARCHAR2,
-- IP_RID OUT NUMBER ,
IP_IS_DELETE IN NUMBER ,
IP_LAST_UPD_UID IN VARCHAR2,
IP_OPERATION IN VARCHAR2,
updaterowid IN VARCHAR2 := NULL,
OUT_RETURN_MSG OUT VARCHAR2,
OUT_RETURN_CODE OUT NUMBER)
IS
BEGIN
OUT_RETURN_MSG := '';
OUT_RETURN_CODE := 0;
IF IP_OPERATION = 'INSERT' THEN
INSERT
INTO MST_VP_YARD
(
YARD_NAME,
MATERIAL_TYPE,
MATERIAL_NAME,
CAPACITY,
IS_DELETE,
LAST_UPD_IS,
LAST_UPD_UID
)
VALUES
(
IP_YARD_NAME ,
IP_MATERIAL_TYPE ,
IP_MATERIAL_NAME ,
IP_CAPACITY ,
IP_IS_DELETE ,
SYSDATE ,
IP_LAST_UPD_UID
);
INSERT
INTO MST_VP_YARD_LOG
(
YARD_NAME,
MATERIAL_TYPE,
MATERIAL_NAME,
CAPACITY,
IS_DELETE,
LAST_UPD_IS,
LAST_UPD_UID
)
VALUES
(
IP_YARD_NAME ,
IP_MATERIAL_TYPE ,
IP_MATERIAL_NAME ,
IP_CAPACITY ,
IP_IS_DELETE ,
SYSDATE ,
IP_LAST_UPD_UID
);
END IF;
IF IP_OPERATION = 'UPDATE' THEN
UPDATE MST_VP_YARD
SET YARD_NAME = IP_YARD_NAME,
MATERIAL_TYPE = IP_MATERIAL_TYPE,
MATERIAL_NAME = IP_MATERIAL_NAME,
CAPACITY = IP_CAPACITY,
IS_DELETE = IP_IS_DELETE,
LAST_UPD_IS = SYSDATE,
LAST_UPD_UID = IP_LAST_UPD_UID
WHERE RID = updaterowid;
INSERT
INTO MST_VP_YARD_LOG
(
RID,
YARD_NAME,
MATERIAL_TYPE,
MATERIAL_NAME,
CAPACITY,
IS_DELETE,
LAST_UPD_IS,
LAST_UPD_UID
)
VALUES
(
updaterowid,
IP_YARD_NAME ,
IP_MATERIAL_TYPE ,
IP_MATERIAL_NAME ,
IP_CAPACITY ,
IP_IS_DELETE ,
SYSDATE ,
IP_LAST_UPD_UID
);
END IF;
OUT_RETURN_MSG := 'SUCCESS';
OUT_RETURN_CODE := 1;
EXCEPTION
WHEN OTHERS THEN
OUT_RETURN_MSG := SQLERRM;
OUT_RETURN_CODE := 0;
END P_SAVE_YARDMASTER_DATA;
您正在使用触发器生成ID。因此,您可以使用返回到语句来获取生成到变量中的ID。现在使用该ID插入日志表。 看看这个
您可以使用返回的
获取departments表的id
。
然后在插入log
表时使用该id
大概是这样的:
CREATE OR REPLACE PROCEDURE P_SAVE_YARDMASTER_DATA(
IP_YARD_NAME IN VARCHAR2,
IP_MATERIAL_TYPE IN VARCHAR2,
IP_MATERIAL_NAME IN VARCHAR2,
IP_CAPACITY IN VARCHAR2,
-- IP_RID OUT NUMBER ,
IP_IS_DELETE IN NUMBER ,
IP_LAST_UPD_UID IN VARCHAR2,
IP_OPERATION IN VARCHAR2,
updaterowid IN VARCHAR2 := NULL,
OUT_RETURN_MSG OUT VARCHAR2,
OUT_RETURN_CODE OUT NUMBER)
IS
my_id number;
BEGIN
OUT_RETURN_MSG := '';
OUT_RETURN_CODE := 0;
IF IP_OPERATION = 'INSERT' THEN
INSERT
INTO MST_VP_YARD
(
YARD_NAME,
MATERIAL_TYPE,
MATERIAL_NAME,
CAPACITY,
IS_DELETE,
LAST_UPD_IS,
LAST_UPD_UID
)
VALUES
(
IP_YARD_NAME ,
IP_MATERIAL_TYPE ,
IP_MATERIAL_NAME ,
IP_CAPACITY ,
IP_IS_DELETE ,
SYSDATE ,
IP_LAST_UPD_UID
) RETURNING id INTO my_id;
INSERT
INTO MST_VP_YARD_LOG
(
RID,
YARD_NAME,
MATERIAL_TYPE,
MATERIAL_NAME,
CAPACITY,
IS_DELETE,
LAST_UPD_IS,
LAST_UPD_UID
)
VALUES
(
my_id,
IP_YARD_NAME ,
IP_MATERIAL_TYPE ,
IP_MATERIAL_NAME ,
IP_CAPACITY ,
IP_IS_DELETE ,
SYSDATE ,
IP_LAST_UPD_UID
);
END IF;
IF IP_OPERATION = 'UPDATE' THEN
UPDATE MST_VP_YARD
SET YARD_NAME = IP_YARD_NAME,
MATERIAL_TYPE = IP_MATERIAL_TYPE,
MATERIAL_NAME = IP_MATERIAL_NAME,
CAPACITY = IP_CAPACITY,
IS_DELETE = IP_IS_DELETE,
LAST_UPD_IS = SYSDATE,
LAST_UPD_UID = IP_LAST_UPD_UID
WHERE RID = updaterowid;
INSERT
INTO MST_VP_YARD_LOG
(
RID,
YARD_NAME,
MATERIAL_TYPE,
MATERIAL_NAME,
CAPACITY,
IS_DELETE,
LAST_UPD_IS,
LAST_UPD_UID
)
VALUES
(
updaterowid,
IP_YARD_NAME ,
IP_MATERIAL_TYPE ,
IP_MATERIAL_NAME ,
IP_CAPACITY ,
IP_IS_DELETE ,
SYSDATE ,
IP_LAST_UPD_UID
);
END IF;
OUT_RETURN_MSG := 'SUCCESS';
OUT_RETURN_CODE := 1;
EXCEPTION
WHEN OTHERS THEN
OUT_RETURN_MSG := SQLERRM;
OUT_RETURN_CODE := 0;
END P_SAVE_YARDMASTER_DATA;
日志表ID值为NULL是什么意思?你是怎么记录的?更多代码和详细信息将帮助我们帮助您。缺少的提交
?另外,您的代码与您发布的表结构有什么关系?使用当前代码,您将新id分配给新插入的行id字段(这来自主表)。您是否尝试过将新Id放入一个变量中,然后稍后使用该Id为日志表提供它自己的唯一Id?在我发布的图像-4..Log table-Transaction的数据中,您可以看到Id为null@Arijitkanrar非常感谢@Plirkee。。。工作顺利。非常感谢@Arijit Kanrar。。。你的回答对我有帮助。