0

生成したい単語を含むテーブル

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 コマンドが正しく終了していません

制限が問題かもしれないと思います...???

4

1 に答える 1

1

そうです、limitそれはオラクルがサポートしているものではないため、問題です。

代わりに、次のようなことができます。

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

つまり、2 つのテーブルからフィールドのすべての可能な組み合わせを生成し、ランダムに並べ替えて、最初の 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するとさらに高速になる可能性があります。

于 2013-04-03T11:23:59.727 に答える