如何使用 WHILE 循环,直到列中的所有值都为零? pl/sql
Posted
技术标签:
【中文标题】如何使用 WHILE 循环,直到列中的所有值都为零? pl/sql【英文标题】:How to use a WHILE loop until all values in a column to be zero? pl/sql 【发布时间】:2022-01-01 22:31:34 【问题描述】:例如,假设我们有儿童桌和糖果桌。
create table kids( kid_name varchar2(20), money number);
create table candy( candy_name varchar(20), price number);
并且我想创建一个 procedure(sales),它会为随机的 child_name 进行销售并购买随机的 candy_name。在每次销售中,孩子们的钱都在减少,直到所有孩子的钱:= 0。 如何用while循环表达?
【问题讨论】:
How to get records randomly from the oracle database? 【参考方案1】:除非孩子们的钱是糖果棒价格的整数倍(或者当孩子们没有足够的钱时糖果店愿意以更低的价格出售糖果),那么你就是不可能达到 0。
例如,如果您有表格:
CREATE TABLE kids (kid_name, money) AS
SELECT 'Alice', 1.23 FROM DUAL UNION ALL
SELECT 'Beryl', 2.34 FROM DUAL UNION ALL
SELECT 'Carol', 4.56 FROM DUAL;
CREATE TABLE candy (candy_name, price) AS
SELECT 'A', 0.12 FROM DUAL UNION ALL
SELECT 'B', 0.23 FROM DUAL UNION ALL
SELECT 'C', 0.34 FROM DUAL;
以及程序:
CREATE PROCEDURE sell_random_candy
IS
BEGIN
LOOP
MERGE INTO kids dst
USING (
SELECT k.ROWID rid,
c.price
FROM kids k
INNER JOIN candy c
ON (c.price <= k.money)
ORDER BY DBMS_RANDOM.VALUE
FETCH FIRST ROW ONLY
) src
ON (src.rid = dst.ROWID)
WHEN MATCHED THEN
UPDATE
SET money = dst.money - src.price;
EXIT WHEN SQL%ROWCOUNT = 0;
END LOOP;
END;
/
然后在运行程序之后,kids
表可能会随机包含:
KID_NAME MONEY Alice .06 Beryl .03 Carol .08
这还不够买糖果。
db小提琴here
【讨论】:
以上是关于如何使用 WHILE 循环,直到列中的所有值都为零? pl/sql的主要内容,如果未能解决你的问题,请参考以下文章
当结构中的所有值都为空时,如何在 Scala spark 中使结构为空?
如果数组中的所有值都为真(字符串)并且其中一个值为假(字符串),则如何返回布尔值 true 停止使用 Javascript 进行检查