2016-03-15 25 views
0

我試圖通過幾個小時解決問題,但我無法處理它。如果你能幫助我解決一些想法,我將不勝感激。PLSQL Oracle:如何使用庫存程序在表中插入數據

我有2個表:1.表稱爲LASTNAME與一個列n(VARCHAR2),其存儲一些姓氏; 2.名爲FIRSTNAME的表,其中一列p(varchar2)存儲一些名字。我必須用這兩個表中的數據生成2000個完整名稱(姓氏和名字)的組合。

我的想法是:

select DISTINCT * 
from LASTNAME 
    CROSS JOIN FIRSTNAME 
WHERE ROWNUM <= 2000; 

生成所有組合。

我必須把這些2000的全名在另一個表叫學生。我會給你介紹學生:

Name   Null  Type   
------------ -------- ------------ 
REG_NUMBER NOT NULL CHAR(4)  
LASTNAME    VARCHAR2(20) 
FIRSTNAME    VARCHAR2(10) 
YEAR     NUMBER(1) 
GROUP     CHAR(2) 
SCHOLARSHIP   NUMBER(6,2) 
DATE_OF_BIRTH   DATE  

對於我會把表中的學生,我必須爲組生成的隨機值(1-7之間)的新同學,爲一年(1間3)和獎學金。

所有這些操作必須使用存儲過程來完成。

回答

0

您就可以使用一個SQL語句插入您的表中的數據如下:

insert into students ( REG_NUMBER,  
         LASTNAME, 
         FIRSTNAME, 
         "YEAR", 
         "GROUP", 
         SCHOLARSHIP, 
         DATE_OF_BIRTH 
        ) 
select to_char(rownum, 'fm0000'), 
     n, 
     p, 
     floor(dbms_random.value(1, 4)), 
     floor(dbms_random.value(1, 8)), 
     round(dbms_random.value(1, 9999),2), 
     null 
from (
     select distinct * 
     from LASTNAME 
      CROSS JOIN FIRSTNAME 
    ) 
WHERE ROWNUM <= 2000; 

語句簡單地使用你的起始數據,添加一些隨機值剩餘的字段;如果您需要,我將生日日期保留爲null,但您可以使用另一個隨機值填充此字段。

假設reg_number是主鍵,我使用rownum填充它;格式掩碼'fm0000'表示用前導零('0001','0002',...)將數字格式化爲正好4位數字,從而防止前導空格。

這是一個簡單的SQL語句;如果需要,您可以將其包裝在一個過程中。

請注意,您的表students的列中有保留字(例如GROUP),因此我必須使用引號;最好避免使用這種列名。

+0

感謝您的回答。你能解釋一下關於這一行的一些信息:to_char(rownum,'fm0000'),它究竟有什麼作用? – Caroso

+0

剛編輯答案 – Aleksej

0

如果你想隨機名稱對(包括重複名稱對的可能性),那麼你可以這樣做:

INSERT INTO STUDENTS (
    REG_NUMBER,  
    LASTNAME, 
    FIRSTNAME, 
    YEAR, 
    "GROUP", 
    SCHOLARSHIP, 
    DATE_OF_BIRTH 
) 
SELECT TO_CHAR(rownum, 'fm0000'), 
     n, 
     p, 
     FLOOR(DBMS_RANDOM.VALUE(1, 4)), 
     FLOOR(DBMS_RANDOM.VALUE(1, 8)), 
     ROUND(DBMS_RANDOM.VALUE(0, 9999), 2), 
     ADD_MONTHS(TRUNC(SYSDATE), -12*18) 
      + FLOOR(DBMS_RANDOM.VALUE(0,365*4+1)) 
FROM (SELECT FLOOR(DBMS_RANDOM.VALUE(0,(SELECT COUNT(*) FROM LASTNAME)))+1 AS lrn, 
       FLOOR(DBMS_RANDOM.VALUE(0,(SELECT COUNT(*) FROM FIRSTNAME)))+1 AS frn 
      FROM DUAL 
      CONNECT BY LEVEL <= 2000 
     ) r 
     INNER JOIN 
     (SELECT n, ROWNUM AS rn FROM LASTNAME) l 
     ON (r.lrn = l.rn) 
     INNER JOIN 
     (SELECT p, ROWNUM AS rn FROM FIRSTNAME) f 
     ON (r.frn = f.rn); 
相關問題