如何从存储过程中返回 Varchar2

Posted

技术标签:

【中文标题】如何从存储过程中返回 Varchar2【英文标题】:How can i return a Varchar2 out of my stored procedure 【发布时间】:2014-06-06 09:29:36 【问题描述】:

当我运行我的程序时,我的 catch 中出现了这个错误

ORA-06550:第 1 行,第 7 列:

PLS-00905:对象 DBI304134.FINDFREEBARCODE 无效

ORA-06550:第 1 行,第 7 列:

这是我使用的 c# 代码:

string freeBarcode = null;

    try
    
        string connection = ConfigurationManager.ConnectionStrings["P4connection"].ConnectionString;
        using (OracleConnection con = new OracleConnection(connection))
        
            OracleCommand cmd = new OracleCommand("FindfreeBarcode", con);
            cmd.CommandType = CommandType.StoredProcedure;

            OracleParameter outpuparameter = new OracleParameter("outpuparameter", OracleDbType.Varchar2,100);
            outpuparameter.ParameterName = "FREEBARCODE";
            outpuparameter.Direction = ParameterDirection.Output;
            cmd.Parameters.Add(outpuparameter);

            con.Open();
            cmd.ExecuteNonQuery();

            freeBarcode = Convert.ToString(outpuparameter.Value.ToString());

            if (freeBarcode == null)
            
                freeBarcode = null;
            

            else
            
                freeBarcode = Convert.ToString(outpuparameter.Value.ToString());
            
        

    
    catch
    
        freeBarcode = null;
    

    return freeBarcode;

这是我使用的存储过程:

create or replace procedure FindfreeBarcode
   (FREEBARCODE out VARCHAR2)
is
begin
   select b.BARCODE
    INTO FREEBARCODE
    from GAST g,BARCODECHECK b 
    WHERE g.GASTID(+) = b.GASTID and b.GASTID is null and ROWNUM <= 1;
END FindfreeBarcode;

【问题讨论】:

我认为您可能在比较的错误一侧使用了“(+)”。该比较或以下比较 (b.GASTID is null) 应为 g.GASTID is null。这个查询中的哪个表应该总是有数据,如果没有使用条形码,哪个表不会有数据?使用 ANSI 样式的连接重写此查询将有助于阐明意图。 【参考方案1】:

使用您的存储过程的原始版本,并进行更改

OracleCommand cmd = new OracleCommand("FindfreeBarcode", con);

OracleCommand cmd = new OracleCommand("FindfreeBarcode(:FREEBARCODE)", con);

分享和享受。

【讨论】:

【参考方案2】:

在这个页面上找到我的答案

Stored procedure output parameter returns @Value

不得不改变

freeBarcode = Convert.ToString(outpuparameter.Value.ToString());

到:

Convert.ToString(outpuparameter.Value);

【讨论】:

以上是关于如何从存储过程中返回 Varchar2的主要内容,如果未能解决你的问题,请参考以下文章

如何查询存储过程开始执行时间和结束时间

使用 12c 客户端截断的存储过程 OUTPUT VARCHAR2 值

Oracle 数据库中的存储过程 (11g)

如何从 MySQL 中的存储过程返回字符串值?

oracle 函数中能调用存储过程吗

如何从存储过程中获取结果,过程运行良好但 php 返回 null