`
tubaluer
  • 浏览: 1447313 次
文章分类
社区版块
存档分类
最新评论
  • sblig: c / c++ 是不一样的都会输出 100
    j = j++

如何调用Oracle PL/SQL(ODP.NET)

 
阅读更多

以下代码使用的是: System.Data.OracleClient (.NET For Oracle Data Provider),使用

1. 如何调用Oracle PL/SQL中有返回值的Function?可以通过Command和Parameter对象匹配调用。

添加的Parameter被匹配为返回值和参数,第一个Parameter是返回值,然后都是传入PL/SQL的参数。

private void button1_Click(object sender, System.EventArgs e)
{
string connectionString = "User ID=scott;Password=tiger;Data Source=FIREFOX;";
string strPLSQL = "PLSQL_HELLO_WORLD.SAY_HELLO";

OracleConnection conn = new OracleConnection(connectionString);
OracleCommand cmd = new OracleCommand(strPLSQL, conn);
cmd.CommandType = CommandType.StoredProcedure;

// Param ReturnValue:
cmd.Parameters.Add("PO_RETURN", OracleType.VarChar, 20);
cmd.Parameters["PO_RETURN"].Direction = ParameterDirection.ReturnValue;

// Param 1: 注意,这里PI_NAME必须和PLSQL里的名字相符(大小写不敏感),否则抛出ORA-06550错误。
cmd.Parameters.Add("PI_NAME", OracleType.VarChar, 10);
cmd.Parameters["PI_NAME"].Direction = ParameterDirection.Input;
cmd.Parameters["PI_NAME"].Value = "firefox";

try
{
conn.Open();
cmd.ExecuteNonQuery();
string strRet = cmd.Parameters["PO_RETURN"].Value.ToString();
MessageBox.Show(strRet);
}
catch(Exception ex)
{
MessageBox.Show(ex.Message);
}
finally
{
conn.Close();
}

}

呵呵, 用点技巧来调用PL/SQL带返回值的Function: select... from dual

/// <summary>
///
Call the function of Oracle.
/// </summary>
/// <param name="sender"></param>
/// <param name="e"></param>

private void button2_Click(object sender, System.EventArgs e)
{
string connectionString = "User ID=scott;Password=tiger;Data Source=FIREFOX;";

OracleConnection conn = new OracleConnection(connectionString);
OracleCommand cmd = new OracleCommand();

cmd.Connection = conn;
cmd.CommandType = CommandType.Text;
cmd.CommandText = "SELECT PLSQL_HELLO_WORLD.SAY_HELLO(:PI_NAME) FROM DUAL";

cmd.Parameters.Add("PI_NAME", OracleType.VarChar, 20);
cmd.Parameters["PI_NAME"].Direction = ParameterDirection.Input;
cmd.Parameters["PI_NAME"].Value = "firefox";

try
{
conn.Open();
string strRet = cmd.ExecuteScalar() as string;
MessageBox.Show(strRet);
}
catch(Exception ex)
{
MessageBox.Show(ex.Message);
}
finally
{
conn.Close();
}
}

如何返回游标cursor, 这里,cursor只能是output parameter。使用Command来获取Cursor时必须使用ExecuteReader()

private void button3_Click(object sender, System.EventArgs e)
{
string connectionString = "User ID=scott;Password=tiger;Data Source=FIREFOX;";
string strPLSQL = "PLSQL_HELLO_WORLD.OPEN_ONE_CURSOR";

OracleConnection conn = new OracleConnection(connectionString);
OracleCommand cmd = new OracleCommand(strPLSQL, conn);
cmd.CommandType = CommandType.StoredProcedure;

// Param 1:
cmd.Parameters.Add("N_EMPNO", OracleType.Number, 2);
cmd.Parameters["N_EMPNO"].Direction = ParameterDirection.Input;
cmd.Parameters["N_EMPNO"].Value = 0;
// Param 2:
cmd.Parameters.Add("IO_CURSOR", OracleType.Cursor);
cmd.Parameters["IO_CURSOR"].Direction = ParameterDirection.Output;

OracleDataReader odr = null;

try
{
conn.Open();
odr = cmd.ExecuteReader();
while(odr.Read())
{
MessageBox.Show(odr.GetValue(0).ToString());
}
}
catch(Exception ex)
{
MessageBox.Show(ex.Message);
}
finally
{
if(odr != null)
odr.Close();
conn.Close();
}
}

当然也可以使用OracleDataAdapter:

private void button5_Click(object sender, System.EventArgs e)
{
string connectionString = "User ID=scott;Password=tiger;Data Source=FIREFOX;";
string strPLSQL = "PLSQL_HELLO_WORLD.OPEN_ONE_CURSOR";

OracleConnection conn = new OracleConnection(connectionString);
OracleCommand cmd = new OracleCommand(strPLSQL, conn);
cmd.CommandType = CommandType.StoredProcedure;

// Param 1:
cmd.Parameters.Add("N_EMPNO", OracleType.Number, 2);
cmd.Parameters["N_EMPNO"].Direction = ParameterDirection.Input;
cmd.Parameters["N_EMPNO"].Value = 30;
// Param 2:
cmd.Parameters.Add("IO_CURSOR", OracleType.Cursor);
cmd.Parameters["IO_CURSOR"].Direction = ParameterDirection.Output;

OracleDataAdapter adp = new OracleDataAdapter();
adp.SelectCommand = cmd;

try
{
DataTable dt = new DataTable();
adp.Fill(dt);
this.dataGrid1.DataSource = dt;
}
catch(Exception ex)
{
MessageBox.Show(ex.Message);
}
}

附:PL/SQL

分享到:
评论

相关推荐

Global site tag (gtag.js) - Google Analytics