【C#】C#程序中调用Oracle自定义的方法,花了很久才找到。单独获取function的返回值

在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出来,结果一直抛出异常,也不知道是什么原因。
反正最后问题还是如愿解决了。
希望遇到这个问题的小伙伴快点解决哦。_

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值