从Java通过数据库链接调用PL-SQL过程

从Java通过数据库链接调用PL-SQL过程,java,oracle,stored-procedures,plsql,dblink,Java,Oracle,Stored Procedures,Plsql,Dblink,这里我的目标是在java中通过数据库链接调用一个过程。过程接受一个输入,并将游标作为输出。 为了检查代码是否正常工作,我在数据库中创建了虚拟过程并尝试执行。它正在工作,能够获取光标并使用它。 然而,当我通过数据库链接调用某个过程时,得到的错误如下 java.sql.SQLException: ORA-06550: line 1, column 7: PLS-00201: identifier 'HR_CLICK_GET_EMP_DETAILS@IBSLUAT1.WORLD' must be de

这里我的目标是在java中通过数据库链接调用一个过程。过程接受一个输入,并将游标作为输出。 为了检查代码是否正常工作,我在数据库中创建了虚拟过程并尝试执行。它正在工作,能够获取光标并使用它。 然而,当我通过数据库链接调用某个过程时,得到的错误如下

java.sql.SQLException: ORA-06550: line 1, column 7:
PLS-00201: identifier 'HR_CLICK_GET_EMP_DETAILS@IBSLUAT1.WORLD' must be declared
   java.sql.SQLException: ORA-24338: statement handle not executed

    at oracle.jdbc.driver.DatabaseError.throwSqlException(DatabaseError.java:112)
    at oracle.jdbc.driver.T4CTTIoer.processError(T4CTTIoer.java:331)
    at oracle.jdbc.driver.T4CTTIoer.processError(T4CTTIoer.java:288)
    at oracle.jdbc.driver.T4C8Oall.receive(T4C8Oall.java:743)
    at oracle.jdbc.driver.T4CStatement.doOall8(T4CStatement.java:207)
    at oracle.jdbc.driver.T4CStatement.fetch(T4CStatement.java:1018)
    at oracle.jdbc.driver.OracleResultSetImpl.close_or_fetch_from_next(OracleResultSetImpl.java:291)
    at oracle.jdbc.driver.OracleResultSetImpl.next(OracleResultSetImpl.java:213)
    at ashishtest.StoreProcedureCursor.main(StoreProcedureCursor.java:80)
我和创建这些过程的开发人员通了电话。根据他的说法,程序在这一端存在,并且已经给了我的用户访问权限

