函数不是过程或未定义
本文关键字:未定义 过程 函数 | 更新日期: 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()";
还要确保您登录的用户有权访问该功能,并具有要执行的正确授权。 如果此函数没有公共同义词,则可能必须在命令字符串中指定架构名称。