我坚持使用Oracle商店程序调用。代码看起来很简单,但我真的不知道如何使它工作。 这是我创建过程的代码
DELIMITER @@
CREATE OR REPLACE PROCEDURE updateAward(_total_amount in Number, _no_of_sales in Number, _agent in NUMBER, _id in NUMBER) AS
BEGIN
update Award set total_amount = _total_amount, no_of_sales = _no_of_sales, agent_id = _agent where ID = _id @@
commit @@
所以,当我通过NetBean执行它时(它是我目前唯一的工具),代码运行良好。 我还尝试运行编译语句
alter PROCEDURE updateAward compile;
然后,使用
select *
from user_errors
where name = 'ORG_SPGETTYPE'
select
返回空,证明编译过程正常。但是,当我触发程序时
call updateAward(1,1,1,1);
它返回错误
Package or function UPDATEAWARD is in an invalid state
和命令
SELECT object_name FROM user_objects WHERE status='INVALID';
返回程序的名称。我该如何解决这个问题?
更新1:
如果我使用
BEGIN
updateAward(1,1,1,1);
End;
我收到了错误
Error code 6550, SQL state 65000: ORA-06550: line 2, column 20:
PLS-00103: Encountered the symbol "end-of-file" when expecting one of the following:
:= . ( % ;
更新2:
我放置分隔符的原因是因为我收到错误&#34 ;;"通过一些VPN工作到另一个网络(仍然不知道为什么)。所以,我更新了代码,就像您的答案一样,然后,在程序结束时使用End;
,然后获取Invalid SQL statement1
。如果我删除它并执行(通过Netbean),则成功创建过程。但是,在编译并检查user_errors
之后,它得到了
"PLS-00103: Encountered the symbol "end-of-file" when expecting one of the following: ; "
答案 0 :(得分:2)
<击>
首先,您的过程语法看起来不对。不要使用DELIMITER
,因为该语法特定于MySQL。相反,尝试以下内容。
CREATE OR REPLACE PROCEDURE updateAward(_total_amount in Number, _no_of_sales in Number, _agent in NUMBER, _id in NUMBER) AS
BEGIN
update Award set total_amount = _total_amount, no_of_sales = _no_of_sales, agent_id = _agent where ID = _id;
commit;
END;
击> <击> 撞击>
首先,您的程序存在一些问题:
您没有正确使用分隔符。应使用分隔符来终止整个过程,而不是每一行。
NetBeans SQL窗口不能很好地了解SQL,因此无法判断过程何时结束以及其他事情何时开始。通常,它使用分号(;
)来判断一个语句何时结束而另一个语句何时开始,但存储过程可以在其中包含分号,这样就不起作用。相反,我们将分隔符更改为其他内容,以便NetBeans SQL窗口一次性将整个存储过程发送到数据库。
不允许变量名以下划线(_
)开头。特别是,this Oracle documentation page的模式对象命名规则列表中的规则5表明
不带引号的标识符必须以数据库字符集中的字母字符开头。
下划线不是字母字符。
我已经采取了你的程序,修复了分隔符的使用,并在每个参数名称的前面添加了一个额外的p
(p
为'参数'),我得到了以下内容,在NetBeans中成功运行并创建了一个没有错误的过程:
delimiter $$
CREATE OR REPLACE PROCEDURE updateAward(p_total_amount in Number, p_no_of_sales in Number, p_agent in NUMBER, p_id in NUMBER) AS
BEGIN
update Award set total_amount = p_total_amount, no_of_sales = p_no_of_sales, agent_id = p_agent where ID = p_id;
commit;
END;
$$
delimiter ;
其次,你写了
嗯,不。这证明过程[...]然后,使用
select * from user_errors where name = 'ORG_SPGETTYPE'
select返回为空,证明编译过程正常。
ORG_SPGETTYPE
中没有错误(或者不存在具有该名称的过程)。您的过程名为updateAward
,Oracle会将其大写为UPDATEAWARD
。尝试
select *
from user_errors
where name = 'UPDATEAWARD';
代替。