繁体   English   中英

如何使用存储过程创建随机 function? 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);

我想创建一个 function ,为客户和项目的每个组合创建一个额外的随机条目在表价格中。

我怎样才能做到这一点?

不要使用 function,创建一个过程并使用INSERT... SELECTcustomersitems表的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表可能(随机)包含:

客户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查询并使用 cursor 循环:

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 这里

UPD:请注意,我相信 MT0 的想法更好,因为您只需要一个插入语句。 我的解决方案适用于需要使用 add_price function 的情况

因此,“客户和项目的每个组合”意味着您需要一个笛卡尔积:

select cust_id, item_id
  from customers
  cross join items;

例如,如果您在“客户”和“项目”表中有以下数据:

cust_id 客户名称
1 一个
2
item_id 项目名
1 一个
2 b

上面的查询将返回:

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,因此结果将在这些数字之间。 您可能需要以某种方式设置它们。 也需要四舍五入

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM