19

* 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

编辑4:

我正在尝试运行一个过程,其定义如下所示:

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 列?没有一条线延伸那么远......

4

5 回答 5

36

不仅有一种方法可以做到这一点,而且还有不止一种方法可以做到这一点(我承认这不是 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 Developer 工作表中的旧 SQL PLus 命令:

var rc refcursor 
exec :rc := get_emps_by_dept(30) 
print rc

在这种情况下,输出会出现在“脚本输出”窗格中(默认位置是“结果”选项卡右侧的选项卡)。

IDE 的最早版本对 SQL*Plus 的支持不多。但是,从 1.2.1 开始支持上述所有命令。有关详细信息,请参阅在线文档中的矩阵


“当我键入var rc refcursor; 并选择它并运行它时,我收到此错误(GUI):”

工作表解释 SQL Plus 命令的方式存在一个特性或错误。它假定 SQL Plus 命令是脚本的一部分。因此,如果我们输入一行 SQL*Plus,说var rc refcursor并单击Execute Statement(或F9)工作表会显示 ORA-900 ,因为它不是可执行语句,即它不是 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 参数的几个变量的值。

于 2010-06-29T04:38:21.143 回答
4

我不确定如何查看返回的实际行/记录。

存储过程不返回记录。它们可能有一个游标作为输出参数,它是一个指向选择语句的指针。但它需要额外的操作才能真正从该游标中恢复行。

在 SQL Developer 中,您可以执行一个返回 ref 游标的过程,如下所示

var rc refcursor
exec proc_name(:rc)

之后,如果您执行以下操作,它将显示光标的结果:

print rc
于 2010-06-28T23:09:04.710 回答
3

我的推荐是TORA

于 2010-06-29T04:55:15.820 回答
2

你听说过“SQuirreL SQL 客户端”吗?

http://squirrel-sql.sourceforge.net/

于 2010-06-28T19:14:36.773 回答
0

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

于 2010-07-03T22:28:03.147 回答