自定义函数中调用存储过程 update后为空

hibernate发出的调用自定义函数的语句是selectget_name_by_code()ascol_0_0_fromdual在pl/sql中调试可以通过但是一调用就... hibernate发出的调用自定义函数的语句是 select
get_name_by_code() as col_0_0_
from
dual 在pl/sql中调试可以通过 但是一调用就返回空
自定义函数
CREATE OR REPLACE FUNCTION get_Name_By_Code() RETURN VARCHAR2 IS
tmpVar VARCHAR2(3000);
BEGIN
p_app(tmpVar);--调用存储过程
RETURN tmpVar;
EXCEPTION
WHEN NO_DATA_FOUND THEN
RETURN '';
WHEN OTHERS THEN
RETURN '';
END get_Name_By_Code;
--存储过程
create or replace procedure p_app( tmpVar OUT VARCHAR2) is
begin
update 表 set 字段 = 'aa' where 字段= 'bb';--update注释掉就行了
commit;
tmpVar := ‘结果集’;
end p_app;
展开
 我来答
End灬琦琦
2011-11-25 · TA获得超过956个赞
知道小有建树答主
回答量:181
采纳率:0%
帮助的人:194万
展开全部
第一:
调用存储过程不对
select p_app(tmpVar) from dual;
在oracle中,不能单独的执行存储过程的语句执行,因为调用错了,所以按照异常处理,返回空值
第二:
存储过程中,update没有一个异常处理,不规范

你再尝试下试试看,总觉得存储过程不太对
更多追问追答
追问
在函数中select p_app(tmpVar) from dual;?编译都不行哦

select tmu_bdres.p_app(tmpVar,codeName,codeValue) into sqlstr from dual; 也不行 说什么标识无效

你说不能直接调用错了 那为什么我把修改语句删掉后 就没事了呢
追答
你这个函数写的.........我理不清逻辑,你对照下面的代码看看,不知道行不行
你用的是oracle的数据库吧
---------------------------------------创建一个测试表aaa------------------------
CREATE TABLE AAA
(A1 NUMBER,
A2 VARCHAR2(20));
-----------------------------------表中插入数据,以作测试------------------------
INSERT INTO AAA VALUES(1,'AA');
INSERT INTO AAA VALUES(2,'BB');
INSERT INTO AAA VALUES(3,'CC');
-------------------------创建存储过程,修改字段为BB的ID为4------------------
create or replace procedure p_app( tmpVar OUT VARCHAR2) is
begin
update AAA set A1= '4' where A2= 'BB';
commit;
tmpVar := ‘结果集’;
end p_app;
--------------------------------创建函数,调用存储过程----------------------------------
CREATE OR REPLACE FUNCTION get_Name_By_Code() RETURN VARCHAR2 IS
tmpVar VARCHAR2(3000);
BEGIN
select p_app(tmpVar) into tmpvar from dual;
return (tmpvar)
EXCEPTION
WHEN OTHERS THEN
tmpvar := null;
return (tmpvar);
END get_Name_By_Code;
--------------------------------测试-------------------------------------------
select get_name_by_code() as col_0_0_ from dual
-------oracle中不能直接用select语句直接调用函数,但是可以用select语句直接调用存储过程,所以,这里测试不通过
-----------------------------修改方案----------------------
其实,你是想修改表,然后返回信息,但是存储过程也可以返回信息的,调用游标就可以的。所以,提供两个方案给你:
第一,使用返回结果集类型的存储过程,然后直接调用存储过程,省去创建function一步
第二,创建function,调用,调用的时候不能用select语句调用,直接使用函数,比如,定义一个变量tmp,然后直接tmp := p_app(tmpVar)
已赞过 已踩过<
你对这个回答的评价是?
评论 收起
wylxl99
2011-11-25 · TA获得超过364个赞
知道小有建树答主
回答量:264
采纳率:0%
帮助的人:119万
展开全部
解决方式:
1.将get_Name_By_Code中tmpVar 赋值为常量,屏蔽p_app语句,看看返回结果。
如果正常返回,便是p_app执行抱异常了。如果是,感觉是不是那条commit语句问题。
我不懂hibanate,感觉它有自己的事务,是不是和commit这条语句有冲突。
追问
问题是我用plsql单步调试没问题了,而且我把commit删掉也不行 只有把update语句删掉才行,我觉得不是事务的问题 您那方便的话帮我试试,您说是不是自定义函数不能调带update语句的存储过程啊 您那有这方面的列子没
追答
plsql调试肯定没问题啊,关键问题是hibernate。是不是hibernate的select语句没法进行事务操作。你可以在jsp中,而不用hibernate进行调用函数,看看结果如何。如果结果正确,那就是hibernate的问题了。hibernate的问题我没法帮你。
本回答被提问者采纳
已赞过 已踩过<
你对这个回答的评价是?
评论 收起
lxwcard520
2012-03-13 · 超过11用户采纳过TA的回答
知道答主
回答量:56
采纳率:0%
帮助的人:25.4万
展开全部
在 FUNCTION 中不允许执行DML导致
已赞过 已踩过<
你对这个回答的评价是?
评论 收起
收起 1条折叠回答
推荐律师服务: 若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询

为你推荐:

下载百度知道APP,抢鲜体验
使用百度知道APP,立即抢鲜体验。你的手机镜头里或许有别人想知道的答案。
扫描二维码下载
×

类别

我们会通过消息、邮箱等方式尽快将举报结果通知您。

说明

0/200

提交
取消

辅 助

模 式