gpt4 book ai didi

oracle - 如何使用 Oracle SQL Developer 运行存储过程?

转载 作者:行者123 更新时间:2023-12-03 01:49:27 25 4
gpt4 key购买 nike

* 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 让这变得 super 困难/不可能?。我不关心该实用程序是否基于命令行;我只是希望能够快速运行并查看它。如果它也能捕获错误那就太好了。如果能够逐渐(交互式)登录,并一次指定所有内容(类似于典型的基于 ftp/sftp cmd 的客户端的工作方式),那就太好了。

我的平台是Windows Server 2008 + Cygwin。

编辑:也许您知道如何使用 Python 编写脚本?

编辑 2: 在 MSFT SQL 服务器中,我只需键入以下内容:

get_user 1;

然后突出显示它并按 F5,我得到:

login   name    
NULL Somename

打印到输出窗口。 Oracle SQL 开发人员对此根本没有帮助。我不知道如何传入 1,我不知道如何查看返回的实际行/记录。

编辑3:当我仅输入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 列?没有线延伸那么远......

最佳答案

不仅有一种方法可以做到这一点,而且有不止一种方法可以做到这一点(我承认这不是很 Pythonic,但 SQL*Developer 是用 Java 编写的)。

我有一个带有此签名的过程:get_maxsal_by_dept( dno number, maxsal out number)

我在 SQL*Developer 对象导航器中突出显示它,调用右键单击菜单并选择运行。 (我可以使用 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,然后按“确定”。在“运行 - 日志” Pane (位于右下角,除非您已关闭/移动/隐藏它)中,我可以看到以下输出:

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.
<小时/>

或者,我们可以使用 SQL Developer 工作表中的旧 SQLPLus 命令:

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

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

最早版本的 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 。我们需要做的是单击 Run Script (或 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,
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 参数的几个变量的值。

关于oracle - 如何使用 Oracle SQL Developer 运行存储过程?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/3134923/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com