从Java通过数据库链接调用PL-SQL过程
这里我的目标是在java中通过数据库链接调用一个过程。过程接受一个输入,并将游标作为输出。 为了检查代码是否正常工作,我在数据库中创建了虚拟过程并尝试执行。它正在工作,能够获取光标并使用它。 然而,当我通过数据库链接调用某个过程时,得到的错误如下从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.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)
我和创建这些过程的开发人员通了电话。根据他的说法,程序在这一端存在,并且已经给了我的用户访问权限
现在我的问题和疑问是
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(…)。它在工作吗?