簡體   English   中英

PLSQL Oracle:如何使用存儲過程在表中插入數據

[英]PLSQL Oracle: How to insert data in a table using stocked procedures

我試圖通過幾個小時來解決問題,但是我無法解決。 如果您能幫助我解決一些問題,我將不勝感激。

我有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之間)和獎學金生成隨機值。

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

您可以使用單個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;

該語句僅使用您的起始數據,為其余字段添加一些隨機值; 我將birthdate保留為空,但是如果需要,您可以使用另一個隨機值來填充此字段。

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

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

請注意,您的餐桌students有以保留字命名的列(例如GROUP ),因此我必須使用引號; 最好避免使用此類列名。

如果您想要隨機的名稱對(包括重復的名稱對的可能性),則可以執行以下操作:

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 );

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM