在oracle 11g中生成示例数据

在oracle 11g中生成示例数据,oracle,plsql,Oracle,Plsql,我有一个问题,下面的程序,它只是不选择随机街道和城镇。问题在于 streets(SYS.DBMS_RANDOM.VALUE(1,50)) 及 看起来它是随机的。值只计算一次,如何让它选择varray的随机元素 CREATE OR REPLACE PROCEDURE GENERATE_ADDRESSES AS type streetType is varray(50) of addresses.street%TYPE; streets streetType:= streetTy

我有一个问题,下面的程序,它只是不选择随机街道和城镇。问题在于

streets(SYS.DBMS_RANDOM.VALUE(1,50)) 

看起来它是随机的。值只计算一次,如何让它选择varray的随机元素

CREATE OR REPLACE PROCEDURE GENERATE_ADDRESSES AS
    type streetType is varray(50) of addresses.street%TYPE;
    streets streetType:= streetType('Rebel Loop East', 'Everleigh Rise', 'Double Oak,Pig Mount West', 'Byam Byway', 'South Damour Trail', 'Chart Hill Northwest', 'West Down Turnpike', 'Southeast Lawyers Hill Mount',
    'East Jibbon Road', 'Old Browns Valley Viaduct', 'Queensbury Viaduct', 'Northeast Hards Plaza', 'Northwest Cushing Promenade', 'North Queens Wood', 'South Oakton Plantation', 'East Redeker Terrace',
    'Stanbaugh Mount', 'Huse Nook', 'East Savine Grade', 'Bardo Manor', 'West Mina Rosa Place', 'West Oldarker Mall', 'West Oakgrove Lane', 'Woodleigh Row', 'Southwest Stoney Ridge Passage',
    'Cucumber Mews', 'Stoffa Trace North', 'West Echo Bay Alley', 'North Monkhams Terrace', 'Weller Grove West', 'Estate Walk', 'Doneraile Rise', 'North Yunga Burra Manor', 'Boundaries Square', 'Windsor Hill Row West',
    'South Silver Maple Close', 'West Back Westminster', 'East Bibsworth Causeway', 'Widdop Dell', 'Sawyer Hill', 'East Minehurst Street', 'East Ecclesbridge Close', 'North Clouston Court', 'Southwest Towradgi Alley',
    'Northeast Barkdoll Promenade', 'Southwest Icklingham Quay', 'North Fanum Quadrant', 'Nerbonne Croft', 'West Montee Alley', 'East Burra Street');

    type townType is varray(50) of addresses.town%TYPE;
    towns townType:= townType('Linland','Havenmoor','Fallbank','Marshbush','Whitenesse','Crystalfort','Dorhaven','Spellhall','Northbell','Westermerrow','Butterbeach','Fairbarrow','Violetbush','Westbeach','Landness','Rosemaple','Lochbush',
'Coastfield','Westmarsh','Golddale','Violetford','Elfacre','Brightmill','Bypine','Starryfox','Barrowmeadow','Ashbridge','Swynpond','Eribourne','Wintermill','Eribourne','Bridgebeach',
'Roselyn','Summerwinter','Fairviolet','Ashvale','Dordale','Osthaven','Deephaven','Whiteflower','Welledge','Snowbeach','Marblenesse','Witchnesse','Bluewell','Shorelake','Coldfalcon','Strongbush','','Freyholt');

    TYPE Addresses_type IS TABLE OF addresses%ROWTYPE INDEX BY BINARY_INTEGER;
    adb Addresses_type;
  BEGIN
    --fill streets and towns varrays
    insert into addresses(id, street, streetNo, town, countries_id)
    select rownum, streets(SYS.DBMS_RANDOM.VALUE(1,50)), floor(SYS.DBMS_RANDOM.VALUE(1,10000)) || '/' || floor(SYS.DBMS_RANDOM.VALUE(1,1000)), towns(SYS.DBMS_RANDOM.VALUE(1,50)), SYS.DBMS_RANDOM.VALUE(1,500)
    from dual
    connect by level <= 500;
  END GENERATE_ADDRESSES;
