Oracle SQL Код ошибки ORA-06502: PL / SQL: numeri c или ошибка значения: буфер строки символов слишком мал в строке 18 - PullRequest
0 голосов
/ 17 июня 2020

Я какое-то время застревал, пытаясь исправить эту ошибку, и не могу понять. Я исследовал этот код ошибки, и проблема в том, что я пытаюсь сохранить число / символ, которое не может поместиться в переменную. В моем коде все выглядит нормально, и я не могу найти проблему.

Вот информация из таблицы Student:

  COLUMN_NAME DATA_TYPE      NULLABLE DATA_DEFAULT COLUMN_ID COMMENTS 
1 STU_ID      NUMBER(6,0)    Yes      (null)       1         (null) 
2 LAME        CHAR(8 BYTE)   Yes      (null)       2         (null) 
3 FAME        CHAR(8 BYTE)   Yes      (null)       3         (null)
4 MI          CHAR(2 BYTE)   Yes      (null)       4         (null) 
5 SEX         CHAR(2 BYTE)   Yes      (null)       5         (null) 
6 MAJOR       CHAR(10 BYTE)  Yes      (null)       6         (null) 
7 HOME_STATE  CHAR(5 BYTE)   Yes      (null)       7         (null)

Вот код, который я использую:

SET SERVEROUTPUT ON;
DECLARE
  class_num NUMBER(6) := 0;
  counter NUMBER := 0;
  total NUMBER := 0;
  state CHAR(5);
  in_state NUMBER := 0;
  out_state NUMBER := 0;
  Stu_name CHAR;
BEGIN
  SELECT COUNT(Home_State) INTO total FROM Student;
  FOR counter IN 1..(total)
   LOOP
    class_num := 10010 + counter;
    SELECT Home_State
     INTO state
      FROM Student
       WHERE Stu_ID = class_num;
    SELECT Fname
     INTO Stu_name
      FROM Student
       WHERE Stu_ID = class_num;
    IF state = 'Tx'
     THEN
      DBMS_OUTPUT.PUT_LINE(Stu_name||'is in state.');
      in_state := in_state + 1;
    ELSE
      DBMS_OUTPUT.PUT_LINE(Stu_name||'is out of state');
      out_state := out_state + 1;
    END IF;
  END LOOP;
  DBMS_OUTPUT.PUT_LINE('There are '||in_state||' students in state.');
  DBMS_OUTPUT.PUT_LINE('There are '||out_state||' students out of state.');
END;

Когда я запускаю код, я получаю следующее сообщение об ошибке:

ORA-06502: PL/SQL: numeric or value error: character string buffer too small
ORA-06512: at line 18
06502. 00000 -  "PL/SQL: numeric or value error%s"
*Cause:    An arithmetic, numeric, string, conversion, or constraint error
           occurred. For example, this error occurs if an attempt is made to
           assign the value NULL to a variable declared NOT NULL, or if an
           attempt is made to assign an integer larger than 99 to a variable
           declared NUMBER(2).
*Action:   Change the data, how it is manipulated, or how it is declared so
           that values do not violate constraints.

Я пытаюсь выяснить, находится ли студент в Техасе или нет. Я добавлю 1 к in_state или out_state в зависимости от того, находится ли студент в Техасе или нет. Я также напечатаю сообщение, сообщающее пользователю, что студент находится в Техасе или за его пределами. Когда l oop закончено, я распечатываю итоги in_state и out_state.

1 Ответ

1 голос
/ 17 июня 2020

Думаю, вы ошибаетесь насчет позиции ошибки. Должна быть следующая команда:

 SELECT Fname
     INTO Stu_name

, потому что вы объявили STU_NAME CHAR;, а этого недостаточно .

Вы бы предпочли объявить переменные, чтобы они наследовать типы данных столбцов, например,

declare
  stu_name student.fname%type;

Поступая так, вы избежите таких проблем.


Кроме того, старайтесь избегать типа данных CHAR, если не сохранены значения в такой столбец / переменную фиксированной длины. Потому что - CHAR справа дополняет значения пробелами до максимальной длины столбца, поэтому вам обычно приходится обрезать его. Вместо этого выберите VARCHAR2.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...