不仅有办法做到这一点,还有不止一种方式来做(这个我承认的并不是很好,但sql * Developer是用Java编写的)。
我有一个具有此签名的过程:get_maxsal_by_dept(dno number,maxsal out number)。
我在sql * Developer Object Navigator中突出显示它,调用右键菜单并选择Run。 (我可以使用ctrl F11。)这产生了一个带有测试工具的弹出窗口。 (注意:如果存储过程存在于包中,则需要右键单击包,而不是包含过程名称的包下方的图标;然后,在测试时将从包的“目标”列表中选择sproc在此示例中,测试工具将显示以下内容:
DECLARE
DNO NUMBER;
MAXSAL NUMBER;
BEGIN
DNO := NULL;
GET_MAXSAL_BY_DEPT(
DNO => DNO,MAXSAL => MAXSAL
);
DBMS_OUTPUT.PUT_LINE('MAXSAL = ' || MAXSAL);
END;
我将变量DNO设置为50并按OK。在“运行 – 日志”窗格(右下角除非已经关闭/移动/隐藏它),我可以看到以下输出:
Connecting to the database apc.
MAXSAL = 4500
Process exited.
Disconnecting from the database apc.
为了公平,跑步者对返回参考游标的功能不太友好,像这样:get_emps_by_dept(dno number)return sys_refcursor。
DECLARE
DNO NUMBER;
v_Return sys_refcursor;
BEGIN
DNO := 50;
v_Return := GET_EMPS_BY_DEPT(
DNO => DNO
);
-- Modify the code to output the variable
-- DBMS_OUTPUT.PUT_LINE('v_Return = ' || v_Return);
END;
然而,至少它提供了保存任何文件更改的机会,所以我们可以保留对调整线束的投资。
DECLARE
DNO NUMBER;
v_Return sys_refcursor;
v_rec emp%rowtype;
BEGIN
DNO := 50;
v_Return := GET_EMPS_BY_DEPT(
DNO => DNO
);
loop
fetch v_Return into v_rec;
exit when v_Return%notfound;
DBMS_OUTPUT.PUT_LINE('name = ' || v_rec.ename);
end loop;
END;
同一位置的输出:
Connecting to the database apc.
name = TRICHLER
name = VERREYNNE
name = FEUERSTEIN
name = PODER
Process exited.
Disconnecting from the database apc.
或者,我们可以在sqlDeveloper工作表中使用旧的sqlPLus命令:
var rc refcursor
exec :rc := get_emps_by_dept(30)
print rc
在这种情况下,输出将显示在“脚本输出”窗格中(默认位置是“结果”选项卡右侧的选项卡)。
IDE的最早版本不支持sql * Plus的方式。但是,自1.2.1以来,所有上述命令都得到了支持。有关更多信息,请参阅the matrix in the online documentation。
“When I type just var rc refcursor;
and select it and run it,I get this
error (GUI):”
工作表解释sqlPlus命令的方式存在一个特征或错误。它假定sqlPlus命令是脚本的一部分。因此,如果我们输入一行sql * Plus,则说var rc refcursor,然后单击Execute Statement(或F9),工作表会引发ORA-900,因为它不是可执行语句,即它不是sql。我们需要做的是单击运行脚本(或F5),即使是单行的sql * Plus。
“I am so close … please help.”
您的程序是一个具有五个必需参数签名的过程。你收到一个错误,因为你把它称为一个函数,只有一个参数:
exec :rc := get_account(1)
你需要的是如下所示。为了清楚起见,我使用了命名符号。
var ret1 number
var tran_cnt number
var msg_cnt number
var rc refcursor
exec :tran_cnt := 0
exec :msg_cnt := 123
exec get_account (Vret_val => :ret1,Vaccount_id => 1,rc1 => :rc )
print tran_count
print rc
也就是说,每个OUT或IN OUT参数都需要一个变量。 IN参数可以作为文字传递。前两个EXEC语句将值分配给几个IN OUT参数。第三个EXEC调用该过程。过程不返回值(与函数不同),因此我们不使用赋值语法。最后,该脚本显示映射到OUT参数的两个变量的值。