在SQL Developer中创建所有表后,我需要用至少10000个条目填充它们。我没有问题表没有FK零。 如何从其他表中获取随机值?
select rand()在此语句中不起作用。但是max()确实如此。
CREATE OR REPLACE PROCEDURE NAPOLNI_ARTIKEL
(
ST_ARTIKLOV IN VARCHAR2 DEFAULT 10000
) AS
naziv VARCHAR2(25);
opis VARCHAR2(25);
model VARCHAR2(10);
cena FLOAT(2);
gar INTEGER;
ddv INTEGER;
tip INTEGER;
CURSOR c1 IS
SELECT id_dobavitelj
FROM dobavitelj;
BEGIN
FOR rndx IN c1 LOOP
FOR st IN 1..ST_ARTIKLOV LOOP
naziv := 'naziv';
naziv := naziv ||' '|| TO_CHAR(st);
opis := 'opis';
opis := opis ||' '|| TO_CHAR(st);
model := 'model';
model := model ||' '|| TO_CHAR(st);
cena := dbms_random.value(1.25,230.0);
SELECT NVL(RAND(id_garancija),1)
INTO gar
FROM garancija;
SELECT NVL(RAND(id_ddv),1)
INTO ddv
FROM DDV;
SELECT NVL(RAND(id_tip),1)
INTO tip
FROM tip;
INSERT INTO ARTIKEL(ID_ARTIKLA, NAZIV, OPIS, MODEL, CENA, TIP_ID_TIP, DOBAVITELJ_ID_DOBAVITELJ, GARANCIJA_ID_GARANCIJE, DDV_ID_DDV) VALUES (st, naziv, opis, model, cena, tip, rndx, gar, ddv);
END LOOP;
END LOOP;
END NAPOLNI_ARTIKEL;
* id_artikla INTEGER NOT NULL ,
* naziv VARCHAR2 (25) NOT NULL ,
opis VARCHAR2 (25) ,
* model VARCHAR2 (10) NOT NULL ,
* cena FLOAT (2) NOT NULL ,
F * Tip_id_tip INTEGER NOT NULL ,
F * Dobavitelj_id_dobavitelj INTEGER NOT NULL ,
F Garancija_id_garancije INTEGER ,
F * DDV_id_ddv INTEGER NOT NULL
答案 0 :(得分:1)
要从表中选择一个随机值,您可以使用随机排序的子查询,然后从中选择第一行:
SELECT id_garancija
INTO gar
FROM (
SELECT id_garancija
FROM garancija
ORDER BY dbms_random.value
)
WHERE rownum = 1;
对于大量数据,您还可以使用the sample()
clause来避免必须从表中查找和排序所有值:
SELECT id_garancija
INTO gar
FROM garancija
SAMPLE(1)
WHERE rownum = 1;
您可以根据表格的大小设置样本大小;例如,10000行就可以使用0.1。您可以阅读更多here。
如果您同时填充父表和子表,则可以考虑将INSERT ALL
语法同时插入多个表中,使用相同的值(例如,从序列中),而不是稍后再看一遍。看起来你想要外键的随机组合,所以这可能没有帮助。