以下代码使用的是: 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
CREATE OR REPLACE PACKAGE BODY PLSQL_HELLO_WORLD isFUNCTION SAY_HELLO(PI_NAME IN VARCHAR2) RETURN VARCHAR2 ISV_HELLO VARCHAR2(20);BEGINIF PI_NAME IS NULL THENV_HELLO := 'hello world!';ELSEV_HELLO := 'hello ' || PI_NAME;END IF;RETURN(V_HELLO);END SAY_HELLO;PROCEDURE OPEN_ONE_CURSOR (N_EMPNO IN NUMBER,IO_CURSOR IN OUT TYPE_CURSOR)IS V_CURSOR TYPE_CURSOR; BEGIN IF N_EMPNO = 10 OR N_EMPNO = 20 OR N_EMPNO = 30 THENOPEN V_CURSOR FOR SELECT EMP.EMPNO, EMP.ENAME, DEPT.DEPTNO, DEPT.DNAME FROM EMP, DEPT WHERE EMP.DEPTNO = DEPT.DEPTNO AND EMP.DEPTNO = N_EMPNO;ELSE OPEN V_CURSOR FOR SELECT EMP.EMPNO, EMP.ENAME, DEPT.DEPTNO, DEPT.DNAME FROM EMP, DEPT WHERE EMP.DEPTNO = DEPT.DEPTNO;END IF;IO_CURSOR := V_CURSOR; END OPEN_ONE_CURSOR; PROCEDURE OPEN_TWO_CURSORS (EMPCURSOR OUT TYPE_CURSOR,DEPTCURSOR OUT TYPE_CURSOR)IS V_CURSOR1 TYPE_CURSOR; V_CURSOR2 TYPE_CURSOR; BEGIN OPEN V_CURSOR1 FOR SELECT * FROM EMP;OPEN V_CURSOR2 FOR SELECT * FROM DEPT;EMPCURSOR := V_CURSOR1; DEPTCURSOR := V_CURSOR2; END OPEN_TWO_CURSORS;END PLSQL_HELLO_WORLD;
运维网声明
1、欢迎大家加入本站运维交流群:群②:261659950 群⑤:202807635 群⑦870801961 群⑧679858003
2、本站所有主题由该帖子作者发表,该帖子作者与运维网 享有帖子相关版权
3、所有作品的著作权均归原作者享有,请您和我们一样尊重他人的著作权等合法权益。如果您对作品感到满意,请购买正版
4、禁止制作、复制、发布和传播具有反动、淫秽、色情、暴力、凶杀等内容的信息,一经发现立即删除。若您因此触犯法律,一切后果自负,我们对此不承担任何责任
5、所有资源均系网友上传或者通过网络收集,我们仅提供一个展示、介绍、观摩学习的平台,我们不对其内容的准确性、可靠性、正当性、安全性、合法性等负责,亦不承担任何法律责任
6、所有作品仅供您个人学习、研究或欣赏,不得用于商业或者其他用途,否则,一切后果均由您自己承担,我们对此不承担任何法律责任
7、如涉及侵犯版权等问题,请您及时通知我们,我们将立即采取措施予以解决
8、联系人Email:admin@iyunv.com 网址:www.yunweiku.com