Oracle 从一个表生成随机字以插入另一个表(PLSQL)
包含我要生成的单词的表Oracle 从一个表生成随机字以插入另一个表(PLSQL),oracle,plsql,Oracle,Plsql,包含我要生成的单词的表 create table words ( word varchar(100)); insert into words values ('Main street'); insert into words values ('Patrick Street'); insert into words values ('Red Street'); insert into words values ('Green street'); insert into words values
create table words
( word varchar(100));
insert into words values ('Main street');
insert into words values ('Patrick Street');
insert into words values ('Red Street');
insert into words values ('Green street');
insert into words values ('Blue street');
insert into words values ('Yellow street');
insert into words values ('Silver street');
insert into words values ('Gold street');
insert into words values ('Brown street');
用于插入的PLSQL代码
declare
randTemp number(10);
tempCounty VARCHAR(20);
streetaddress VARCHAR(100);
Begin
For i in 1..9
Loop
randTemp := dbms_random.value(1,5);
SELECT c.countyname INTO tempCounty FROM county C WHERE c.countyid = randTemp;
SELECT w.word INTO streetaddress FROM words w ORDER BY dbms_random.random limit 1;
Insert into BRANCH values(i,streetaddress,tempCounty,randTemp);
End loop;
Commit;
End;
/
除此select语句外,所有操作都正常
SELECT w.word INTO streetaddress FROM words w ORDER BY dbms_random.random limit 1;
我得到这个错误
ORA-06550:第10行第75列:
PL/SQL:ORA-00933:SQL命令未正确结束
我认为限制可能是问题所在…?你说得对,
限制是问题所在,因为Oracle不支持这一点
您可以这样做:
SELECT word INTO streetaddress
FROM (
SELECT word
FROM words
ORDER BY dbms_random.random
)
WHERE rownum = 1;
内部查询对潜在单词进行随机排序,而外部查询使用rownum
pseudocolumn来选择返回的第一个单词,这与limit
的操作类似
不过,在循环中重复该查询似乎效率不高;您最好做以下事情:
DECLARE
tempCounty VARCHAR(20);
streetaddress VARCHAR2(100);
cur sys_refcursor;
BEGIN
OPEN cur FOR
SELECT word, countyname
FROM (
SELECT w.word, c.countyname
FROM words w
CROSS JOIN county c
ORDER BY dbms_random.random
)
WHERE rownum <= 9;
LOOP
FETCH cur INTO streetaddress, tempCounty;
EXIT WHEN cur%NOTFOUND;
dbms_output.put_line(streetaddress ||', '|| tempCounty);
END LOOP;
END;
/
如果您在PL/SQL中进行更多的处理,并且有很多行,那么使用批量收集
可能会进一步加快速度。显然,12c中引入了限制。
INSERT INTO branch
SELECT rownum, word, countyname, countyid
FROM (
SELECT w.word, c.countyname, c.countyid
FROM words w
CROSS JOIN county c
ORDER BY dbms_random.random
)
WHERE rownum <= 9;