Oracle 定义存储过程 不能执行,处于无效状态。

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Oracle 定义存储过程 不能执行,处于无效状态。相关的知识,希望对你有一定的参考价值。

两张表xiaoming, xiaoli 练习存储过程。
create or replace procedure del_xiao
(balanceid1 in number)
is
begin
update from xiaoli set xiaoli.balance=balance-200 where xiaoming.balanceid=1
if SQL%ROWCOUNT = 0 then
RAISE_APPLICATION_ERROR(-20123, 'Invald product code', TRUE);

end if;

update from xiaoming set xiaoming.balance=balance+200 where xiaoming.balanceid=1
if SQL%ROWCOUNT = 0 then
RAISE_APPLICATION_ERROR(-20123, 'Invald product code', TRUE);
end if;
commit;
exception when others then
rollback;
end;
将xiaoli的钱转200个xiaoming,但是执行call del_xiao(1)的 的时候报错,无效状态。

无效状态有两种可能:

1、一种是你的存储过程编辑没有成功,创建了,但里面有语法错误。

2、还有一种是存储过程使用的表有结构上的改变,需要重新编译一下。

解决方法如下:

重新编译一下,如果不成功,就是有语法问题,你需要修改存储过程。

延展阅读:

修改存储过程的操作:在你的存储过程,鼠标右键,点修改,再保存就行了。 

参考技术A 无效状态有两种可能,一种是你的存储过程编辑没有成功,创建了,但里面有语法错误。
还有一种是存储过程使用的表有结构上的改变,需要重新编译一下。
你重新编译一下,如果不成功,就是有语法问题,你需要修改存储过程。本回答被提问者采纳
参考技术B 谁能帮我看下这个存储过程有语法问题吗?

create or replace procedure multinsert(beg in int ,cnt in int)
is
begin
declare icnt int default 0;
declare tmp int default 0;
while icnt<cnt do
set icnt=icnt+1;
set tmp=beg+icnt;
insert into ta(id,ia) values(tmp,tmp);
end while;
commit;
end multinsert;
参考技术C 两个update后的from都去掉追问

不好意思复制错了
from去掉也错了,还是无效状态。

追答

你创建 procedure 报错了没有,解决创建的错误啊。

追问

找到错误了,update语句没加;好结束,谢谢

追答

你在哪儿创建的?

plsqldev的sql窗口吗?

应该用存储过程窗口或者command窗口,就能看到错误了。

无效的模式名称; Oracle 存储过程输入参数

【中文标题】无效的模式名称; Oracle 存储过程输入参数【英文标题】:Invalid Pattern name; Oracle Stored Procedure Input Parameter 【发布时间】:2014-07-31 17:07:11 【问题描述】:

我有一个 JDBC 程序,它使用 CallabaleStatement 对象来设置和注册存储过程的 IN/OUT 参数。

我使用了ArrayDescriptors 和oracle.sql.ARRAY 对象并将其设置为用户定义数据类型的输入参数。

用户定义的数据类型是TYPE CharArray1 IS TABLE OF CHAR(7)。在执行错误期间,我收到“无效的模式名称我的对象”。

我通过以下方式设置输入:

ArrayDescriptor ad = ArrayDescriptor.createDescriptor("<package-name>.CharArray1", conn);
ARRAY arr = new ARRAY(ad, conn, new String[]"1");
callableStatement.setArray(3, arr );

其中conn 是我的Connection 对象。我已经检查了数据类型CharArray1package-name 的执行权限。我已删除包名并检查,错误仍然相同。

提前致谢。请告诉我我在这里做错了什么。

【问题讨论】:

【参考方案1】:

尝试将CHAR 切换为 VARCHAR2(7 char)

【讨论】:

我的功能需要它是table of char(7)。我无法更改数据库。我需要让 Java 代码跟上。 但是你只发送了1个字节,尝试添加6个空格。当您完成项目阅读一些 Thomas Kyte 书籍时,他希望我们不要使用 CHAR 类型而不是 VARCHAR2 类型。没有优势。 不一定每次都加1。例如,字符数可以是“12345”。 无论如何你必须注意你传递了 7 个字节(不是字符,一个字符可以占用几个字节)并在必要时添加空格。 同意我会照顾的。得出的值肯定不会超过 7 个字节。但是,我觉得这不是这里的问题。我想知道,我将参数传递给 CallableStatement 的方式是否有任何变化。

以上是关于Oracle 定义存储过程 不能执行,处于无效状态。的主要内容,如果未能解决你的问题,请参考以下文章

Oracle shutdown 过程中 DB hang住 解决方法

Oracle存储过程执行报错:无效的sql语句。 在plsql中: execute proc_test_exit_when;

在oracle中执行alter存储过程时出现无效表名错误

Oracle 错误:无效的 SQL 语句错误

oracle存储过程对象无效

oracle 自定义函数,调用时报“程序包或函数无效”