我有一個添加資料的程式
add_price (cust_id customers.id%type,
items_id items.id%type,
price number);
我想創建一個函式,為客戶和商品的每個組合在表價格中隨機輸入一個額外的組合。
我怎樣才能做到這一點?
uj5u.com熱心網友回復:
不要使用功能,創建一個程序和使用INSERT ... SELECT與CROSS JOIN的customers和items表:
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表可能(隨機)包含:
顧客ID ITEM_ID 價錢 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這里
uj5u.com熱心網友回復:
UPD:請注意,我相信 MT0 的想法更好,因為您只需要一個插入陳述句。我的解決方案是針對需要使用 add_price 函式的情況
因此,“客戶和商品的每種組合”意味著您需要一個笛卡爾積:
select cust_id, item_id
from customers
cross join items;
例如,如果您在“customers”和“items”表中有以下資料:
| cust_id | 客戶名稱 |
|---|---|
| 1 | 一種 |
| 2 | 乙 |
| item_id | 專案名稱 |
|---|---|
| 1 | 一種 |
| 2 | 乙 |
上面的查詢將回傳:
| 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,因此結果將介于這些數字之間。您可能需要以某種方式設定它們。也需要四舍五入
轉載請註明出處,本文鏈接:https://www.uj5u.com/qukuanlian/363138.html
