2016-11-29 3 views
0

Ich erstelle ein Paket und dann eine gespeicherte Prozedur darin. Das Paket und das Verfahren sind wie folgt:Fixierfehler für ungültige Kennung

create or replace package test_system is 
    type ref_cursor is ref cursor; 
procedure demo_show_students(p_gpa IN STUDENTS.gpa%TYPE,p_ref_cursor OUT ref_cursor); 
end test_system; 
/

create or replace package body test_system is 
procedure demo_show_students(p_gpa IN STUDENTS.gpa%TYPE,p_ref_cursor OUT ref_cursor) 
is 
v_sql_str varchar2(4000); 
begin 
v_sql_str:='select sid,firstname,lastname,status,gpa,email from students where gpa = p_gpa'; 
open p_ref_cursor for v_sql_str; 
end demo_show_students; 
end test_system; 

Im Folgenden ist der Java-Code, dh PL/SQL-Code für die beiden verbindet, aber es gibt mir ein Problem:

import java.sql.*; 

import oracle.jdbc.OracleTypes; 

public class ShowStudents { 

public void showStudents() { 

    try { 

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

     String val = '4'+""; 
     CallableStatement cs = conn.prepareCall("{call   
     test_system.demo_show_students(?,?)}"); 
     cs.setString(1, val); 

     cs.registerOutParameter(2, OracleTypes.CURSOR); 
     cs.execute(); 
     ResultSet rs = (ResultSet)cs.getObject(2); 

     while (rs.next()) { 
      System.out.println(rs.getString(1) + "\t" + 
       rs.getString(2) + "\t" + rs.getString(3) + 
       rs.getString(4) + 
       "\t" + rs.getDouble(5) + "\t" + 
       rs.getString(6)); 
     } 


     cs.close(); 

    } catch (SQLException ex) { 
     System.out.println("\n*** SQLException caught ***\n"); 
     ex.printStackTrace(); 
    } catch (Exception e) { 
     System.out.println("\n*** other Exception caught ***\n"); 
    } 
} 
} 



Exception : 

*** SQLException caught *** 
ORA-00904: "P_GPA": invalid identifier 
ORA-06512: at "PROJECT2.TEST_SYSTEM", line 7 
ORA-06512: at line 1 

Kann jemand sagen, wie man behebe diesen Fehler.

Antwort

1

Das Orakel kann die Variable p_gpa nicht identifizieren. Sie können es auf 2 Arten tun:

1)

v_sql_str:='select sid,firstname,lastname,status,gpa,email from students where gpa = :p_gpa'; 

    open p_ref_cursor for v_sql_str using p_gpa; 

2) Schreiben direkt Abfrage als Platzhalter Putting:

open p_ref_cursor for 
select sid,firstname,lastname,status,gpa,email 
from students where gpa = p_gpa; 
+1

@Akshay Beide Xing-Lösungen richtig sind, aber die bevorzugte Lösung ist die statische sql-Version (die zweite Lösung), da a) es keine Notwendigkeit gibt, dynamisches sql zu verwenden und b) dynamic sql kann nur zur Laufzeit, nicht zur Kompilierzeit syntaktisch analysiert werden. Das heißt, wenn Sie einen Fehler in Ihrer SQL-Anweisung haben, werden Sie nichts darüber wissen, bis Sie tatsächlich dazu kommen. Auch wenn das Objekt gelöscht wird, wird das Paket nicht ungültig gemacht und es wird auch nicht in user_dependencies etc. angezeigt. Bleiben Sie bei statischem SQL, wenn Sie können, und greifen Sie nur auf dynamische SQL zurück, wenn Sie wirklich müssen. – Boneist

Verwandte Themen