不要使用函数,而是创建一个过程并将INSERT ... SELECT 与customers 和items 表的CROSS JOIN 一起使用:
CREATE PROCEDURE generate_random_prices
IS
BEGIN
INSERT INTO prices (customer_id, item_id, price)
SELECT c.customer_id,
i.item_id,
ROUND(DBMS_RANDOM.VALUE(0,100),2)
FROM customers c
CROSS JOIN items i;
END generate_random_prices;
/
如果你有样本数据:
CREATE TABLE customers (customer_id PRIMARY KEY) AS
SELECT COLUMN_VALUE FROM TABLE(SYS.ODCINUMBERLIST(1,5,42));
CREATE TABLE items (item_id PRIMARY KEY) AS
SELECT COLUMN_VALUE FROM TABLE(SYS.ODCINUMBERLIST(1,3,61));
CREATE TABLE prices (
customer_id REFERENCES customers(customer_id),
item_id REFERENCES items(item_id),
price NUMBER(4,2)
);
然后:
BEGIN
generate_random_prices();
END;
/
prices 表可能(随机)包含:
| CUSTOMER_ID |
ITEM_ID |
PRICE |
| 1 |
1 |
38.91 |
| 1 |
3 |
39.74 |
| 1 |
61 |
67.28 |
| 5 |
1 |
13.92 |
| 5 |
3 |
48.17 |
| 5 |
61 |
70.21 |
| 42 |
1 |
90.33 |
| 42 |
3 |
5.7 |
| 42 |
61 |
40.37 |
如果您想调用您的 ADD_PRICE 过程,那么只需使用相同的 CROSS JOIN 查询并使用游标循环:
CREATE PROCEDURE generate_random_prices
IS
BEGIN
FOR rw IN (SELECT c.customer_id,
i.item_id
FROM customers c
CROSS JOIN items i)
LOOP
ADD_PRICE(rw.customer_id, rw.item_id, ROUND(DBMS_RANDOM.VALUE(0,100),2));
END LOOP;
END generate_random_prices;
/
(但只使用单个 INSERT ... SELECT 语句会更有效。)
db<.fiddle href="https://dbfiddle.uk/?rdbms=oracle_18&fiddle=c22bdb22d90d658cc3421e1957cfd5fe" rel="nofollow" target="_blank">here