Я хочу создать 10 пар случайных целых чисел в диапазоне [-4, + 4) с использованием PLSQL, а затем с помощью пары для решения основного уравнения (num1 * X + num2 = 0) и сохранить результаты в таблице, а также текстовый вывод того, какой тип результата для уравнения (решаемый/неопределенный/невозможный). Я использую Oracle LiveSQL.
Я использовал курсор, чтобы убедиться, что случайное число является целым числом.
CURSOR NUMcursor1 IS
SELECT ROUND(DBMS_RANDOM.VALUE(-4,+4),0) FROM DUAL;
num1 EquatA2.dat1%TYPE; num2 EquatA2.dat2%TYPE;
solution EquatA2.sol%TYPE; notes EquatA2.note%TYPE;
'
'
CREATE TABLE EquatA2
(
dat1 NUMBER(2,0),
dat2 NUMBER(2,0),
sol NUMBER(6,3),
note VARCHAR2(20)
)
DECLARE
num1 EquatA2.dat1%TYPE; num2 EquatA2.dat2%TYPE;
solution EquatA2.sol%TYPE; notes EquatA2.note%TYPE;
i INT; i:=1;
CURSOR NUMcursor1 IS
SELECT ROUND(DBMS_RANDOM.VALUE(-4,+4),0) FROM DUAL;
CURSOR NUMcursor2 IS
SELECT ROUND(DBMS_RANDOM.VALUE(-4,+4),0) FROM DUAL;
BEGIN
OPEN NUMcursor1;
OPEN NUMcursor2;
FOR i IN 1..10
LOOP
FETCH NUMcursor1 INTO num1;
EXIT WHEN NUMcursor1%NOTFOUND;
FETCH NUMcursor2 INTO num2;
EXIT WHEN NUMcursor2%NOTFOUND;
DBMS_OUTPUT.PUT_LINE(num1);
DBMS_OUTPUT.PUT_LINE(num2);
IF (num1 != 0) THEN solution := -num2 / num1 AND notes := 'solvable';
ELSIF (num1 == 0 AND num2 == 0) THEN notes := 'indefinite';
ELSIF (num1 == 0 AND num2 != 0) THEN notes := 'impossible';
END IF;
INSERT INTO EquatA2 VALUES(num1,num2,solution,notes);
END LOOP;
END;
'
"Ожидаемые результаты: 10 текстовых выходов и диапазон случайных чисел, которые будут [-4, + 4)
Фактические результаты (ошибки): ORA-00922: missing or invalid option Invalid statement Unsupported Command Invalid statement Result Set 6 ROUND(DBMS_RANDOM.VALUE(-4,+4),0) -2 Download CSV Invalid statement Result Set 7 ROUND(DBMS_RANDOM.VALUE(-4,+4),0) -3 Download CSV ORA-06550: line 18, column 56: PLS-00103: Encountered the symbol "=" when expecting one of the following:. ( * @% & = - +; </> at in is mod remainder not rem <an exponent (**)> <> or != or ~=>= <= <> and or like like2 like4 likec between || multiset member submultiset The symbol "* was inserted before "=" to continue.
ORA-00922: missing or invalid option Invalid statement Unsupported Command Invalid statement Result Set 6 ROUND(DBMS_RANDOM.VALUE(-4,+4),0) -2 Download CSV Invalid statement Result Set 7 ROUND(DBMS_RANDOM.VALUE(-4,+4),0) -3 Download CSV ORA-06550: line 18, column 56: PLS-00103: Encountered the symbol "=" when expecting one of the following:. ( * @% & = - +; </> at in is mod remainder not rem <an exponent (**)> <> or != or ~=>= <= <> and or like like2 like4 likec between || multiset member submultiset The symbol "* was inserted before "=" to continue.
Я изменил ваш код, чтобы он работал. Ну вот.
Таблица:
SQL> CREATE TABLE EquatA2
2 (
3 dat1 NUMBER(2,0),
4 dat2 NUMBER(2,0),
5 sol NUMBER(6,3),
6 note VARCHAR2(20)
7 );
Table created.
SQL>
PL/SQL анонимная процедура:
SQL> DECLARE
2 num1 EquatA2.dat1%TYPE;
3 num2 EquatA2.dat2%TYPE;
4 solution EquatA2.sol%TYPE;
5 notes EquatA2.note%TYPE;
6 BEGIN
7 delete from equata2;
8 FOR i IN 1..10 LOOP
9 num1 := ROUND(DBMS_RANDOM.VALUE(-4, +4), 0);
10 num2 := ROUND(DBMS_RANDOM.VALUE(-4, +4), 0);
11 -- DBMS_OUTPUT.PUT_LINE(num1);
12 -- DBMS_OUTPUT.PUT_LINE(num2);
13
14 IF num1 != 0 THEN
15 solution := -num2 / num1;
16 notes := 'solvable';
17 ELSIF num1 = 0 AND num2 = 0 THEN
18 notes := 'indefinite';
19 ELSIF num1 = 0 AND num2 != 0
20 THEN notes := 'impossible';
21 END IF;
22
23 INSERT INTO EquatA2 VALUES (num1, num2, solution, notes);
24 END LOOP;
25 END;
26 /
PL/SQL procedure successfully completed.
Результат:
SQL> select * from equata2;
DAT1 DAT2 SOL NOTE
---------- ---------- ---------- --------------------
1 -4 4 solvable
-1 0 0 solvable
0 3 0 impossible
0 2 0 impossible
0 0 0 indefinite
3 -1 ,333 solvable
4 3 -,75 solvable
1 -1 1 solvable
-1 -2 -2 solvable
2 3 -1,5 solvable
10 rows selected.
SQL>
CURSOR
- это объявление PL / SQL, поэтому оно может существовать только в разделе объявлений блока PL / SQL.