【问题标题】:Invalid column index : Callable statements无效的列索引:可调用语句
【发布时间】:2014-03-05 20:31:05
【问题描述】:

我写了一个存储过程来计算表的大小。

create or replace PROCEDURE RETRIEVE_TABLE_SIZE (
p_segment_type in VARCHAR2, 
p_segment_name in VARCHAR2, 
P_table_size out INTEGER )

AS

BEGIN
SELECT bytes/(1048576*1024) as GB FROM DBA_SEGMENTS WHERE SEGMENT_NAME = p_segment_type AND         SEGMENT_TYPE = p_segment_name ;
    END ;

我从我的 java 类中调用这个存储过程,我的代码在下面

String sqlQuery = "{call RETRIEVE_TABLE_SIZE(?,?,?)}";
CallableStatement callableStatement = connection.prepareCall(sqlQuery);
callableStatement.setString("p_segment_type","TABLE");
callableStatement.setString("p_segment_name","SIM_HEADER");
callableStatement.registerOutParameter("P_table_size",java.sql.Types.INTEGER);
callableStatement.executeUpdate();
Integer size = callableStatement.getInt(1);
System.out.println("size is: "+size);

但我收到以下错误:

Exception in thread "main" java.sql.SQLException: ORA-06550: line 1, column 7:
PLS-00201: identifier 'RETRIEVE_TABLE_SIZE' must be declared
ORA-06550: line 1, column 7:
PL/SQL: Statement ignored

这是我第一次编写存储过程。如果我做错了什么,请纠正我。

【问题讨论】:

  • 作为一般说明,经过反复讨论,我坚信这个问题现在重复了 this StackOverflow question,它表现出相同的问题。

标签: java


【解决方案1】:

几点注意事项,先看看this stackoverflow question,基本一样。基本上,从 sqldeveloper 命令控制台您将能够运行查询,但过程的所有者可能没有适当的权限,或者他们是通过角色而不是直接的。

其次,从the Oracle documentation on the topic 开始,您需要在存储过程中指明输出参数P_table_size 的值,如下所示:

SELECT bytes/(1048576*1024) INTO P_table_size FROM DBA_SEGMENTS WHERE SEGMENT_NAME = p_segment_name AND SEGMENT_TYPE = p_segment_type ;

另请注意,您对 p_segment_name 和 p_segment_type 的使用是相反的;你有SEGMENT_NAME = p_segment_type 和SEGMENT_TYPE = p_segment_name,当你解决权限问题并让你的查询运行时,这将导致无穷无尽的混乱。

最后一点,尽管这是推测性的:您可以使用FROM USER_SEGMENTS 代替FROM DBA_SEGMENTS。 According to the docs 布局和数据相同,但只返回当前用户的数据,可能绕过权限问题。

【讨论】:

  • 按照你上面说的做之后,我得到了语法错误:线程“main”中的异常 java.sql.SQLSyntaxErrorException: ORA-00911: invalid character
  • 啊,我的评论适用于您的早期版本,而不是您将(???) 作为调用参数列表的新编辑版本。我会看看你的新例外,看看我是否可以尝试一下。
  • 您得到的异常表明它不正确。我的 Oracle 很生疏,不过,我想看看能不能找到更好的方法让你写。
  • 试试这个新版本。确保在运行应用程序代码之前在数据库中发出过程创建语句。
  • DBA_SEGMENT 不是表,而是用于计算表大小的关键字。实际上最初我执行“SELECT bytes/(1048576*1024) as GB FROM DBA_SEGMENTS WHERE SEGMENT_NAME = p_segment_type AND SEGMENT_TYPE = p_segment_name ;”作为一个 sql 查询,它起作用了。但作为存储过程的一部分,它不起作用。
猜你喜欢
  • 2013-01-06
  • 2015-07-28
  • 2016-05-01
  • 1970-01-01
  • 1970-01-01
  • 2020-01-17
  • 1970-01-01
  • 2012-07-19
  • 1970-01-01
相关资源
最近更新 更多