用TOAD中的PL/SQL调用Oracle存储过程

用TOAD中的PL/SQL调用Oracle存储过程,oracle,plsql,output,Oracle,Plsql,Output,我试图从PL/SQL调用TOAD中的一个存储过程,该存储过程既有OUT参数又有SYS_REFCURSOR。当我尝试执行下面的代码块时,我得到了ORA-01008:并非所有变量都绑定了,但我无法确定是哪个问题。我收到一个绑定rtnData的表单提示,所以它似乎不是那个表单 declare QueryTime DATE; ErrorNum NUMBER; ErrorDesc VARCHAR2(2000); type rtnData is ref cursor; beg

我试图从PL/SQL调用TOAD中的一个存储过程,该存储过程既有OUT参数又有SYS_REFCURSOR。当我尝试执行下面的代码块时,我得到了
ORA-01008:并非所有变量都绑定了
,但我无法确定是哪个问题。我收到一个绑定rtnData的表单提示,所以它似乎不是那个表单

declare
    QueryTime DATE;
    ErrorNum NUMBER;
    ErrorDesc VARCHAR2(2000);
    type rtnData is ref cursor;
begin  
  MyProcedure(to_date('01/01/2010', 'MM/DD/YYYY'), QueryTime, ErrorNum, ErrorDesc, :rtnData);
  dbms_output.put_line(rdbQueryTime);
  dbms_output.put_line(rtnErrorNum);
  dbms_output.put_line(rtnErrorDesc);
end;

rtnda
是在PL/SQL块中声明的,因此您不必将其视为绑定变量-因此它前面不应该有冒号

但是
rtnda
被声明为类型,而不是变量。您不需要自己的类型,因此应该是:

declare
  QueryTime DATE;
  ErrorNum NUMBER;
  ErrorDesc VARCHAR2(2000);
  rtnData sys_refcursor;
begin
  MyProcedure(to_date('01/01/2010', 'MM/DD/YYYY'), QueryTime, ErrorNum,
    ErrorDesc, rtnData);
...
如果系统提示您输入一个表单来设置rtnda,如果您没有设置它,或者如果参数在
MyProcedure
声明中声明为
OUT
,您仍然会得到该错误

要在Toad中的数据网格中显示ref光标,我认为您需要:

declare
  QueryTime DATE;
  ErrorNum NUMBER;
  ErrorDesc VARCHAR2(2000);
begin
  MyProcedure(to_date('01/01/2010', 'MM/DD/YYYY'), QueryTime, ErrorNum,
    ErrorDesc, :rtnData);
...

。。。然后作为脚本执行,并在提示时选择“cursor”作为绑定类型。不过,我无法对此进行测试。(,但不确定它为什么声明未使用的类型)。

ErrorNum、ErrorDesc和rtnData都在存储过程中声明为OUT参数。我必须做些什么才能让程序在没有参数的情况下在TOAD中执行?@MichaelKingsmill-它将按这里的方式执行。您已经为块声明了变量,因此它们可以作为
OUT
参数传递给过程。你还在犯错误吗?当您从过程中取回光标时,您打算如何处理光标,
rtnda
?我仍然收到一个错误,但我现在意识到这与使用“执行语句”按钮而不是“按脚本执行”按钮有关。我将输出参数打印到我期望的输出窗口,但我想将光标输出到datagrid窗口。@MichaelKingsmill-对,不知道如何在Toad中实现,我不使用它。在SQL*Plus或SQL Developer中,我会:;可能蟾蜍支持这些,但我真的不知道我害怕。@MichaelKingsmill-是的,我想可能是这样,但我想知道作为脚本执行是否仍然是一个因素。它明确声明为
OUT
,而不是
IN-OUT
?看起来这应该行得通,但恐怕我只是读到了。很抱歉