如何使用Oracle SQL开发人员运行存储过程?

时间:2010-06-28 18:05:17

标签: oracle stored-procedures plsql oracle-sqldeveloper sys-refcursor

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

5 个答案:

答案 0 :(得分:35)

不仅有办法做到这一点,有不止一种方法可以做到这一点(我承认不是非常Pythonic,但是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并按下okay。在 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 开发人员工作表中使用旧的SQL PLus命令:

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

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

最早的IDE版本对SQL * Plus的支持并不多。但是,自1.2.1以来,所有上述命令都得到了支持。有关详细信息,请参阅the matrix in the online documentation


  

“当我只输入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参数的几个变量的值。

答案 1 :(得分:4)

  

我不确定如何看到实际情况   回来的行/记录。

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

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

var rc refcursor
exec proc_name(:rc)

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

print rc

答案 2 :(得分:3)

我的推荐是TORA

答案 3 :(得分:2)

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

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

答案 4 :(得分: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