微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

如何使用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

“When I type just var rc refcursor;
and select it and run it,I get this
error (GUI):”

工作表解释sqlPlus命令的方式存在一个特征或错误。它假定sqlPlus命令是脚本的一部分。因此,如果我们输入一行sql * Plus,则说var rc refcursor,然后单击Execute Statement(或F9),工作表会引发ORA-900,因为它不是可执行语句,即它不是sql。我们需要做的是单击运行脚本(或F5),即使是单行的sql * Plus。

“I am so close … please help.”

您的程序是一个具有五个必需参数签名的过程。你收到一个错误,因为你把它称为一个函数,只有一个参数:

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参数的两个变量的值。

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。

相关推荐