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,Vtran_count => :tran_cnt,Vmessage_count => :msg_cnt,Vaccount_id => 1,rc1 => :rc) print :tran_cnt print :msg_cnt print :rc
sql Developer使这个超硬/不可能?我不在乎这个实用程序是否是基于命令行的?我只是想能够快速运行和查看。如果它也捕获错误,这将是很好的。能够逐渐登录(交互式)以及一次性指定所有内容(类似于典型的基于ftp / sftp基于cmd的客户端)。
我的平台是Windows Server 2008 Cygwin。
编辑:也许你会知道如何使用Python编写脚本?
编辑2:在MSFT sql Server中,我可以简单的输入:
get_user 1;
然后突出显示并点击F5,我得到:
login name NULL Somename
打印到输出窗口。 Oracle sql开发人员根本没有帮助。我不知道如何通过1,我不知道如何看到实际的行/记录回来。
EDIT3:当我刚刚输入var rc refcursor;并选择它并运行它,我得到这个错误(GUI):
An error was encountered performing the requested operation: ORA-00900: invalid sql statement 00900.00000 - "invalid sql statement" * Cause: * Action: Vendor code 900Error at Line: 2
EDIT4:
我试图运行一个程序,其定义如下:
create or replace procedure get_account ( Vret_val out number,Vtran_count in out number,Vmessage_count in out number,Vaccount_id IN NUMBER,rc1 in out sys_refcursor )as begin ...
我收到一个错误:
Error starting at line 2 in command: exec :rc := get_account(1) Error report: ORA-06550: line 1,column 24: PLS-00306: wrong number or types of arguments in call to 'GET_ACCOUNT' 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: rc ------
我很亲密,请帮忙。
*编辑5:*
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,rc1 => rc)
脚本输出(在F5上)(可以是几个运行中的几个消息):
Error report: ORA-06550: line 1,column 134: PLS-00201: identifier 'RC' must be declared ORA-06550: line 1,column %s:\n%s" *Cause: Usually a PL/sql compilation error. *Action: anonymous block completed anonymous block completed Error starting at line 7 in command: exec get_account(Vret_val => :ret1,rc1 => rc) Error report: ORA-06550: line 1,column %s:\n%s" *Cause: Usually a PL/sql compilation error. *Action:
为什么说第一行第134栏?没有线延伸远
我有一个具有此签名的过程: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参数的两个变量的值。