如何使用Oracle SQL开发人员运行存储过程?
* EDIT6:*这是最后为我工作的(从接受的答案):
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栏?没有线延伸远 不仅有办法做到这一点,还有不止一种方式来做(这个我承认的并不是很好,但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。
工作表解释SQLPlus命令的方式存在一个特征或错误。它假定SQLPlus命令是脚本的一部分。因此,如果我们输入一行SQL * Plus,则说var rc refcursor,然后单击Execute Statement(或F9),工作表会引发ORA-900,因为它不是可执行语句,即它不是SQL。我们需要做的是单击运行脚本(或F5),即使是单行的SQL * Plus。
您的程序是一个具有五个必需参数签名的过程。你收到一个错误,因为你把它称为一个函数,只有一个参数: 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参数的两个变量的值。 (编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |