如何使用 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 进行检查

为啥 QueryVertices 中的所有坐标都为零?

在 Python 的“while”循环中使用“and”表达式