如何使用 Oracle SQL developer 运行存储过程?
Posted
技术标签:
【中文标题】如何使用 Oracle SQL developer 运行存储过程?【英文标题】:How can I use Oracle SQL developer to run stored procedures? 【发布时间】:2011-03-09 06:35:15 【问题描述】:* 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 服务器中,我可以简单地输入:
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, Vtran_count => :tran_cnt, Vmessage_count => :msg_cnt, Vaccount_id => 1, rc1 => rc)
脚本输出(在 F5 上)(可能是来自多次运行的多个消息。):
Error report:
ORA-06550: line 1, column 134:
PLS-00201: identifier 'RC' must be declared
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:
anonymous block completed
anonymous block completed
Error starting at line 7 in command:
exec get_account(Vret_val => :ret1, Vtran_count => :tran_cnt, Vmessage_count => :msg_cnt, Vaccount_id => 1, rc1 => rc)
Error report:
ORA-06550: line 1, column 134:
PLS-00201: identifier 'RC' must be declared
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:
anonymous block completed
anonymous block completed
Error starting at line 7 in command:
exec get_account(Vret_val => :ret1, Vtran_count => :tran_cnt, Vmessage_count => :msg_cnt, Vaccount_id => 1, rc1 => rc)
Error report:
ORA-06550: line 1, column 134:
PLS-00201: identifier 'RC' must be declared
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:
为什么说第 1 行第 134 列?没有线延伸那么远......
【问题讨论】:
在 SQLDeveloper 中运行过程有什么难的?您找到该过程,右键单击它,然后选择 Run(或按 Ctrl-F11),然后在它生成的 PL/SQL 块中指定参数。 好的,我也想看看存储过程的输出,谢谢。 为什么不把它作为一个问题来询问如何使用 SQL Developer? @APC,因为我不相信它。请证明我错了。 我重新命名了你的问题,因为我认为我们已经到了不再需要好斗的语气的地步。我已经处理了您的第四次编辑 【参考方案1】:不仅有一种方法可以做到这一点,而且还有不止一种方法可以做到这一点(我承认这不是 Pythonic,但 SQL*Developer 是用 Java 编写的)。
我有一个带有这个签名的程序:get_maxsal_by_dept( dno number, maxsal out number)
。
我在 SQL*Developer Object Navigator 中突出显示它,调用右键菜单并选择 Run。 (我可以使用 ctrl+F11。)这会产生一个带有测试工具的弹出窗口。 (注意:如果存储过程存在于包中,您需要右键单击包,而不是包下方包含过程名称的图标;您将然后在测试工具出现时从包的“目标”列表中选择存储过程。)在此示例中,测试工具将显示以下内容:
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。在 Running - Log 窗格(右下角,除非您关闭/移动/隐藏它)我可以看到以下输出:
Connecting to the database apc.
MAXSAL = 4500
Process exited.
Disconnecting from the database apc.
公平地说,跑步者对返回 Ref Cursor 的函数不太友好,例如: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.
或者,我们可以在 SQL 开发人员工作表中使用旧的 SQLPLus 命令:
var rc refcursor
exec :rc := get_emps_by_dept(30)
print rc
在这种情况下,输出显示在 Script Output 窗格中(默认位置是 Results 选项卡右侧的选项卡)。
IDE 的最早版本对 SQL*Plus 的支持并不多。但是,从 1.2.1 开始支持所有上述命令。请参阅the matrix in the online documentation 了解更多信息。
“当我只输入
var rc refcursor;
并选择它并运行它,我明白了 错误(GUI):“
工作表解释 SQLPlus 命令的方式存在一个特性或错误。它假定 SQLPlus 命令是脚本的一部分。所以,如果我们输入一行 SQL*Plus,比如 var rc refcursor
并单击 Execute Statement
(或 F9 ),工作表会抛出 ORA-900 因为这不是可执行语句 em> 即它不是 SQL 。我们需要做的是单击Run Script
(或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,
Vtran_count => :tran_cnt,
Vmessage_count => :msg_cnt,
Vaccount_id => 1,
rc1 => :rc )
print tran_count
print rc
也就是说,每个 OUT 或 IN OUT 参数都需要一个变量。 IN 参数可以作为文字传递。前两个 EXEC 语句将值分配给几个 IN OUT 参数。第三个 EXEC 调用该过程。过程不返回值(与函数不同),因此我们不使用赋值语法。最后,此脚本显示映射到 OUT 参数的几个变量的值。
【讨论】:
我不确定我是否安装了 SQL*Plus 功能。我如何检查我是否拥有它? @HamishGrubijan - 最简单的检查方法是启动命令行窗口并输入sqlplus
所以...当我在命令行 (cmd.exe) 上键入 sqlplus 时,它要求我输入密码 - 它就在那里。但是,当我自己键入此命令时:var rc refcursor;
它会抱怨它。我想这是因为我不在 SQL*Plus 开发人员工作表中……那么,我该如何到达那里?
@HamishGrubijan - 您使用的是哪个版本的 SQL*Dev? 1.2.1 之前不支持 VAR
@HamishGrubjian - 我已经编辑了我的回复,我认为这可能是您问题的解决方案。【参考方案2】:
我不确定如何查看实际 返回的行/记录。
存储过程不返回记录。它们可能有一个游标作为输出参数,它是一个指向选择语句的指针。但它需要额外的操作才能真正从该游标中恢复行。
在 SQL Developer 中,您可以执行返回引用游标的过程,如下所示
var rc refcursor
exec proc_name(:rc)
之后,如果你执行以下操作,它会从光标处显示结果:
print rc
【讨论】:
【参考方案3】:我的推荐是TORA
【讨论】:
我以为TORA几年前就死了。很高兴看到有人让它复苏。 我不这么认为。在过去的一年里,我每天都在工作中使用它。最初有一些崩溃,但现在经过几次更新后运行良好。在对“TOAD 免费软件”和“SQL 开发人员”不满意后切换到 TORA。 SQL Developer 没有哪些功能? 我也对匡威感兴趣。【参考方案4】:您听说过“SQuirreL SQL 客户端”吗?
http://squirrel-sql.sourceforge.net/
【讨论】:
谢谢,有使用示例吗? 例如,如何使用它连接到Oracle DB? 我从未使用过它,但我听说过它的好消息。它基于 java jdbc,因此您可能需要下载 Oracle jdbc 驱动程序。 嗯...到目前为止听起来不错;我只是希望有人给我更详细的步骤。【参考方案5】:Quest Software、TOAD 和 SQL Navigator 有两种可能性:
这里是 TOAD 免费软件下载:http://www.toadworld.com/Downloads/FreewareandTrials/ToadforOracleFreeware/tabid/558/Default.aspx
还有 SQL Navigator(试用版):http://www.quest.com/sql-navigator/software-downloads.aspx
【讨论】:
有任何使用 TOAD 的示例吗?以上是关于如何使用 Oracle SQL developer 运行存储过程?的主要内容,如果未能解决你的问题,请参考以下文章
如何使用 Oracle SQL Developer 导出数据?
如何使用 Oracle SQL developer 运行存储过程?
Oracle Sql Developer如何在Oracle中创建和设置角色?