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:
请尝试帮助我的代码中的错误。
答案 0 :(得分:1)
正如Nicholas Karasnov所说,你需要调用中的参数来匹配过程声明。在这种情况下,您有一个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的语句类型),并添加对象关闭和错误处理所有其他好东西。