【问题标题】:How I can fix "PL/SQL: numeric or value error%s"?如何修复“PL/SQL:数字或值错误%s”?
【发布时间】:2020-11-18 11:55:47
【问题描述】:

我正在尝试编写一个程序。当我们用id no查询这个过程时,
表将被连接,结果如下;
(PROCEDURE_NAME:“学生信息”)
id_no、姓名、姓氏、学校编号、部门信息、城市、课程


这是我的表格和程序代码;

CREATE TABLE student_info (
    school_number NUMBER,
    id_no NUMBER NOT NULL UNIQUE,
    name VARCHAR2(50) NOT NULL,
    surname VARCHAR2(50) NOT NULL,
    city VARCHAR2(50) NOT NULL,
    birth_date DATE NOT NULL,
    CONSTRAINT student_info_pk PRIMARY KEY (okul_numarasi)
);
CREATE TABLE school_info (
    school_number NUMBER,
    entry_date DATE NOT NULL,
    faculty_info VARCHAR2(50) NOT NULL,
    department_information VARCHAR2(50) NOT NULL,
    CONSTRAINT school_info_pk PRIMARY KEY (school_number),
    CONSTRAINT student_school_fk FOREIGN KEY (school_number)      
    REFERENCES student_info(school_number)
);
CREATE TABLE lessons(
     school_number NUMBER,
     lesson_name VARCHAR2(100) NOT NULL,
     lesson_number NUMBER NOT NULL,
     midterm_1 NUMBER,
     midterm_2 NUMBER,
     final_note NUMBER,
     integration_note NUMBER, 
    CONSTRAINT lessons_pk PRIMARY KEY (school_number),
    CONSTRAINT lessons_student_fk FOREIGN KEY (school_number)     
    REFERENCES ogrenci_bilgileri (okul_numarasi)
);

CREATE OR REPLACE PROCEDURE 
      student_information(
                     p_no                     IN  student_info.id_no%type,
                     p_name                   OUT student_info.name%type,
                     p_surname                OUT student_info.surname%type,
                     p_school_number          OUT student_info.school_number%type,
                     p_department_information OUT school_info.department_information%type,
                     p_city                   OUT student_info.city%type,
                     p_lesson                 OUT lessons.lesson_name%type
                   ) AS
BEGIN
  SELECT o.name,
         o.surname,
         o.school_number,
         ok.department_information,
         o.city,
         d.lesson_name
    INTO p_name,
         p_surname,
         p_school_number,
         p_city,
         p_department_information,
         p_lesson
    FROM student_info o
    JOIN school_info ok
      ON o.school_info = ok.school_number
    JOIN lessons d
      ON d.school_number = ok.school_number;
   WHERE o.id_no = p_no;
END student_information;

这是我运行程序的声明。

DECLARE 
    v_id student_info.id_no%type:= 12345;      
    v_name student_info.name%type;      
    v_surname student_info.surname%type;      
    v_school_num student_info.school_number%type;      
    v_department school_info.department_information%type;      
    v_city student_info.city%type;      
    v_lesson lessons.lesson_name%type;
BEGIN
    student_information(v_id,v_name,v_surname,v_school_num,v_department,v_city, v_lesson );
    DBMS_OUTPUT.put_line ('Student Information');
    DBMS_OUTPUT.put_line ('ID: ' || v_id);
    DBMS_OUTPUT.put_line ('Name: ' || v_name || ' ' || v_surname);
    DBMS_OUTPUT.put_line ('School Number: ' || v_school_num);
    DBMS_OUTPUT.put_line ('Department Information: ' || v_department);
    DBMS_OUTPUT.put_line ('City: ' || v_city);
    DBMS_OUTPUT.put_line ('Lesson Name:' || v_lesson);
END;

错误是:

ORA-06502: PL / SQL: numerical or value error: character-to-number error
ORA-06512: location "SYSTEM.student_information", line 12
ORA-06512: location line 10
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.

【问题讨论】:

  • 两个最可能的原因是类型不匹配和大小不匹配。您没有始终如一地使用VARCHAR2。大多数人会使用VARCHAR2。另一个是长度。避免这两种情况的一种方法是声明变量的类型,例如 v_department school_info.department_information%type。
  • @JeffHolt 哦,好的,谢谢。这种写法是相同的还是数字变量类型还是只对 VARCHAR2 有用?
  • 它应该适用于可以分配给表中列的任何类型。
  • 您应该从当前错误中获得一个行号引用,告诉您匿名 PL/SQL 块中的哪一行引发了异常。
  • 请发布 CREATE TABLE 语句和一些重现问题的示例数据。基本上,您的表结构和数据与程序代码之间存在不匹配。除非您发布所有内容,否则我们无法为您解决问题。唉,我们不是心灵感应的,我们看不到你的屏幕:我们只知道你告诉我们什么。

标签: oracle plsql ora-06502


【解决方案1】:

您的列上的简单不匹配

  SELECT o.name,
         o.surname,
         o.school_number,
         ok.department_information,   <===
         o.city,                      <===
         d.lesson_name
    INTO p_name,
         p_surname,
         p_school_number,
         p_city,                      <===
         p_department_information,    <===
         p_lesson

但在您自以为是浪费时间之前,您所做的更改(使用 %TYPE 等)已使您的代码更加健壮和可维护。

【讨论】:

  • @ezgi - 这里真正的教导是正确布局代码的重要性。您最初的问题将投影压缩在一行上,这使得它难以阅读。某个善良的灵魂编辑了您的代码,使其更易于阅读,从而更容易发现问题。
猜你喜欢
  • 1970-01-01
  • 2013-10-08
  • 2016-10-12
  • 2023-03-09
  • 1970-01-01
  • 1970-01-01
  • 2014-04-25
  • 2014-06-13
相关资源
最近更新 更多