函数不是过程或未定义

本文关键字:未定义 过程 函数 | 更新日期: 2023-09-27 18:36:35

下面的函数返回VARCHAR2数据类型,它工作正常:

select Get_Desc("45") from dual;

但是当我尝试使用 C# 运行时,我在cmd.ExecuteNonQuery()上收到错误消息:

ORA-06550:第 1 行,第 7 列:PLS-00221:"F_GET_DESC"不是过程或未定义 ORA-06550:第 1 行,第 7 列:PL/SQL:语句忽略

public void Get_Desc()
{
    string oradb = "Data Source=source;User Id=myuser;Password=ss;";
    string CommandStr = "F_Get_Desc()";
    using (OracleConnection conn = new OracleConnection(oradb))
    using (OracleCommand cmd = new OracleCommand(CommandStr, conn))
    {
        conn.Open();
        cmd.CommandType = CommandType.StoredProcedure;
        OracleParameter pDesc = new OracleParameter("pDesc", OracleDbType.Varchar2,128);
        pOfficeDesc.Direction = ParameterDirection.Input;
        pOfficeDesc.Value = Current_code.ToString();
        cmd.Parameters.Add(pDesc);
        cmd.ExecuteNonQuery();
        MessageBox.Show(pDesc.Value.ToString(););
    }
}

函数代码

CREATE OR REPLACE FUNCTION Schema.F_Get_Desc(P_CODE VARCHAR2)
RETURN VARCHAR2
IS
  v_DESC VARCHAR2(64);
BEGIN
 IF P_CODE IS NULL THEN
  RETURN('');
 END IF;
 SELECT NAME_dsec
 INTO   V_DESC
 FROM   My_table
 WHERE  CODE = P_CODE;
 RETURN(V_DESC);
END;
/

函数不是过程或未定义

问题用

这种方式解决

public void Get_Desc()
    {
        string oradb = "Data Source=schema;User Id=user;Password=pwd;";
        string CommandStr = "F_Get_Office_Desc";
        using (OracleConnection conn = new OracleConnection(oradb))
        using (OracleCommand cmd = new OracleCommand(CommandStr, conn))
        {
            cmd.CommandType = CommandType.StoredProcedure;
            cmd.Parameters.Add("iCode", OracleDbType.Varchar2).Value = Current_code;
            cmd.Parameters.Add("oDesc", OracleDbType.Varchar2, 4).Direction = ParameterDirection.ReturnValue;                
            conn.Open();
            cmd.ExecuteNonQuery();
            Current_Desc.Text = cmd.Parameters["oDesc"].Value.ToString();
        }
    }

您是否尝试过在命令字符串中指定架构名称? 像这样的东西。

string CommandStr = "Schema.F_Get_Desc()";

还要确保您登录的用户有权访问该功能,并具有要执行的正确授权。 如果此函数没有公共同义词,则可能必须在命令字符串中指定架构名称。