如何使用 WHILE 循环直到列中的所有值都为零? pl/sql
How to use a WHILE loop until all values in a column to be zero? pl/sql
例如,假设我们有 kids table 和 candy table .
create table kids( kid_name varchar2(20), money number);
create table candy( candy_name varchar(20), price number);
并且我想创建一个 procedure(sales)
来销售随机 kid_name 购买随机 candy_name。在每次销售中,孩子们的钱都在减少,直到所有孩子的钱 := 0。
while循环如何表达?
除非孩子们的钱正好是糖果价格的倍数(或者糖果店愿意在孩子们没有足够的钱时以较低的价格出售糖果)那么你不太可能达到 0。
例如,如果您有 tables:
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
table可能随机包含:
KID_NAME
MONEY
Alice
.06
Beryl
.03
Carol
.08
这还不够买糖果
db<>fiddle here
例如,假设我们有 kids table 和 candy table .
create table kids( kid_name varchar2(20), money number);
create table candy( candy_name varchar(20), price number);
并且我想创建一个 procedure(sales)
来销售随机 kid_name 购买随机 candy_name。在每次销售中,孩子们的钱都在减少,直到所有孩子的钱 := 0。
while循环如何表达?
除非孩子们的钱正好是糖果价格的倍数(或者糖果店愿意在孩子们没有足够的钱时以较低的价格出售糖果)那么你不太可能达到 0。
例如,如果您有 tables:
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
table可能随机包含:
KID_NAME MONEY Alice .06 Beryl .03 Carol .08
这还不够买糖果
db<>fiddle here