我目前正在使用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)
)
有关该怎么做的任何建议?我应该合并代码,分开,我错过了什么?
答案 0 :(得分:0)
使用触发器是管理此任务的好方法。我会在WAPPLICANT表上放置一个INSERT或UPDATE条件触发器。
设置约束和自动排序的ID /键列
可以通过3个单独的主键约束来管理值BAID,BAPPID和APPID。如果您通过APEX设计了这些表,则可以让Oracle管理新索引/键值的分配:
如果您选择创建外键,则创建表的顺序很重要......在创建外键以指向外键之前,必须存在REFERENCED主键。如果您错过了这个细节,您可以随时更改表格或修改它们以便稍后添加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实际上已为您设置了自动排序触发器。
就是这样。