Oracle - PL / SQL编码 - 从另一个表插入多个表

时间:2014-01-17 14:33:12

标签: sql oracle oracle-apex

我目前正在使用Oracle Application Express。我在使用PL / SQL编码时遇到了麻烦。

我几乎有一个应用程序,我有申请人和被任命者。假设我有三张桌子。一个表是针对申请人的,一个表是针对被任命者的,第三个表基本上是一个表,其中包含说明他们所属的董事会的信息,他们是否是董事会的现任成员,日期开始,结束日期等。

我试图实施的代码基本上是当申请人处于申请状态并且他们的状态变为“已接受”然后申请人成为被任命者并且我插入申请人的个人信息(姓名,DOB,地址等)进入被任命人的表格。我也试图实现当状态更改为“已接受”时我也可以输入(日期开始,日期结束,注释等),但我希望该信息转到第三个表,即保存他们所属的董事会,日期开始,结束日期等信息的那个。我需要将第三个表和被任命者表连接在一起,这样当我去被任命的表格时将一起显示所有这些信息。第三个表和appointees表应该具有相同的ID号。

如果我这样编码,那么无论何时状态变为接受,我都可以从申请人表中获取信息到appointees表中

DECLARE
BEGIN
  INSERT INTO tbl_dbo_appointees (applname, appfname, appsuf, appdob, race, sex, appadd,
                                  appstnum, appstdir, appstname, appsttype, appsufdir, appcity, appst, appzip,
                                  appphone, appwnbr, appcnbr, appemail, mappadd1, mappadd2, mcity, mstate, mzip,
                                  appedu, appothr, appwexp)
    SELECT
      bapplname, bappfname, bappnsuf, bappdob, race, sex, bappstname,
      bappstnum, bappstdir, bappstname, bappsttype, bappsufdir, bappcity, bappst, bappzip,
      bapphnbr, bappwnbr, bappcnbr, bappemail, bmappadd1, bmappadd2, bmcity, bmstate, bmzip,
      bappeducation, bappother, bappwexp     
    FROM tbl_dbo_wapplicant
    WHERE bappstatus = 'Accepted'
          AND "BAPPID" = :P55_BAPPID;
END;

我已尝试将此代码的不同变体添加到第三个表中,我也尝试将这两个进程分开。它会写入表格但我无法将两个ID链接到同一个被任命者。 声明。

begin 

INSERT INTO TBL_DBO_BRDAPPT (BRDID, BRDAPPDATE, BRDEXPDATE, BRDAPPBY,      BANOTE, BRDASSC)

SELECT BAPPBID, BAPPTBDATE, BAPPTEDATE, BAPPTBY, APPNOTE, BABRDASSC

FROM TBL_DBO_WAPPLICANT

WHERE BAPPSTATUS = 'Accepted'

and

"BAPPID" = :P55_BAPPID;

END;

Appointees的公共ID在Appointees表中标记为APPID,在第三个表中标记为BRDAPT。

