web-dev-qa-db-ja.com

データベースを再帰的階乗関数で埋める

テーブルのすべての行の階乗値を計算したいと思います。そして、テーブルの各行の階乗値に挿入したいと思います。以下のようなテーブルを作成します。

TABLE:FACTORIALS
------------------------------
| NUMBERS | FACTORIALS       |
|----------------------------| 
| 3       |                  |
| 5       |                  |
| 6       |                  |  
| 9       |                  |
| 7       |                  |
| 2       |                  | 
| 1       |                  |
------------------------------  

まず、テーブルには数字しかありません。階乗フィールドに呼び出し再帰関数ファクトを入力します。以下のような階乗関数。

CREATE OR REPLACE FUNCTION FACT(x IN number)
RETURN NUMBER 
IS
   f NUMBER;
BEGIN
   IF x=0 THEN
      f := 1;
   ELSE
      f := x * FACT(x-1);
   END IF;
RETURN f;
END;
/

階乗関数は機能します。そして、配列内のすべてのテーブル番号を選択したいと思います。次に、配列の要素を使用して階乗関数を呼び出します。結局、私はテーブル階乗のフィールドに入力したいと思います。それらすべてについて、私は以下のようにspを書きます:

DECLARE
COUNTER INTEGER := 0;
CURSOR C_NUMBERS IS SELECT  NUMBERS FROM FACTORIALS;
TYPE N_LIST IS VARRAY(7) OF FACTORIALS.NUMBERS%TYPE;
TYPE F_LIST IS VARRAY(7) OF FACTORIALS.FACTORIALS%TYPE;
NUMBER_LIST N_LIST := N_LIST();
FACTORIAL_LIST F_LIST := F_LIST(); 
BEGIN

FOR N IN C_NUMBERS LOOP
      COUNTER := COUNTER + 1;
      NUMBER_LIST.EXTEND;
      NUMBER_LIST(COUNTER) := N.NUMBERS;
 END LOOP;

FOR I IN 1 .. NUMBER_LIST.COUNT LOOP
      FACTORIAL_LIST.EXTEND;
      FACTORIAL_LIST(I) := FACT(NUMBER_LIST(I));
END LOOP;

FOR K IN 1..FACTORIAL_LIST.COUNT LOOP
      UPDATE FACTORIALS
      SET FACTORIALS = FACTORIAL_LIST(K)
      WHERE FACT(NUMBER_LIST(K)) = FACTORIAL_LIST(K);
END LOOP;

END;
/

ただし、このコードはすべての階乗フィールドに同じ値を入力します。これと同じ値がテーブルの最後の要素の階乗値です。テーブルは次のようになります。

* FACTORIALS TABLE AFTER THE SP IS RAN
------------------------------
| NUMBERS | FACTORIALS       |
|----------------------------| 
| 3       |    1             |
| 5       |    1             |
| 6       |    1             |  
| 9       |    1             |
| 7       |    1             |
| 2       |    1             | 
| 1       |    1             |
------------------------------  

FACTORIALテーブルの最後の要素1.コードはすべてのフィールドの最後の要素の階乗値、つまり1を挿入します。FACTORIALSテーブルの正しい場所を計算する階乗値を挿入するにはどうすればよいですか。

2
Mert Özoğul
DECLARE
    COUNTER INTEGER := 0;
    CURSOR C_NUMBERS IS SELECT  NUMBERS FROM FACTORIALS;
    TYPE N_LIST IS VARRAY(7) OF FACTORIALS.NUMBERS%TYPE;
    TYPE F_LIST IS VARRAY(7) OF FACTORIALS.FACTORIALS%TYPE;
    NUMBER_LIST N_LIST := N_LIST();
    FACTORIAL_LIST F_LIST := F_LIST(); 
BEGIN
    FOR N IN C_NUMBERS LOOP
          COUNTER := COUNTER + 1;
          NUMBER_LIST.EXTEND;
          NUMBER_LIST(COUNTER) := N.NUMBERS;
     END LOOP;

    FOR I IN 1 .. NUMBER_LIST.COUNT LOOP
          FACTORIAL_LIST.EXTEND;
          FACTORIAL_LIST(I) := F_FACT_NUMBER(NUMBER_LIST(I));
    END LOOP;
/***************************FIRST SOLUTION***************************/
    FOR K IN 1..NUMBER_LIST.COUNT LOOP
          UPDATE FACTORIALS
          SET FACTORIALS = FACTORIAL_LIST(K)
          WHERE NUMBERS = NUMBER_LIST(K);
    END LOOP;
/***************************SECOND SOLUTION**************************/
    FORALL INDX IN NUMBER_LIST.FIRST..NUMBER_LIST.LAST
                UPDATE FACTORIALS SET FACTORIALS = FACTORIAL_LIST(INDX) 
                WHERE NUMBERS = NUMBER_LIST(INDX);
END;
/

問題は解決しました。 PL/SQLコードに示されている2つのソリューションがあります。このコードを実行してから、以下のようにFACTORIALSテーブルを実行すると:

* FACTORIALS TABLE AFTER THE SP IS RAN
------------------------------
| NUMBERS | FACTORIALS       |
|----------------------------| 
| 3       |    6             |
| 5       |    120           |
| 6       |    720           |  
| 9       |    362880        |
| 7       |    5040          |
| 2       |    2             | 
| 1       |    1             |
------------------------------
0
Mert Özoğul