执行Stroredprocedure时出错

时间:2013-10-17 08:09:45

标签: oracle stored-procedures jdbc

CREATE OR REPLACE
PROCEDURE javao
  (
    numberw IN number,
    emp_name OUT SYS_REFCURSOR)
IS
BEGIN
  OPEN emp_name FOR SELECT * FROM employees WHERE emp_no = numberw;
END;
  EXEC javao(1)

表格结构

Name                         Type                                  
-------------                -------- 
EMP_NO                       NUMBER                      
EMP_NAME                    VARCHAR2(30 BYTE)    
ADDRESS                      VARCHAR2(15 BYTE)     
PH_NO                         NUMBER(10)                  

执行上述存储过程时遇到错误。该错误是

Error report:
ORA-06550: line 1, column 7:
PLS-00306: wrong number or types of arguments in call to 'JAVAO'
ORA-06550: line 1, column 7:
PL/SQL: Statement ignored
06550. 00000 -  "line %s, column %s:\n%s"
*Cause:    Usually a PL/SQL compilation error.
*Action:

请尝试帮助我的代码中的错误。

1 个答案:

答案 0 :(得分:1)

正如Nicholas Karasn​​ov所说,你需要调用中的参数来匹配过程声明。在这种情况下,您有一个OUT参数,因此您需要在某处选择要选择的数据 - 与sys_refcursor参数类型相对应的内容。

如果您正在使用SQL * Plus来测试它,您可以为此声明SQL*Plus variable,然后将其作为绑定变量传递,然后使用print命令显示游标内容:

variable rc refcursor
exec javao(1, :rc);
print rc

这也适用于SQL Developer。当您从其他代码调用该过程时,您将在PL / SQL块或外部应用程序中声明一个变量(例如,通过jdbc),但这些变量的细节取决于您正在做什么

要从Java调用,您可以执行以下操作:

// get connection
CallableStatement cStmt = conn.prepareCall("{ call javao(?, ?) }");
cStmt.setInt(1, 1);
cStmt.registerOutParameter(2, OracleTypes.cursor);
cStmt.execute();
ResultSet rSet = ((OracleCallableStatement) cStmt).getCursor(2);
while (rSet.next())
{
    // get columns from result set row and do something with the data
}

...但是这与伪代码接壤,你需要阅读文档来填补空白(并纠正任何错误;例如,你可能需要特定于Oracle的语句类型),并添加对象关闭和错误处理所有其他好东西。