生成指定范围内的随机数

时间:2019-01-19 19:27:38

标签: oracle plsql

我想使用PLSQL在[-4,+ 4)范围内创建10对随机整数,然后使用该对求解一次方程(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.

1 个答案:

答案 0 :(得分:2)

我已经修改了您的代码,使其可以正常工作。给你。

表格:

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>