繁体   English   中英

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

[英]Oracle - PL/SQL Coding - Inserting Into Multiple Tables From Another Table

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

我几乎有一个有申请人和被任命人的申请。 假设我涉及三个表。 一个表是针对申请人的,一个表是针对被任命的,而第三表基本上是一个表,该表包含说明其所属的董事会,是否为董事会的当前成员,开始日期,截止日期等信息。

我要实施的代码基本上是针对申请人处于申请状态并且其状态更改为“已接受”的情况,然后申请人成为被任命者,然后插入申请人的个人信息(姓名,DOB,地址等) )进入被任命人的表。 我还尝试实现将状态更改为“已接受”时可以输入(日期开始,日期结束,注释等)的位置,但是我想将该信息转到第三个表,即一个用来保存董事会所属的信息,开始日期,结束日期等的信息。完成此操作后,我需要将第三张表和被任命者表链接在一起,以便在我进入被任命者表时将一起显示所有这些信息。 第三张表和被任命者表应具有相同的ID号。

如果我这样编码,那么只要状态更改为“已接受”,我就可以从申请人表中获取信息以转到“被任命者”表

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;

被任命者的公共ID在被任命者表中标记为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)
)

有什么建议吗? 我应该分开组合代码,我缺少什么吗?

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

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

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

  1. 在创建表向导中,当系统提示您输入PRIMARY KEY时,选择“从新序列中填充”。
  2. 选择您指定为要创建的特定表的索引/关键字的列值。
  3. 您可以指定FOREIGN KEY约束,因为表中不同列之间存在连接。 制作这些记录是一个好习惯,因为这样可以防止孤立记录的发生,例如在没有匹配应用程序的情况下被任命或被任命为董事会成员。

如果选择创建外键,则创建表的顺序很重要...在创建外键指向它之前,必须存在一个参考主键。 如果您错过了该详细信息,则可以随时更改表或对其进行修改以在以后添加FK。

设置触发器

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

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

  1. 在表WAPPLICANT上构建触发器
  2. 射击点:之后
  3. 选项:INSERT,UPDATE(我假设可以插入“已接受”状态的应用程序。)
  4. 时间:NEW.BAPPSTATUS ='已接受'
  5. “对于每一行”(选中)
  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... ); 

触发器主体的PL / SQL块内不需要“ COMMIT”语句。 请记住,与序列关联的任何主键值都不需要包含在PL / SQL中的任何INSERT命令中,因为Apex实际上已经为您设置了自动排序触发器。

而已。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM