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 参数。
我使用了ArrayDescriptor
s 和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
对象。我已经检查了数据类型CharArray1
的package-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;