![](/img/trans.png)
[英]Select from multiple tables, insert into another table Oracle SQL query
[英]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管理新索引/键值的分配:
如果选择创建外键,则创建表的顺序很重要...在创建外键指向它之前,必须存在一个参考主键。 如果您错过了该详细信息,则可以随时更改表或对其进行修改以在以后添加FK。
设置触发器
由于最初没有通过用户输入来填充另外两个表,因此这两个表都可以使用自己的PL / SQL代码块进行初始化...在本示例中,我只是将其填充到触发器中...尽管我建议以后谨慎使用如果将太多的代码或逻辑放入触发器中,则如果触发器花费很长时间才能完成操作,它们可能会降低性能,甚至对表锁定其他DML操作。
我们将使用触发器来捕获BAPPID值,您在其他两个表中指出需要该值。 这些是通过Apex界面创建触发器时应指定的设置:
触发器主体:(请参见下面的代码片段。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.