【问题标题】:Oracle SQL insert query - into parent and child tablesOracle SQL 插入查询 - 插入父表和子表
【发布时间】:2013-10-19 06:46:23
【问题描述】:

对于一个任务,我有类似以下内容(为简洁起见):

STUDENT(StudentID, Fname. Lname)  StudentID PK
UNIT(UnitID, UnitName)            UnitID PK
STUDENT_UNIT((StudentID, UnitID)  StudentID PK/FK UnitID PK/FK

需要插入有关学生及其已完成单元的信息。 由于它只是初学者级别的 SQL,因此接受以下内容

INSERT INTO STUDENT
VALUES(seqStudID.NextVal, 'Bob', 'Brown');

INSERT INTO STUDENT_UNIT(seqStudID.CurrVal, 111);

INSERT INTO STUDENT_UNIT(seqStudID.CurrVal, 222);

INSERT INTO STUDENT_UNIT(seqStudID.CurrVal, 333);

但我想知道输入这些数据的真正方法是什么,它会是一个带循环的过程吗?如果是这样,什么样的循环(以便它可以处理任何数量的单位)。

提前致谢

【问题讨论】:

    标签: sql oracle insert


    【解决方案1】:

    最好的方法之一是使用stored procedure。以下过程将为您完成所有工作。

    CREATE OR REPLACE 
    PROCEDURE set_stud_unit(
              i_fname IN VARCHAR2,
              i_lname IN VARCHAR2,
              i_unitid IN VARCHAR2)
    IS
         l_studentid student.studentid%TYPE;
    BEGIN
    
         INSERT INTO student(studentid, fname, lname)
              VALUES(seqstudid.NEXTVAL, i_fname, i_lname)
              RETURNING studentid INTO l_studentid;
    
         INSERT INTO student_unit (studentid, unitid)
              (SELECT l_studentid, (COLUMN_VALUE).getNumberVal() vid FROM xmltable(i_unitid));
    
         COMMIT;
    
    END;     
    /
    

    您可以将 unitid 作为逗号分隔,如下所示,

    EXECUTE set_stud_unit('Bob', 'Brown', '111,222,333');
    

    【讨论】:

    • 感谢您的回复。我会尝试页面上的所有建议。
    • 嗨,这适用于所示示例。如果 STUDENT_UNIT 表需要更多列,你能告诉我如何实现它吗?说诸如学期、年份和年级之类的内容?干杯
    【解决方案2】:

    您可以在插入中使用 select:

    INSERT INTO STUDENT_UNIT select t1.StudentID ,t2.UnitID from STUDENT t1 ,UNIT t2;
    

    您可以使用 where 来限制此选择 ;-)

    【讨论】:

    • 感谢您的回复。我会尝试页面上的所有建议。
    【解决方案3】:

    可能你需要的是一个接受的过程:

    • 名字
    • 姓氏
    • 一组单位

    程序将:

    • 插入STUDENT(我建议你使用触发器填充StudentID,也许你已经在做),
    • 循环遍历数组并将数组的每个元素以及名字和姓氏的 StudentID 插入 STUDENT_UNIT,但不使用序列。我的伪代码:

      FOR i IN 1..input_array.count LOOP
          INSERT INTO STUDENT_UNIT
          SELECT StudentID, input_array(i)
            FROM STUDENT
           WHERE Fname = FirstNameParam
             AND Lname = LastNameParam;
      END LOOP;
      

    建议你查询student表获取实际ID,避免并发出现问题。一种优化方法是只查询 STUDENT 表一次并将 StudentID 保存在一个变量中。

    您可以在此处找到有关将数组传递给 Oracle 过程的更多信息: Passing an array of data as an input parameter to an Oracle procedure

    【讨论】:

    • 感谢您的回复。我会尝试页面上的所有建议。
    猜你喜欢
    • 1970-01-01
    • 2011-11-06
    • 2018-11-04
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-11-07
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多