从列表

时间:2015-12-30 01:05:43

标签: java oracle plsql

我正在开发一个使用过程在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是具有序列

的过程中定义的属性

我担心有些人可能不理解这个问题,但事实上我有点混淆

全部谢谢

2 个答案:

答案 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;