2016-11-29 6 views
0

Привет Я написал процедуру в пакете, чтобы вставить данные следующим образом:Oracle числовыми или значение ошибки PL/SQL

create or replace package Proj2_student_reg_package is 
    type data_cursor is ref cursor; 

procedure add_students(sidIn IN students.sid%type, fnameIn IN students.firstname%type, 
         lnameIn IN students.lastname%type, statusIn IN students.status%type, 
         gpaIn IN students.gpa%type, emailIn IN students.gpa%type, 
         ret_message OUT varchar2); 

end Proj2_student_reg_package; 
/

create or replace package body Proj2_student_reg_package as 

procedure add_students(sidIn IN students.sid%type, fnameIn IN students.firstname%type, 
         lnameIn IN students.lastname%type, statusIn IN students.status%type, 
         gpaIn IN students.gpa%type, emailIn IN students.gpa%type, 
         ret_message OUT varchar2) 
is 
begin 
insert into students values(sidIn ,fnameIn,lnameIn,statusIn,gpaIn,emailIn); 
COMMIT; 
ret_message := 'Success'; 

EXCEPTION 
WHEN OTHERS THEN 
ret_message := 'Error'; 
end add_students; 




end Proj2_student_reg_package; 
​ 

и я звоню через программу Java:

import java.sql.CallableStatement; 
import java.sql.Connection; 
import java.sql.SQLException; 
import java.sql.Types; 
import java.util.Scanner; 

import oracle.jdbc.OracleTypes; 
import oracle.jdbc.pool.OracleDataSource; 

public class AddStudent { 
    public void addStudent(){ 
     Scanner line = new Scanner(System.in); 
     try 
     {  

      //Connection to Oracle server 
      OracleDataSource ds = new oracle.jdbc.pool.OracleDataSource(); 
      ds.setURL("jdbc:oracle:thin:@localhost:1521:xe"); 
      Connection conn = ds.getConnection("*****", "****"); 

      System.out.print("Enter the sid: "); 
      String sid = line.next(); 
      System.out.print("Enter first name: "); 
      String fname = line.next(); 
      System.out.print("Enter last name: "); 
      String lname = line.next(); 
      System.out.print("Enter status: "); 
      String status = line.next(); 
      System.out.print("Enter gpa: "); 
      String gpa = line.next(); 
      System.out.print("Enter email: "); 
      String email = line.next(); 


      CallableStatement cs = conn.prepareCall("{call Proj2_student_reg_package.add_students(?,?,?,?,?,?,?)}"); 

      cs.setString(1, sid); 
      cs.setString(2, fname); 
      cs.setString(3, lname); 
      cs.setString(4, status); 
      cs.setString(5, gpa); 
      cs.setString(6, email); 
      cs.registerOutParameter(7, Types.VARCHAR); 

      cs.executeQuery(); 
      System.out.println(cs.getString(7)); 
      cs.close(); 
      //line.close(); 
     } 
     catch (SQLException e) { System.out.println("SQLException " + e.getMessage());} 
     catch (Exception e) {System.out.println(e);} 
    } 

} 

мои студенты таблица:

create table students (sid char(4) primary key check (sid like 'B%'), 
firstname varchar2(15) not null, lastname varchar2(15) not null, status varchar2(10) 
check (status in ('freshman', 'sophomore', 'junior', 'senior', 'graduate')), 
gpa number(3,2) check (gpa between 0 and 4.0), email varchar2(20) unique); 

Я даю значение из Java программы, как Сид: B987, fname : akki, lname : aror, satus : junior , gpa : 3,email : [email protected]

Но это дает мне ошибку:

SQLException ORA-06502: PL/SQL: numeric or value error: character to number conversion error 
ORA-06512: at line 1 

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

+0

Для начала, 'sid' является' char (4) ', но вы пытаетесь отправить строку из 5 символов. Это может или не может вызвать эту конкретную ошибку, но это будет проблемой. –

+0

Также, пожалуйста, уделите время правильному форматированию кода и данных в своем сообщении. Обращаясь за помощью, помогите им помочь вам. –

+0

@JimGarrison Я набрал неправильно Я отправляю в sid как B987. – Akshay

ответ

1

В вашем CallableStatementcs объекта, вам необходимо перейти от cs.setString(5, gpa) к cs.setDouble(5, gpa);, как gpa является number типа в базе данных.

+0

Я пробовал, но ошибка не решена. Я не думаю, что это проблема, потому что я объявил gpa как строку и отправил в качестве строки, а в процедуре она преобразуется из типа%. – Akshay

+0

Посмотрите на вкладку insert: 'insert into students values ​​(sidIn, fnameIn, lnameIn, statusIn, gpaIn, emailIn);' там нет конвертации, поэтому вам нужно передать gpa как setDouble, как показано выше – developer

+0

ошибка не исправлена. Я беру gpa в качестве входных данных. – Akshay