在Oracle中写了一个Function,用来返回请求序列号,总之就是每次要返回不一样的顺序,用来做别的表的主键,
在程序中想要单独使用这个Function来获取返回值,下面详细介绍
Oracle自定义Function
CREATE OR REPLACE FUNCTION FC_GET_SYORIYY_NO(
IN_DATE NVARCHAR2
--,IN_NISSUU NUMBER := 0
)
RETURN NVARCHAR2
IS
STS NUMBER(4);
V_DATE TIMESTAMP;
V_TEMP_SYORI_NO ZHM010.SYORI_NO%TYPE := N'';
V_RET ZHM010.SYORI_NO%TYPE := N'';
CURSOR GET_SYORI_NO_CUR IS
SELECT SYORI_NO
FROM ZHM010
WHERE SYORI_YY = TO_CHAR(V_DATE,'YY')
;
GET_SYORI_NO_R GET_SYORI_NO_CUR%ROWTYPE;
BEGIN
IF LENGTH(IN_DATE) = 19 THEN
V_DATE := TO_TIMESTAMP(IN_DATE,'YYYY/MM/DD HH24:MI:SS');
ELSIF LENGTH(IN_DATE) = 17 THEN
V_DATE := TO_TIMESTAMP(IN_DATE,'YYYYMMDDHH24MISSFF3');
ELSE
V_DATE := TO_TIMESTAMP(IN_DATE,'YYYY/MM/DD');
END IF;
STS:=10;
OPEN GET_SYORI_NO_CUR;
LOOP
-- ループ値がなくなれば処理を抜ける。
FETCH GET_SYORI_NO_CUR INTO GET_SYORI_NO_R;
EXIT WHEN GET_SYORI_NO_CUR%NOTFOUND;
STS:=20;
V_TEMP_SYORI_NO := GET_SYORI_NO_R.SYORI_NO;
END LOOP;
STS:=30;
-- 使用したカーソルは閉じる
CLOSE GET_SYORI_NO_CUR;
IF V_TEMP_SYORI_NO IS NULL THEN
STS:=40;
V_TEMP_SYORI_NO := N'1';
INSERT INTO ZHM010(
SYORI_YY
,SYORI_NO
)
VALUES (
TO_CHAR(V_DATE,'YY')
,V_TEMP_SYORI_NO
)
;
ELSE
STS:=50;
V_TEMP_SYORI_NO := TO_NCHAR(TO_NUMBER(V_TEMP_SYORI_NO) + 1);
UPDATE ZHM010
SET SYORI_NO =V_TEMP_SYORI_NO
, UPD_CNT = UPD_CNT + 1
, UPD_DATE = TO_CHAR(SYSDATE,'YYYY/MM/DD HH24:MI:SS')
WHERE SYORI_YY = TO_CHAR(V_DATE,'YY')
;
END IF;
V_RET := TO_NCHAR(V_TEMP_SYORI_NO, 'FM0000');
--COMMIT;
RETURN V_RET;
/*例外処理*/
EXCEPTION
WHEN OTHERS THEN
--ROLLBACK;
--RETURN TO_NCHAR(STS||':'||SQLERRM);
RETURN V_RET;
END FC_GET_SYORIYY_NO;
看起来很复杂的一个Function,看不懂就别看了,大概说一下,有一个输入参数IN_DATE,一个输出参数V_RET,
最后想要得到这个V_RET的值。
C#代码
OracleConnection con = this.DbConnection;
var cmd = new OracleCommand();
cmd.CommandText = "FC_GET_SYORIYY_NO"; // 方法名称
cmd.CommandType = CommandType.StoredProcedure;
cmd.Connection = con;
cmd.BindByName = true;
// 入力パラメータの指定
// 参数一定要单独设置
OracleParameter p1 = new OracleParameter("V_RET", OracleDbType.NVarchar2, 20);
p1.Direction = ParameterDirection.ReturnValue; // 非常重要的一句话,声明是一个返回值
OracleParameter p2 = new OracleParameter("IN_DATE", OracleDbType.NVarchar2, ParameterDirection.Input);
p2.Value = "20200101"; // 给输入的参数赋值,不能通过new OracleParameter("IN_DATE", OracleDbType.NVarchar2, 20200101,ParameterDirection.Input); 这样赋值
cmd.Parameters.Add(p2);
cmd.Parameters.Add(p1);
bool isOpen = (con.State == System.Data.ConnectionState.Open);
try
{
// DBをオープンする。
if (!isOpen)
con.Open();
// function执行
cmd.ExecuteNonQuery();
string a=p1.Value.ToString(); // 获取返回值
}
finally
{
if (!isOpen)
con.Close();
}
我自己遇到的问题
OracleConnection con = this.DbConnection;
var cmd = new OracleCommand();
cmd.CommandText = "FC_GET_SYORIYY_NO";
cmd.CommandType = CommandType.StoredProcedure;
cmd.Connection = con;
cmd.BindByName = true;
cmd.Parameters.Add(new OracleParameter("IN_DATE", OracleDbType.NVarchar2,"20200101", ParameterDirection.Input));
cmd.Parameters.Add(new OracleParameter("V_RET", OracleDbType.NVarchar2, ParameterDirection.ReturnValue));
bool isOpen = (con.State == System.Data.ConnectionState.Open);
try
{
// DBをオープンする。
if (!isOpen)
con.Open();
// プロシージャを実行する。
cmd.ExecuteNonQuery();
string a=p1.Value.ToString();
}
finally
{
if (!isOpen)
con.Close();
}
把参数的赋值一次性new出来,结果一直抛出异常,也不知道是什么原因。
反正最后问题还是如愿解决了。
希望遇到这个问题的小伙伴快点解决哦。_