CREATE TABLE BRDAPPT
(
  BAID        NUMBER,
  BRDID       NUMBER,
  BRDAPT      NUMBER,
  BRDAPPDATE  DATE,
  BRDEXPDATE  DATE,
  BRDAPPBY    NUMBER,
  BACTIVE     VARCHAR2(30 BYTE),
  BANOTE      VARCHAR2(255 BYTE),
  BRDONBRD    NUMBER,
  BRDYRS      NUMBER,
  BRDASSC     VARCHAR2(255 BYTE),
  BRDRAPPT    VARCHAR2(30 BYTE)



 CREATE TABLE WAPPLICANT
(
  BAPPID         NUMBER,
  BAPPBID        NUMBER,
  BAPPLNAME      VARCHAR2(30 BYTE),
  BAPPFNAME      VARCHAR2(30 BYTE),
  BAPPMINIT      VARCHAR2(1 BYTE),
  BAPPNSUF       VARCHAR2(30 BYTE),
  BAPPSTNUM      NUMBER,
  BAPPSTDIR      VARCHAR2(1 BYTE),
  BAPPSTNAME     VARCHAR2(30 BYTE),
  BAPPSTTYPE     VARCHAR2(30 BYTE),
  BAPPSUFDIR     VARCHAR2(1 BYTE),
  BAPPCITY       VARCHAR2(30 BYTE),
  BAPPST         VARCHAR2(30 BYTE),
  BAPPZIP        VARCHAR2(30 BYTE),
  BAPPHNBR       VARCHAR2(10 BYTE),
  BAPPWNBR       VARCHAR2(10 BYTE),
  BAPPCNBR       VARCHAR2(10 BYTE),
  BAPPEMAIL      VARCHAR2(255 BYTE),
  BAPPEDUCATION  VARCHAR2(4000 BYTE),
  BAPPWEXP       VARCHAR2(4000 BYTE),
  BAPPOTHER      VARCHAR2(4000 BYTE),
  BAPPDOB        DATE,
  RACE           VARCHAR2(1 BYTE),
  SEX            VARCHAR2(6 BYTE),
  BAPPINDATE     DATE,
  BAPPINTYPE     VARCHAR2(30 BYTE),
  BAPPSTATUS     VARCHAR2(30 BYTE),
  BSTATDATE      DATE,
  BSTATREAS      VARCHAR2(30 BYTE),
  BAPPTBDATE     DATE,
  BAPPTEDATE     DATE,
  BAPPTBY        VARCHAR2(1 BYTE),
  BAPPSTENBR     VARCHAR2(30 BYTE),
  BMAPPADD1      VARCHAR2(30 BYTE),
  BMAPPADD2      VARCHAR2(30 BYTE),
  BMCITY         VARCHAR2(30 BYTE),
  BMSTATE        VARCHAR2(30 BYTE),
  BMZIP          VARCHAR2(30 BYTE),
  BPPSTNOTR      VARCHAR2(30 BYTE),
  IPADDRESS      VARCHAR2(30 BYTE),
  SM_TIMESTAMP   VARCHAR2(1 BYTE),
  CONVICTION     VARCHAR2(1 BYTE),
  BABRDASSC      VARCHAR2(255 BYTE),
  APPNOTE        VARCHAR2(255 BYTE)
  )


CREATE TABLE APPOINTEES
(
  APPID       NUMBER,
  APPFNAME    VARCHAR2(30 BYTE),
  APPLNAME    VARCHAR2(30 BYTE),
  APPSUF      VARCHAR2(40 BYTE),
  APPDOB      DATE,
  RACE        VARCHAR2(1 BYTE),
  SEX         VARCHAR2(1 BYTE),
  APPADD      VARCHAR2(255 BYTE),
  APPSTNUM    VARCHAR2(30 BYTE),
  APPSTDIR    VARCHAR2(1 BYTE),
  APPSTNAME   VARCHAR2(255 BYTE),
  APPSTTYPE   VARCHAR2(30 BYTE),
  APPSUFDIR   VARCHAR2(1 BYTE),
  APPCITY     VARCHAR2(40 BYTE),
  APPST       VARCHAR2(40 BYTE),
  APPZIP      VARCHAR2(40 BYTE),
  APPPHONE    VARCHAR2(40 BYTE),
  APPWNBR     VARCHAR2(40 BYTE),
  APPCNBR     VARCHAR2(40 BYTE),
  APPEMAIL    VARCHAR2(40 BYTE),
  APPSPNOTES  VARCHAR2(255 BYTE),
  ACTIVE      VARCHAR2(30 BYTE),
  MAPPADD1    VARCHAR2(40 BYTE),
  MAPPADD2    VARCHAR2(50 BYTE),
  MCITY       VARCHAR2(30 BYTE),
  MSTATE      VARCHAR2(30 BYTE),
  MZIP        VARCHAR2(30 BYTE),
  APPSTEAPT   VARCHAR2(30 BYTE),
  APPSTNOTR   VARCHAR2(30 BYTE),
  APPEDU      VARCHAR2(2000 BYTE),
  APPOTHR     VARCHAR2(4000 BYTE),
  APPWEXP     VARCHAR2(4000 BYTE),
  CONVICTQUE  VARCHAR2(1 BYTE)
)

有关该怎么做的任何建议?我应该合并代码,分开,我错过了什么?

1 个答案:

答案 0 :(得分:0)

使用触发器是管理此任务的好方法。我会在WAPPLICANT表上放置一个INSERT或UPDATE条件触发器。

设置约束和自动排序的ID /键列

可以通过3个单独的主键约束来管理值BAID,BAPPID和APPID。如果您通过APEX设计了这些表,则可以让Oracle管理新索引/键值的分配:

  1. 在创建表向导中,当系统提示您输入PRIMARY KEY时,请选择“从新序列中填充”。
  2. 选择您指定为要创建的特定表的索引/键的列值。
  3. 您可以指定FOREIGN KEY约束,因为表中的不同列之间存在连接。制作它们是一种很好的做法,因为它可以防止孤立记录的可能性,例如没有匹配应用程序的被任命者或董事会预约。
  4. 如果您选择创建外键,则创建表的顺序很重要......在创建外键以指向外键之前,必须存在REFERENCED主键。如果您错过了这个细节,您可以随时更改表格或修改它们以便稍后添加FK。

    设置触发器

    由于两个附加表最初并未由用户输入填充,因此这两个表都可以使用自己的PL / SQL代码块进行初始化...在此示例中,我只是将其填充到触发器中...尽管我建议将太多代码或逻辑放入触发器中的未来谨慎......如果触发器需要很长时间才能完成,它们可能会破坏性能甚至锁定对表的其他DML操作。

    我们将使用触发器捕获BAPPID值,您指示在其他两个表中需要该值。这些是您在通过Apex界面创建触发器时应指定的设置:

    1. 在表WAPPLICANT上构建触发器
    2. 射击点:AFTER
    3. 选项:INSERT,UPDATE(我假设可以在Accepted状态下插入应用程序。)
    4. 时间:NEW.BAPPSTATUS ='接受'
    5. “For Each Row”(已选中)
    6. 触发器正文:(请参阅下面的代码段.Apex“创建触发器”对话框将填充大部分惯用语法...)

      INSERT INTO APPOINTEES (
         APPID, 
         APPFNAME,
         APPLNAME,
         APPSUF,
         APPDOB...
      )
      
      VALUES ( :NEW.BAPPID, :NEW.BAPPFNAME, :NEW.BAPPLNAME, :NEW.APPSUF, :NEW.APPDOB ...);
      
      INSERT INTO BRDAPPT (
         BRDID,
         BRDAPT,
         BRDAPPDATE...
       )
      
      VALUES ( :NEW.BAPPBID, :NEW.BAPPID, :NEW.BAPPTBDATE... );
      
    7. 触发器主体的PL / SQL块中不需要“COMMIT”语句。请记住,任何与序列关联的主键值都不需要包含在PL / SQL中的任何INSERT命令中,因为Apex实际上已为您设置了自动排序触发器。

      就是这样。