0
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:

请尝试帮助我的代码有什么问题。

4

1 回答 1

1

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

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

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

这也适用于 SQL Developer。当您从其他代码调用该过程时,您将在 PL/SQL 块或外部应用程序(例如 via 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 特定的语句类型),并添加对象关闭和错误处理所有所有其他好东西。

于 2013-10-17T08:20:51.403 回答