【问题标题】:generate random words from a table to insert into another table( PLSQL)从表中生成随机词以插入另一个表(PLSQL)
【发布时间】:2013-04-03 11:00:43
【问题描述】:

包含我要生成的单词的表格

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 plsql


    【解决方案1】:

    你说得对,limit 是问题所在,因为这不是 Oracle 支持的东西。

    你可以这样做:

    SELECT word INTO streetaddress
    FROM (
        SELECT word
        FROM words
        ORDER BY dbms_random.random
    )
    WHERE rownum = 1;
    

    内部查询随机排序潜在单词,而输出查询使用rownum 伪列选择返回的第一个,类似于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;
    /
    

    也就是说,从两个表中生成所有可能的字段组合,随机排序,并将其限制为前 9 个结果。

    但这取决于你在做什么 - 如果你只是按照问题的建议填充另一个表,那么你可以使用这种查询作为 insert into ... select ... 构造的一部分,避免 PL/SQL 和循环完全:

    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;
    

    如果您在 PL/SQL 中进行更多处理并且有很多行,那么使用 bulk collect 可能会进一步加快处理速度。

    【讨论】:

    • LIMIT 显然是在 12c 中引入的。
    猜你喜欢
    • 2014-09-02
    • 2013-12-17
    • 2016-01-28
    • 2021-04-11
    • 2015-08-05
    • 2016-08-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多