首先看我的oracle数据包
create
or
replace
package Pkg_GetQuery
is

--
Author : ZM
--
Created : 2007-12-12 19:38:22
--
Purpose :
--
Public type declarations
type Cur_Ref
is
ref
cursor
;
Procedure
Proc_GetQueryStudinfo(strkey
varchar2
,cur_Result out Cur_Ref);


end
Pkg_GetQuery;
其次包的主体实现:
create
or
replace
package body Pkg_GetQuery
is

--
Private type declarations
procedure
Proc_GetQueryStudinfo(strkey
varchar2
,cur_Result out cur_Ref)
is
strsql
varchar2
(
1000
);
begin
strsql:
=
'
select * from StudInfo Where StudName Like
'''
||
strkey
||
'
%
'''
;
Open
Cur_Result
For
StrSql;
/*比较重要的一句*/
end
;
end
Pkg_GetQuery;


再次,用VB调用存储过程开始:
conn.ConnectionString
=
strconn
conn.CursorLocation
=
adUseClient
conn.Open
Set cmd.ActiveConnection
=
conn
cmd.CommandType
=
adCmdStoredProc
cmd.CommandText
=
"
STUD20050704006.Pkg_GetQuery.Proc_GetQueryStudInfo
"
Set para1
=
cmd.CreateParameter(
"
StrKey
"
, adVarChar, adParamInput,
1000
,
"
张
"
)
para1.Value
=
Text1.Text
cmd.Parameters.Append para1
'
Set para2 = cmd.CreateParameter("Cur_Result", adUserDefined, adParamOutput)
'
cmd.Parameters.Append para2

Set rs
=
cmd.Execute()
大家看到了,我第二个参数的类型,我写的是 adUserDefined,后测试不行.它并不像C#那样,可以 写cmd.Parameters.Add("rst",OracleType.Cursor); 后查了很多资料,才解决.
完整代码:
Dim strconn As String
Dim conn As New ADODB.Connection
Dim cmd As New ADODB.Command
Dim para As New ADODB.Parameter
Dim rs As New ADODB.Recordset
Dim para1 As New ADODB.Parameter
Dim para2 As New ADODB.Parameter


Private Sub Command1_Click()
strconn = "Provider=MSDAORA.1;Password=*****;User ID=linux_wolfelite;Data Source=0.0.0.0/jkxoracl;Persist Security Info=True"
conn.ConnectionString = strconn
conn.CursorLocation = adUseClient
conn.Open
Set cmd.ActiveConnection = conn
cmd.CommandType = adCmdStoredProc
cmd.CommandText = "STUD20050704006.Pkg_GetQuery.Proc_GetQueryStudInfo"
' Set para = cmd.CreateParameter("score", adNumeric, adParamInput)
' para.Precision = 4
' para.NumericScale = 1
Set para1 = cmd.CreateParameter("StrKey", adVarChar, adParamInput, 1000, "张")
para1.Value = Text1.Text
cmd.Parameters.Append para1
' Set para2 = cmd.CreateParameter("Cur_Result", adUserDefined, adParamOutput)
' cmd.Parameters.Append para2

Set rs = cmd.Execute()
If rs.RecordCount > 0 Then
MsgBox rs.RecordCount
End If

Set DataGrid1.DataSource = rs
DataGrid1.Refresh
If Not rs.BOF Then
rs.MoveLast
Text2.Text = rs(0).Value
End If
' Set rst = cmd.Execute(Null, Null, adCmdStoredProc)

' Set rs = Nothing
' Set conn = Nothing
End Sub

Private Sub Command2_Click()
rs.MovePrevious
Text2.Text = rs(0).Value
End Sub
说明:
1,text1是输入参数值,
2,text2没有多大意义,我是为了测试是否可以movelast
3,感谢这个帖子,http://www.80diy.com/home/20060323/15/4634977.html,
4,给出C#调用代码,用C#代码调用是比较简单的.
private DataTable ExecuteProcToDataSet(string Proc_Name,Hashtable HT,string
Ref_Cur_Name) {
• DataTable MyTable = new DataTable();
• try {
• OraConn = new OracleConnection(StrConnOracle);
• OraComm = new OracleCommand();
• OraComm.Connection = OraConn;
•
OraComm.CommandType = CommandType.StoredProcedure;
• OraComm.CommandText = Proc_Name;
• IDictionaryEnumerator Enumerator= HT.GetEnumerator();
•
while (Enumerator.MoveNext()) {
•
object
Value = Enumerator.Value;
• OracleParameter OraParam=new
OracleParameter(Enumerator.Key.ToString(), Value);
• OraComm.Parameters.Add(OraParam);
•
OracleParameter OraParamCur = new
OracleParameter(Ref_Cur_Name, OracleType.Cursor);
• OraParamCur.Direction = ParameterDirection.Output;
• OraComm.Parameters.Add(OraParamCur);
• DataSet MyDataSet = new DataSet();
• OraAdapter = new OracleDataAdapter(OraComm);
• OraAdapter.Fill(MyDataSet, "MyTable");
• MyTable = MyDataSet.Tables["MyTable"];
• }
• catch (Exception ex)
• {
• MessageBox.Show(ex.Message);
• }
• return MyTable;
• }



























再次,用VB调用存储过程开始:

















大家看到了,我第二个参数的类型,我写的是 adUserDefined,后测试不行.它并不像C#那样,可以 写cmd.Parameters.Add("rst",OracleType.Cursor); 后查了很多资料,才解决.
完整代码:

























































1,text1是输入参数值,
2,text2没有多大意义,我是为了测试是否可以movelast
3,感谢这个帖子,http://www.80diy.com/home/20060323/15/4634977.html,
4,给出C#调用代码,用C#代码调用是比较简单的.


































