如何使用存储过程创建随机函数? PL/SQL
How to create random function using a stored procedure? PL/SQL
我有一个添加数据的程序
add_price (cust_id customers.id%type,
items_id items.id%type,
price number);
并且我想创建一个函数,为客户和商品的每个组合创建一个额外的随机条目 table 价格。
我该怎么做?
不要使用函数,创建一个过程并将 INSERT ... SELECT
与 customers
的 CROSS JOIN
和 items
table 一起使用:
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
table 可能(随机)包含:
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 here
UPD:请注意,我相信 MT0 的想法更好,因为您只需要一个插入语句。我的解决方案是针对需要使用 add_price 函数的情况
因此,“客户和商品的每个组合”意味着您需要笛卡尔积:
select cust_id, item_id
from customers
cross join items;
例如,如果您在“客户”和“商品”中有以下数据table:
cust_id
cust_name
1
A
2
B
item_id
item_name
1
a
2
b
上面的查询会 return:
cust_id
item_id
1
1
1
2
2
1
2
2
这样,剩下的就是获取随机值了。为此使用 dbms_random.value
begin
for q in (select cust_id, item_id from customers cross join items) loop
add_price(q.cust_id, q.item_id, round(dbms_random.value(10, 1000), 2));
end loop;
end;
value 的参数是 lowes_value 和 highest_value,因此结果将介于这些数字之间。您可能需要以某种方式设置它们。也需要四舍五入
我有一个添加数据的程序
add_price (cust_id customers.id%type,
items_id items.id%type,
price number);
并且我想创建一个函数,为客户和商品的每个组合创建一个额外的随机条目 table 价格。
我该怎么做?
不要使用函数,创建一个过程并将 INSERT ... SELECT
与 customers
的 CROSS JOIN
和 items
table 一起使用:
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
table 可能(随机)包含:
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 here
UPD:请注意,我相信 MT0 的想法更好,因为您只需要一个插入语句。我的解决方案是针对需要使用 add_price 函数的情况
因此,“客户和商品的每个组合”意味着您需要笛卡尔积:
select cust_id, item_id
from customers
cross join items;
例如,如果您在“客户”和“商品”中有以下数据table:
cust_id | cust_name |
---|---|
1 | A |
2 | B |
item_id | item_name |
---|---|
1 | a |
2 | b |
上面的查询会 return:
cust_id | item_id |
---|---|
1 | 1 |
1 | 2 |
2 | 1 |
2 | 2 |
这样,剩下的就是获取随机值了。为此使用 dbms_random.value
begin
for q in (select cust_id, item_id from customers cross join items) loop
add_price(q.cust_id, q.item_id, round(dbms_random.value(10, 1000), 2));
end loop;
end;
value 的参数是 lowes_value 和 highest_value,因此结果将介于这些数字之间。您可能需要以某种方式设置它们。也需要四舍五入