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。。。你的回答对我有帮助。