我正在开发一个使用过程在DB中保存信息的java应用程序。我会举一个例子来表明我的怀疑,因为我有点迷失了!
让我假装我有这2个不同的课程
public class Seg{
//variables
....
public class Dur{
//variables
private List list<Seg> //Lets pretend that Dur1 has 3 seg, and Dur1's PK = 1
....
我想将信息保存在DB中。因为Dur1有3个seg并且代码PK = 1,所以我将在seg中有3个插入,其中FK = 1 = Dur&#39; PK
我的问题是我如何自动地,使用一个程序,在三个seg插入中放入一个FK,假设(在java中)我知道Seg和Dur之间的所有匹配(我有连接它们的列表)< / p>
//注意:pk是具有序列
的过程中定义的属性我担心有些人可能不理解这个问题,但事实上我有点混淆
全部谢谢
答案 0 :(得分:1)
您的示例(以及对FK的关注)不清楚您是否尝试定义一个普通的PL / SQL层来处理基本CRUD(在PL / SQL中也称为TAPI),或者您是否打算封装某种业务逻辑。
在前一种情况下,您可以重新考虑您的方法,并查看某种ORM。
不要理解我的错误,我没有尝试用&#34;做其他事情&#34;来回答你的问题。我的观点是,在ORM中有大量的使用情况(数据库分配密钥)的经验,所以简单的搜索链接与上面类似,并使其适应您的PL / SQL解决方案。
在我看来,您需要在存储父类的过程中提供输出参数,返回指定PK 的序列,在存储子类的过程中传递此值< / em>的
答案 1 :(得分:0)
嘿,我试图用一个例子来说明你的场景。希望它 帮助。请原谅任何语法错误,因为我没有工作区 目前。
--Drop any existing object with same name
DROP TABLE A1PK;
DROP SEQUENCE A1PK_seq;
-- Seq creation
CREATE SEQUENCE A1PK_seq START WITH 1 INCREMENT BY 1;
-- Provding req privileges
GRANT SELECT ON INFRA_OWNER.A1PK_seq TO PUBLIC;
--Root table creation
CREATE TABLE AIK
(PK_ID NUMBER PRIMARY KEY,
PK_NAME VARCHAR2(100));
--Drop existing object
DROP TABLE FK1;
--Create Child table
CREATE TABLE FK1
(
PK_ID NUMBER,
PK_ADD1 VARCHAR2(100),
PK_ADD2 VARCHAR2(100)
);
--Drop any existing constraints if any with same name
ALTER TABLE FK1
DROP CONSTRAINT FK_PK;
--Adding foreign key for child table
ALTER TABLE FK1
ADD CONSTRAINT FK_PK FOREIGN KEY(PK_ID) REFERENCES AIK(PK_ID);
CREATE OR REPLACE PROCEDURE insert_into_child_tables
(p_seg1 IN VARCHAR2,
p_seg2 IN VARCHAR2,
p_seg3 IN VARCHAR2,
p_root_val IN VARCHAR2)
AS
lv_long LONG;
lv_seq PLS_INTEGER;
BEGIN
SELECT INFRA_OWNER.A1PK_SEQ.NEXTVAL
INTO lv_seq
FROM DUAL;
INSERT
INTO INFRA_OWNER.AIK VALUES
(
lv_seq,
p_root_val
);
FOR I IN
(SELECT a1.OWNER,
a1.CONSTRAINT_NAME,
a1.TABLE_NAME
FROM ALL_CONSTRAINTS a1
WHERE A1.R_CONSTRAINT_NAME IN
(SELECT a2.CONSTRAINT_NAME
FROM ALL_CONSTRAINTS a2
WHERE a2.TABLE_NAME = 'AIK'
AND a2.constraint_type = 'P'
)
ORDER BY A1.TABLE_NAME
)
LOOP
EXECUTE IMMEDIATE 'INSERT INTO '||I.OWNER||'.'||I.TABLE_NAME||' VALUES ('||lv_seq||','||''''||lv_seg1||''''||','||''''||lv_seg2||''''||')';
EXECUTE IMMEDIATE 'INSERT INTO '||I.OWNER||'.'||I.TABLE_NAME||' VALUES ('||lv_seq||','||''''||lv_seg1||''''||','||''''||lv_seg2||''''||')';
EXECUTE IMMEDIATE 'INSERT INTO '||I.OWNER||'.'||I.TABLE_NAME||' VALUES ('||lv_seq||','||''''||lv_seg1||''''||','||''''||lv_seg2||''''||')';
END LOOP;
END;