/
创建或替换过程生成\u地址
类型streetType是地址的varray(50)。street%类型;
街道街道类型:=街道类型(“叛军环路东部”、“埃弗里高地”、“双橡树”、“猪山西部”、“拜厄姆小道”、“南达莫尔小道”、“查特山西北部”、“西下收费公路”、“东南律师山”,
‘东吉本路’、‘老布朗谷高架桥’、‘昆斯伯里高架桥’、‘东北哈兹广场’、‘西北库欣长廊’、‘北昆斯伍德’、‘南奥克顿种植园’、‘东雷德克台’,
‘斯坦堡山’、‘休斯诺克’、‘东萨文等级’、‘巴尔多庄园’、‘西米娜罗莎广场’、‘西奥德克购物中心’、‘西奥克格罗夫巷’、‘伍德利街’、‘西南石岭通道’,
‘Cumber Mews’、‘Stoffa Trace North’、‘West Echo Bay Alley’、‘North Monkhams Terrace’、‘Weller Grove West’、‘Estate Walk’、‘Doneraile Rise’、‘North Yunga Burra Manor’、‘Bounders Square’、‘Windsor Hill Row West’,
“南银枫街”、“西后威斯敏斯特”、“东毕斯沃思堤道”、“维多普戴尔街”、“索耶山街”、“东米赫斯特街”、“东埃克莱斯布里奇街”、“北克劳斯顿法院”、“西南托拉吉巷”,
“东北巴克多尔海滨长廊”、“西南伊克林厄姆码头”、“北法努姆象限”、“内尔博恩·克罗夫特”、“西蒙特巷”、“东伯拉街”);
类型townType是varray(50)个地址。town%类型;
城镇类型:=城镇类型('Linland','Havenmor','Fallbank','Marshbush','Whitenesse','Crystalfort','Dorhaven','Spellhall','Northbell','Westermerrow','Butterbeach','Fairbarrow','Violetbush','Westbeach','Landness','Rosemaple','Lochbush',
“海岸场”、“Westmarsh”、“Golddale”、“Violetford”、“Elfacre”、“Brightmill”、“Bypine”、“Starryfox”、“Barrowmeadow”、“Ashbridge”、“Swynpond”、“Eribourne”、“Wintermill”、“Eribourne”、“Bridgebeach”等,
“Roselyn”、“Summerwinter”、“Fairviolet”、“Ashvale”、“Dordale”、“Osthaven”、“Deephaven”、“Whiteflower”、“Welledge”、“Snowbeach”、“Marblenesse”、“Witchnesse”、“Bluewell”、“Shorelake”、“Coldfalcon”、“Strongbush”、“Freyholt”);
TYPE Addresses\u TYPE是地址表%ROWTYPE索引的二进制\u整数;
adb地址类型;
开始
--充满街道和城镇
插入地址(id、街道、街道号、城镇、国家/地区)
选择rownum、streets(SYS.DBMS_RANDOM.VALUE(1,50))、floor(SYS.DBMS_RANDOM.VALUE(110000))| |'/'| | floor(SYS.DBMS_RANDOM.VALUE(11000))、towns(SYS.DBMS_RANDOM.VALUE(1,50))、SYS.DBMS_RANDOM.VALUE(1500)
来自双重
按级别连接城镇()和街道()是构造函数,但它们只是函数。我不知道为什么会出现这种情况(可能与connecty by over dual Internal works有关),但即使是警告,您也无法确定在SQL语句中调用函数的次数:

因为SQL是一种声明性语言,而不是命令式语言(或 过程)第一,您无法知道函数被调用了多少次 即使函数是用PL/SQL编写的,SQL语句也会运行 命令式语言。如果应用程序要求函数 执行一定次数后,不要从 SQL语句。改用光标

例如,如果应用程序要求调用函数 对于每个选定行,然后打开光标,从 游标,并为每行调用函数。这项技术保证了 函数的调用数就是获取的行数 从光标开始

因此,解决方法是针对每一行多次调用dbms_随机包:

for k in (select level as lev from dual connect by level <= 500)
loop
 insert into addresses(
   id, 
   street, 
   streetNo, 
   town, 
   countries_id
   )
values 
(
  k.lev, 
  streets(SYS.DBMS_RANDOM.VALUE(1,50)), 
  floor(SYS.DBMS_RANDOM.VALUE(1,10000)) || '/' || floor(SYS.DBMS_RANDOM.VALUE(1,1000)), 
  towns(SYS.DBMS_RANDOM.VALUE(1,50)), 
  SYS.DBMS_RANDOM.VALUE(1,500)
);
end loop;

我的建议是,如果您使用Toad for oracle工具,那么您可以使用随机值生成数百万个样本数据,您可以指定seq、varchar长度、数字长度等。。。 另一个主要优点是可以将fk和pk关系分别映射到子表和父表


转到架构浏览器>>表格>>右键单击所选表格,然后单击生成数据并选择一个限制,然后继续执行您的要求

看起来是随机的。值仅计算一次
,您能否对此进行进一步解释。这个程序对我来说很好。你是说,同一条街/城镇被插入了500次?没错。每一排都有相同的街道/城镇。但是街道没有预期的效果。
for k in (select level as lev from dual connect by level <= 500)
loop
 insert into addresses(
   id, 
   street, 
   streetNo, 
   town, 
   countries_id
   )
values 
(
  k.lev, 
  streets(SYS.DBMS_RANDOM.VALUE(1,50)), 
  floor(SYS.DBMS_RANDOM.VALUE(1,10000)) || '/' || floor(SYS.DBMS_RANDOM.VALUE(1,1000)), 
  towns(SYS.DBMS_RANDOM.VALUE(1,50)), 
  SYS.DBMS_RANDOM.VALUE(1,500)
);
end loop;
declare 
type townType is varray(50) of varchar2(1000);
    towns townType:= townType('Linland','Havenmoor','Fallbank','Marshbush','Whitenesse','Crystalfort','Dorhaven','Spellhall','Northbell','Westermerrow','Butterbeach','Fairbarrow','Violetbush','Westbeach','Landness','Rosemaple','Lochbush',
'Coastfield','Westmarsh','Golddale','Violetford','Elfacre','Brightmill','Bypine','Starryfox','Barrowmeadow','Ashbridge','Swynpond','Eribourne','Wintermill','Eribourne','Bridgebeach',
'Roselyn','Summerwinter','Fairviolet','Ashvale','Dordale','Osthaven','Deephaven','Whiteflower','Welledge','Snowbeach','Marblenesse','Witchnesse','Bluewell','Shorelake','Coldfalcon','Strongbush','','Freyholt');
v  varchar2(2000);

begin

   dbms_output.put_line('start!');

   select listagg(towns(level+1), ',') within group (order by 1) 
   into v 
   from dual
   connect by level < 5;

   dbms_output.put_line(v);

end loop;
end;
/
Linland,Linland,Linland,Linland