select REALTYRIGHT_STORAGE.FUNC_CHECKHOUSESTATUS(-5021026,6792) from dual我直接在SI Object Browser里的命令窗口执行此语句返回的是0然而我直接执行这个函数却返回1,而且我单步执行过,也是返回1。觉得这个问题很诡异,希望大家为我解惑。下面是所说的函数CREATE OR REPLACE FUNCTION REALTYRIGHT_STORAGE.FUNC_CHECKHOUSESTATUS
(M_HOUSEID IN NUMBER,M_REALTYPROINSTID IN NUMBER)
----------------------检测房屋是否还有其他限制状态
RETURN number-- 返回值的数据类型
IS
M_COUNT NUMBER(4); --统计
HOUSE_LIMITSTATE NUMBER(4); --房屋状态
E_MESSAGE2 EXCEPTION; --异常提示
BEGIN
SELECT COUNT(*) INTO M_COUNT FROM REALTYRIGHT_STORAGE.T_REALTYOBJECT WHERE REALTYPROINST_ID<>M_REALTYPROINSTID AND HOUSE_ID=M_HOUSEID AND ACT_TYPE IN (8020,8022,8024);
IF(M_COUNT>0) THEN
HOUSE_LIMITSTATE:=1030;
ELSE
SELECT COUNT(*) INTO M_COUNT FROM REALTYRIGHT_STORAGE.T_REALTYOBJECT WHERE REALTYPROINST_ID<>M_REALTYPROINSTID AND HOUSE_ID=M_HOUSEID AND ACT_TYPE IN (8030);
IF (M_COUNT>0) THEN
HOUSE_LIMITSTATE:=1020;
ELSE
SELECT COUNT(*) INTO M_COUNT FROM REALTYRIGHT_STORAGE.T_REALTYOBJECT WHERE REALTYPROINST_ID<>M_REALTYPROINSTID AND HOUSE_ID=M_HOUSEID AND ACT_TYPE IN (8070);
IF (M_COUNT>0) THEN
HOUSE_LIMITSTATE:=1050;
ELSE
SELECT COUNT(*) INTO M_COUNT FROM REALTYRIGHT_STORAGE.T_REALTYOBJECT WHERE REALTYPROINST_ID<>M_REALTYPROINSTID AND HOUSE_ID=M_HOUSEID AND ACT_TYPE IN (8090);
IF(M_COUNT>0) THEN
HOUSE_LIMITSTATE:=1060;
ELSE
HOUSE_LIMITSTATE:=1010;
END IF;
END IF;
END IF;
END IF;
--如果没有则设置HOUSE表中的对应房屋限制状态为无限制
UPDATE REALTYRIGHT_STORAGE.T_HOUSE SET LIMIT_STATE=HOUSE_LIMITSTATE WHERE HOUSE_ID=M_HOUSEID;
RETURN 1;
EXCEPTION
WHEN E_MESSAGE2 THEN
RAISE_APPLICATION_ERROR(-20000,'项目实例'||M_REALTYPROINSTID||'更新房屋状态出错');
RETURN 0;
WHEN OTHERS THEN
RETURN 0;
END ;
/
我在代码里是这样调用的
#region [非自动生成]->CheckHouseStatus 检测房屋其他限制状态
[WebMethod]
public Boolean CheckHouseStatus(Int32 House_ID,Int32 RealtyProinst_ID)
{
string _ConnectString = ConnectStringSetting.GetOracleConnectString("RealtyRightStorage");
OracleConnection conn = new OracleConnection(_ConnectString);
OracleCommand comm= new OracleCommand("select REALTYRIGHT_STORAGE.FUNC_CHECKHOUSESTATUS(:M_HOUSEID,:M_REALTYPROINSTID) from dual", conn); //关键是这句
OracleParameter p0 = new OracleParameter("M_HOUSEID", OracleDbType.Int32,4);
p0.Direction = ParameterDirection.Input;
p0.Value = House_ID;
OracleParameter p1 = new OracleParameter("M_REALTYPROINSTID",OracleDbType.Int32,4);
p1.Direction = ParameterDirection.Input;
p1.Value = RealtyProinst_ID; comm.Parameters.Add(p0);
comm.Parameters.Add(p1);
comm.CommandType = CommandType.Text;
Boolean result;
try
{
if (conn.State == ConnectionState.Closed)
conn.Open();
result = Convert.ToBoolean(comm.ExecuteScalar());
return result;
}
finally
{
if (conn.State == ConnectionState.Open)
conn.Close();
}
}
#endregion
(M_HOUSEID IN NUMBER,M_REALTYPROINSTID IN NUMBER)
----------------------检测房屋是否还有其他限制状态
RETURN number-- 返回值的数据类型
IS
M_COUNT NUMBER(4); --统计
HOUSE_LIMITSTATE NUMBER(4); --房屋状态
E_MESSAGE2 EXCEPTION; --异常提示
BEGIN
SELECT COUNT(*) INTO M_COUNT FROM REALTYRIGHT_STORAGE.T_REALTYOBJECT WHERE REALTYPROINST_ID<>M_REALTYPROINSTID AND HOUSE_ID=M_HOUSEID AND ACT_TYPE IN (8020,8022,8024);
IF(M_COUNT>0) THEN
HOUSE_LIMITSTATE:=1030;
ELSE
SELECT COUNT(*) INTO M_COUNT FROM REALTYRIGHT_STORAGE.T_REALTYOBJECT WHERE REALTYPROINST_ID<>M_REALTYPROINSTID AND HOUSE_ID=M_HOUSEID AND ACT_TYPE IN (8030);
IF (M_COUNT>0) THEN
HOUSE_LIMITSTATE:=1020;
ELSE
SELECT COUNT(*) INTO M_COUNT FROM REALTYRIGHT_STORAGE.T_REALTYOBJECT WHERE REALTYPROINST_ID<>M_REALTYPROINSTID AND HOUSE_ID=M_HOUSEID AND ACT_TYPE IN (8070);
IF (M_COUNT>0) THEN
HOUSE_LIMITSTATE:=1050;
ELSE
SELECT COUNT(*) INTO M_COUNT FROM REALTYRIGHT_STORAGE.T_REALTYOBJECT WHERE REALTYPROINST_ID<>M_REALTYPROINSTID AND HOUSE_ID=M_HOUSEID AND ACT_TYPE IN (8090);
IF(M_COUNT>0) THEN
HOUSE_LIMITSTATE:=1060;
ELSE
HOUSE_LIMITSTATE:=1010;
END IF;
END IF;
END IF;
END IF;
--如果没有则设置HOUSE表中的对应房屋限制状态为无限制
UPDATE REALTYRIGHT_STORAGE.T_HOUSE SET LIMIT_STATE=HOUSE_LIMITSTATE WHERE HOUSE_ID=M_HOUSEID;
RETURN 1;
EXCEPTION
WHEN E_MESSAGE2 THEN
RAISE_APPLICATION_ERROR(-20000,'项目实例'||M_REALTYPROINSTID||'更新房屋状态出错');
RETURN 0;
WHEN OTHERS THEN
RETURN 0;
END ;
/
我在代码里是这样调用的
#region [非自动生成]->CheckHouseStatus 检测房屋其他限制状态
[WebMethod]
public Boolean CheckHouseStatus(Int32 House_ID,Int32 RealtyProinst_ID)
{
string _ConnectString = ConnectStringSetting.GetOracleConnectString("RealtyRightStorage");
OracleConnection conn = new OracleConnection(_ConnectString);
OracleCommand comm= new OracleCommand("select REALTYRIGHT_STORAGE.FUNC_CHECKHOUSESTATUS(:M_HOUSEID,:M_REALTYPROINSTID) from dual", conn); //关键是这句
OracleParameter p0 = new OracleParameter("M_HOUSEID", OracleDbType.Int32,4);
p0.Direction = ParameterDirection.Input;
p0.Value = House_ID;
OracleParameter p1 = new OracleParameter("M_REALTYPROINSTID",OracleDbType.Int32,4);
p1.Direction = ParameterDirection.Input;
p1.Value = RealtyProinst_ID; comm.Parameters.Add(p0);
comm.Parameters.Add(p1);
comm.CommandType = CommandType.Text;
Boolean result;
try
{
if (conn.State == ConnectionState.Closed)
conn.Open();
result = Convert.ToBoolean(comm.ExecuteScalar());
return result;
}
finally
{
if (conn.State == ConnectionState.Open)
conn.Close();
}
}
#endregion
跟你测试调用的方式没关系的,我觉得应该是你逻辑判断的问题
其余访问的方式有:
begin
dbms_output.put_lin(FUNC_CHECKHOUSESTATUS(-5021026,6792));
end;
或者
begin
dbms_output.put_lin(FUNC_CHECKHOUSESTATUS(House_ID =>-5021026,RealtyProinst_ID=>6792));
end;或者
begin
dbms_output.put_lin(FUNC_CHECKHOUSESTATUS(-5021026,RealtyProinst_ID=>6792));
end;
却不起作用,所以我觉得逻辑判断应该没错的吧
如果一定要在函数中实现,可以使用自治事务
你的函数体执行的时候传入的参数M_REALTYPROINSTID=6792 有问题所以抛出异常 返回0然而我直接执行这个函数却返回1,而且我单步执行过,也是返回1。觉得这个问题很诡异,希望大家为我解惑。直接执行的话默认为真没有进入异常 所以直接执行的是 RETURN 1;
还是参数跟字段类型不匹配?
select REALTYRIGHT_STORAGE.FUNC_CHECKHOUSESTATUS(-5021026,6792) from dual
*
第 1 行出现错误:
ORA-00904: "REALTYRIGHT_STORAGE"."FUNC_CHECKHOUSESTATUS": 标识符无效
PRAGMA AUTONOMOUS_TRANSACTION;
不声明为自治事务,单独使用没问题,在SQL语句中使用会报异常
声明自治事务也没起作用啊后来我改成存储过程了,不过想知道声明自治事务为什么没起作用,有兴趣的一起探讨一下。