• 请不要在回答技术问题时复制粘贴 AI 生成的内容
rftlz0326
V2EX  ›  程序员

C#程序调用 oracle 存储过程发生的问题, v 友帮忙看下

  •  
  •   rftlz0326 · 11h 36m ago · 433 views
    存储过程:
    PROCEDURE INCHECKPRINT(IV_FHTBH IN VARCHAR2,
    IV_FHY IN VARCHAR2,
    IV_DJBH IN VARCHAR2,
    IV_YZID IN VARCHAR2,
    IV_DJ_SORT IN VARCHAR2,
    IV_ZZXH IN VARCHAR2,
    OV_PXH OUT VARCHAR2) IS
    LV_PX OUT_SALE_TASK_D.PXH%TYPE;
    C_COUNT NUMBER;
    V_PXH NUMBER;
    V_DDLX OUT_SALE_BILLING_M.DDLX%TYPE;
    BEGIN
    xxxxxxx......


    过程说明:
    参数 IV_DJ_SORT 值会不同,其他的入参都是一致的,OV_PXH 从 1 开始返回结果,传入不同的 IV_DJ_SORT 值开始递增返回结果。


    问题:
    C#程序调用存储过程,当 OV_PXH 的返回值应为 10 时,存储过程会抛出一个异常:“...字符串缓冲区太小”。但是通过调试程序拿到对应的参数,然后在 plsql 里面新建测试窗口进行调用,是正常返回结果值 10 的。

    试过的解决办法:
    1 、关键词搜索相关结果,没有查询到对应类似的问题。
    2 、使用 ai 分析代码,结果一直是说给参数和返回变量定义的长度有问题,但是让 ai 修改后,还是不行,可能是我描述的不够准确,目前使用 ai 也解决不了。
    3 、把 plsql 里面的窗口执行代码直接在 C#程序里面执行,也不行,一样是字符串缓冲区太小。
    我对 C#不太熟悉,目前是学习阶段,所以现在还没有想到其他思路去尝试解决这个问题,如果有 v 友遇到过类似问题或者可以解决这个问题,感谢告知。

    tips:
    如果上面我描述的不够清楚,请指出,谢谢。下面附上 C#调用存储过程的代码。

    public bool CallInCheckPrint(string ivFhtbh, string ivFhy, string ivDjbh, string ivYzid, string ivDjSort, string ivZzxh)
    {
    using var conn = new OracleConnection(_connectionString);
    conn.Open();

    using var cmd = new OracleCommand("PKG_CHECKPROC.INCHECKPRINT", conn)
    {
    CommandType = CommandType.StoredProcedure,
    BindByName = true
    };

    cmd.Parameters.Add(new OracleParameter("IV_FHTBH", OracleDbType.Varchar2, 4000, ParameterDirection.Input)).Value = ivFhtbh ?? "";
    cmd.Parameters.Add(new OracleParameter("IV_FHY", OracleDbType.Varchar2, 4000, ParameterDirection.Input)).Value = ivFhy ?? "";
    cmd.Parameters.Add(new OracleParameter("IV_DJBH", OracleDbType.Varchar2, 4000, ParameterDirection.Input)).Value = ivDjbh ?? "";
    cmd.Parameters.Add(new OracleParameter("IV_YZID", OracleDbType.Varchar2, 4000, ParameterDirection.Input)).Value = ivYzid ?? "";
    cmd.Parameters.Add(new OracleParameter("IV_DJ_SORT", OracleDbType.Varchar2, 4000, ParameterDirection.Input)).Value = ivDjSort ?? "";
    cmd.Parameters.Add(new OracleParameter("IV_ZZXH", OracleDbType.Varchar2, 4000, ParameterDirection.Input)).Value = ivZzxh ?? "";

    cmd.Parameters.Add(new OracleParameter("OV_PXH", OracleDbType.Varchar2, 4000, ParameterDirection.Output));

    cmd.ExecuteNonQuery();

    string resultPxh = cmd.Parameters["OV_PXH"].Value?.ToString();

    return true;
    }
    3 replies    2026-08-04 21:40:29 +08:00
    beginor
        1
    beginor  
       11h 8m ago
    骨灰级 C# 程序员路过, 建议把存储过程贴出来,这样可以一起分析, 或者把程序和存储过程一起丢给 AI 分析一下。 只写一半,没办法深入分析啊
    rftlz0326
        2
    rftlz0326  
    OP
       10h 56m ago
    @beginor 存储过程很长,而且涉及到很多其他包里面的过程和函数,无法完整贴出来或者给到 ai 。
    kiracyan
        3
    kiracyan  
       6h 29m ago
    再套一层 只返回输出看看,先手动返回一个值然后再调用原来存储过程返回同样值看看是哪里的问题。
    About   ·   Help   ·   Advertise   ·   Blog   ·   API   ·   FAQ   ·   Solana   ·   949 Online   Highest 6679   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 23ms · UTC 20:10 · PVG 04:10 · LAX 13:10 · JFK 16:10
    ♥ Do have faith in what you're doing.