【问题标题】:Calling PL-SQL Procedure over database link from Java从 Java 通过数据库链接调用 PL-SQL 过程
【发布时间】:2021-02-28 19:26:27
【问题描述】:

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

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

我与创建这些程序的开发人员通话。据他说,程序存在于此,我的用户已经获得了访问权限。

现在我的问题和疑问是

  1. 有什么不同的吗,我在通过数据库链接调用过程时必须做(代码如下)

  2. 我应该向 sql developer 询问哪些事情。顺便说一下数据库链接是对的。

               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();
                 }
    

提前致谢

阿什

【问题讨论】:

  • 那么您是从 Java 连接到第一个数据库并在第二个数据库上调用过程吗?您可以直接连接到第二个数据库。或者,您可以在第一个数据库的过程中隐藏 db 链接,以便 Java 对 db 链接一无所知。

标签: java oracle stored-procedures plsql dblink


【解决方案1】:

答案是“同义词”。

SQL Developer 已将 HR_CLICK_GET_EMP_DETAILS 的同义词创建为 HR_CLICK_GET_EMP_DETAILS@IBSLUAT1.WORLD

这是他告诉我的,我无法完全理解这一点,但能够完成程序。

但是现在,能够获取结果集的元数据但无法遍历行。

我收到一个错误:

java.sql.SQLException: ORA-24338: 语句句柄未执行

在 oracle.jdbc.driver.DatabaseError.throwSqlException(DatabaseError.java:112)
在 oracle.jdbc.driver.T4CTTIoer.processError(T4CTTIoer.java:331)
在 oracle.jdbc.driver.T4CTTIoer.processError(T4CTTIoer.java:288)
在 oracle.jdbc.driver.T4C8Oall.receive(T4C8Oall.java:743)
在 oracle.jdbc.driver.T4CStatement.doOall8(T4CStatement.java:207)
在 oracle.jdbc.driver.T4CStatement.fetch(T4CStatement.java:1018)
在 oracle.jdbc.driver.OracleResultSetImpl.close_or_fetch_from_next(OracleResultSetImpl.java:291)
在 oracle.jdbc.driver.OracleResultSetImpl.next(OracleResultSetImpl.java:213)
在 ashishtest.StoredProcedureCursor.main(StoredProcedureCursor.java:80)

我猜,这个错误需要新论坛。

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

【讨论】:

    【解决方案2】:

    尝试使用拥有该过程的 Oracle 用户名作为前缀:

    username.HR_CLICK_GET_EMP_DETAILS@IBSLUAT1.WORLD
    

    【讨论】:

    • 谢谢,但由于 PLS-00201 出现错误:标识符 'ICIS_SELECT.HR_CLICK_GET_CM_AND_ABOVE@IBSLUAT1.WORLD' 必须声明 ORA-06550:第 1 行,第 7 列:PL/SQL:语句被忽略
    • 你能从这个模式的表中选择行吗?例如:select * from ICIS_SELECT.table_name@IBSLUAT1.WORLD
    • 是的,我可以通过此链接访问一个表。确实再次检查以确认数据库链接正常工作。
    • 尝试从 SqlPlus 调用它:exec ICIS_SELECT.HR_CLICK_GET_CM_AND_ABOVE@IBSLUAT1.WORLD(...)。上班了吗?
    猜你喜欢
    • 2018-11-27
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-01-17
    • 1970-01-01
    • 1970-01-01
    • 2016-09-28
    相关资源
    最近更新 更多