现在我的问题和疑问是

  • 在通过数据库链接调用过程时,我必须做一些不同的事情(代码如下)

  • 我应该向sql开发人员询问哪些问题。顺便说一下,数据库链接是正确的

               String prc_name = "HR_CLICK_GET_CM_AND_ABOVE@IBSLUAT1.WORLD(?,?)";
                 String runSP = "{ call  "+prc_name+" }";
    
                String runSP1 = "{ call  get_user_by_userId(?,?) }"; this one is working
    
                   try 
                 {
    
                     Class.forName("oracle.jdbc.driver.OracleDriver");
                 Connection conn = DriverManager.getConnection(
    
                         "jdbc:oracle:thin:@xx.xx.xxx.xx:port:SERVICE", "username", "password");  // uat
    
                 CallableStatement cs = conn.prepareCall(runSP);
    
                 cs.setString(1, "705151");
                 cs.registerOutParameter(2, OracleTypes.CURSOR);
                 cs.execute();
    
                 // get refcursor and convert it to ResultSet
                 ResultSet resultSet = (ResultSet) cs.getObject(2);
                 ResultSetMetaData rsmd = resultSet.getMetaData();
                 int columnCount = rsmd.getColumnCount();
    
                 System.out.println("Total Columns in ResultSet : "+columnCount);
    
                 System.out.println("Now Analyzing column one by one:\n\n-----------------------------------------------");
    
                 for (int i = 1; i <= columnCount; i++ ) {
                      String name = rsmd.getColumnName(i);
                     System.out.println("Column No:"+i+">>>>>>>>"+name);
                     }
    
                 }
                 catch(SQLException s)
                 {
                     s.printStackTrace();
                 }
                 catch(ClassNotFoundException s)
                 {
                     s.printStackTrace();
                 }
    
    String prc\u name=“HR\u单击获取CM\u并_ABOVE@IBSLUAT1.WORLD(?,?)";
    字符串runSP=“{call”+prc_name+“}”;
    字符串runSP1=“{call get_user_by_userId(?,)}”;这个有效
    尝试
    {
    类forName(“oracle.jdbc.driver.OracleDriver”);
    连接连接=DriverManager.getConnection(
    “jdbc:oracle:thin:@xx.xx.xxx.xx:port:SERVICE”,“username”,“password”);//uat
    CallableStatement cs=conn.prepareCall(runSP);
    cs.setString(1,“705151”);
    registerOutParameter(2,OracleTypes.CURSOR);
    cs.execute();
    //获取refcursor并将其转换为ResultSet
    ResultSet ResultSet=(ResultSet)cs.getObject(2);
    ResultSetMetaData rsmd=resultSet.getMetaData();
    int columnCount=rsmd.getColumnCount();
    System.out.println(“结果集中的总列数:“+columnCount”);
    System.out.println(“现在逐一分析列:\n\n--------------------------------------------------------------”;
    
    对于(int i=1;i请尝试使用负责该过程的Oracle用户名作为前缀:

    username.HR_CLICK_GET_EMP_DETAILS@IBSLUAT1.WORLD
    
    答案是“同义词”

    sql developer已将HR\u CLICK\u GET\u EMP\u DETAILS创建为HR\u CLICK\u GET\u EMP\u DETAILS的同义词_DETAILS@IBSLUAT1.WORLD

    这就是他告诉我的,我不能完全理解这一点,但我能够完成这个过程

    但是现在,我们可以获取resultset的元数据,但无法遍历行。 将错误获取为

    java.sql.SQLException: ORA-06550: line 1, column 7:
    PLS-00201: identifier 'HR_CLICK_GET_EMP_DETAILS@IBSLUAT1.WORLD' must be declared
    
       java.sql.SQLException: ORA-24338: statement handle not executed
    
        at oracle.jdbc.driver.DatabaseError.throwSqlException(DatabaseError.java:112)
        at oracle.jdbc.driver.T4CTTIoer.processError(T4CTTIoer.java:331)
        at oracle.jdbc.driver.T4CTTIoer.processError(T4CTTIoer.java:288)
        at oracle.jdbc.driver.T4C8Oall.receive(T4C8Oall.java:743)
        at oracle.jdbc.driver.T4CStatement.doOall8(T4CStatement.java:207)
        at oracle.jdbc.driver.T4CStatement.fetch(T4CStatement.java:1018)
        at oracle.jdbc.driver.OracleResultSetImpl.close_or_fetch_from_next(OracleResultSetImpl.java:291)
        at oracle.jdbc.driver.OracleResultSetImpl.next(OracleResultSetImpl.java:213)
        at ashishtest.StoreProcedureCursor.main(StoreProcedureCursor.java:80)
    
    我想,这个错误需要新的论坛


    另外,我没有将此标记为已解决,因为我不确定解决方案是如何工作的。

    所以您是从Java连接到第一个数据库并调用第二个数据库上的过程?您可以直接连接到第二个数据库。或者,您可以在第一个数据库上的过程中隐藏db链接,以便Java对db链接一无所知。谢谢获取错误为PLS-00201:标识符“ICIS\u SELECT.HR\u单击\u获取\u CM\u并_ABOVE@IBSLUAT1.WORLD'必须声明为ORA-06550:第1行第7列:PL/SQL:语句IGNORED是否可以从此架构的表中选择行?例如:select*from ICIS_select.table_name@IBSLUAT1.WORLDyes我可以通过此链接访问一个表。是否再次检查若要确认数据库链接正在工作,请尝试从SqlPlus调用它:exec ICIS\u SELECT.HR\u单击\u GET\u CM\u并_ABOVE@IBSLUAT1.WORLD(…)。它在工作吗?