如何使用 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 运行存储过程?

如何安装pl/sql developer

Oracle Sql Developer如何在Oracle中创建和设置角色?

如何使用 Oracle SQL Developer 打印实体关系 (ER) 图

oracle 客户端 sql developer 如何修改jdk版本