テーブルのすべての行の階乗値を計算したいと思います。そして、テーブルの各行の階乗値に挿入したいと思います。以下のようなテーブルを作成します。
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テーブルの正しい場所を計算する階乗値を挿入するにはどうすればよいですか。
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 |
------------------------------