pl/sql 从 table 中找出最大公因数

pl/sql find greatest common factor from a table

我试图找出我放入 table 中的一些数字的最大公约数。到目前为止,我已经有了计算 gcf

的函数
CREATE FUNCTION gcd (x INTEGER, y INTEGER) RETURN INTEGER AS
   ans INTEGER;
BEGIN
   IF (y <= x) AND (x MOD y = 0) THEN
      ans := y;
   ELSIF x < y THEN 
      ans := gcd(y, x);
   ELSE
      ans := gcd(y, x MOD y);
   END IF;
   RETURN ans;
END;

我在这里创建并随机填充我的 table

DROP TABLE numere
/
CREATE TABLE numbers (number NUMBER(3) NOT NULL)
/
set serveroutput on
DECLARE
number NUMBER(3);
cursor c1 is
   SELECT * FROM note;
BEGIN
   FOR i IN 1 .. 10 LOOP
      number:=dbms_random.value(20,100);
      insert into numbers values(number);
   end loop;
   commit;
END;
/

如何将 gcf 集成到我的代码中?我想显示数字后跟他们的 gcf。

我不确定你的 gcd 功能。在我看来不起作用。网上有很多。这是其中之一:

CREATE OR REPLACE FUNCTION find_gcd (
      p_n1    IN  POSITIVE
  ,   p_n2    IN  POSITIVE
  )
  RETURN POSITIVE
  IS
      l_n1    POSITIVE := p_n1;
      l_n2    POSITIVE := p_n2;
  BEGIN
      WHILE NOT (l_n1 = l_n2)
      LOOP
          CASE SIGN(l_n1 - l_n2)
          WHEN +1
          THEN l_n1 := l_n1 - l_n2;
          ELSE l_n2 := l_n2 - l_n1;
          END CASE;
      END LOOP;
      RETURN (l_n1);
  END find_gcd;
  /

你可以简单地修改你的 PL/SQL 块来调用 gcd 函数并打印出结果(我在这里假设你想为你的 table 中的每个数字和以下数字找到 gcd , 所以我使用了 LEAD 函数):

DECLARE
lv_number NUMBER(3);
lv_gcd INTEGER;
BEGIN
   FOR i IN 1 .. 10 LOOP
      lv_number:=dbms_random.value(20,100);
      insert into numbers values(lv_number);
   end loop;
   commit;

   FOR i in (select COL_VAL, lead(COL_VAL) over (order by rowid) nxt_val from numbers)
   LOOP
   lv_gcd := find_gcd(i.COL_VAL, i.nxt_val);
   DBMS_OUTPUT.PUT_LINE('GCD for '||TO_CHAR(i.COL_VAL)||' and '|| TO_CHAR(i.nxt_val) ||' is '||TO_CHAR(lv_gcd));
   END LOOP;

END;

/