如何从存储过程中返回 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的主要内容,如果未能解决你的问题,请参考以下文章