Discussions
Categories
- 196.8K All Categories
- 2.2K Data
- 235 Big Data Appliance
- 1.9K Data Science
- 449.9K Databases
- 221.6K General Database Discussions
- 3.8K Java and JavaScript in the Database
- 31 Multilingual Engine
- 549 MySQL Community Space
- 478 NoSQL Database
- 7.9K Oracle Database Express Edition (XE)
- 3K ORDS, SODA & JSON in the Database
- 532 SQLcl
- 4K SQL Developer Data Modeler
- 186.9K SQL & PL/SQL
- 21.3K SQL Developer
- 295.5K Development
- 17 Developer Projects
- 138 Programming Languages
- 292.1K Development Tools
- 104 DevOps
- 3.1K QA/Testing
- 645.9K Java
- 28 Java Learning Subscription
- 37K Database Connectivity
- 154 Java Community Process
- 105 Java 25
- 22.1K Java APIs
- 138.1K Java Development Tools
- 165.3K Java EE (Java Enterprise Edition)
- 17 Java Essentials
- 158 Java 8 Questions
- 85.9K Java Programming
- 79 Java Puzzle Ball
- 65.1K New To Java
- 1.7K Training / Learning / Certification
- 13.8K Java HotSpot Virtual Machine
- 94.2K Java SE
- 13.8K Java Security
- 203 Java User Groups
- 24 JavaScript - Nashorn
- Programs
- 402 LiveLabs
- 37 Workshops
- 10.2K Software
- 6.7K Berkeley DB Family
- 3.5K JHeadstart
- 5.6K Other Languages
- 2.3K Chinese
- 171 Deutsche Oracle Community
- 1.1K Español
- 1.9K Japanese
- 230 Portuguese
ODP.NET - Calling Oracle Function , ODD behaviour.

508658
Member Posts: 3
I wrote a small Oracle Function for Test as below.
CREATE OR REPLACE FUNCTION SaveData(en varchar2) RETURN VARCHAR2 IS
xxx varchar2(100);
Begin
xxx := en || 'Done';
Insert into TestSaveData values(xxx);
Return xxx;
End;
When i Execute the same from SQL*PLus it works as expceted. e.g
Step1: Exec :x := SaveData('Hello');
Step2: Select * from TestSaveData;
ENX
---------
HelloDone
Done
Done
Done
Done
But when i call from .NET using ODP, some how "EN" does not receive parameter value, as you can see in sample data above. The First record is inserted via PL*SQL and Rest by a .NET program.
Following is the code written in VB.NET
Try
Dim cnn As New Oracle.DataAccess.Client.OracleConnection("Data Source=OracleG;User Id=Scott;password=Tiger")
Dim cmd As New Oracle.DataAccess.Client.OracleCommand("SAVEDATA", cnn)
cmd.CommandType = CommandType.StoredProcedure
cmd.Parameters.Add("EN", Oracle.DataAccess.Client.OracleDbType.Varchar2, 100, "HHH", ParameterDirection.Input)
cmd.Parameters.Add("RS", Oracle.DataAccess.Client.OracleDbType.Varchar2, ParameterDirection.ReturnValue)
cnn.Open()
Dim ooo As Object = cmd.ExecuteScalar()
Dim q As Object = cmd.Parameters("RS").OracleDbType.ToString()
Dim s As String = q
cnn.Close()
Catch ex As Oracle.DataAccess.Client.OracleException
MsgBox(ex.Message())
End Try
I cant't spot where i am making mistake. Can someone throw light
CREATE OR REPLACE FUNCTION SaveData(en varchar2) RETURN VARCHAR2 IS
xxx varchar2(100);
Begin
xxx := en || 'Done';
Insert into TestSaveData values(xxx);
Return xxx;
End;
When i Execute the same from SQL*PLus it works as expceted. e.g
Step1: Exec :x := SaveData('Hello');
Step2: Select * from TestSaveData;
ENX
---------
HelloDone
Done
Done
Done
Done
But when i call from .NET using ODP, some how "EN" does not receive parameter value, as you can see in sample data above. The First record is inserted via PL*SQL and Rest by a .NET program.
Following is the code written in VB.NET
Try
Dim cnn As New Oracle.DataAccess.Client.OracleConnection("Data Source=OracleG;User Id=Scott;password=Tiger")
Dim cmd As New Oracle.DataAccess.Client.OracleCommand("SAVEDATA", cnn)
cmd.CommandType = CommandType.StoredProcedure
cmd.Parameters.Add("EN", Oracle.DataAccess.Client.OracleDbType.Varchar2, 100, "HHH", ParameterDirection.Input)
cmd.Parameters.Add("RS", Oracle.DataAccess.Client.OracleDbType.Varchar2, ParameterDirection.ReturnValue)
cnn.Open()
Dim ooo As Object = cmd.ExecuteScalar()
Dim q As Object = cmd.Parameters("RS").OracleDbType.ToString()
Dim s As String = q
cnn.Close()
Catch ex As Oracle.DataAccess.Client.OracleException
MsgBox(ex.Message())
End Try
I cant't spot where i am making mistake. Can someone throw light
Comments
-
Immjediately before you execute.. how many parameters does the command have, and what are the values?
-
No need to do this much code for getting value from function ,
just take values like this
Dim cnn As New Oracle.DataAccess.Client.OracleConnection("Data Source=OracleG;User Id=Scott;password=Tiger")
Dim cmd As New Oracle.DataAccess.Client.OracleCommand()
cmd.Connection=cnn
cmd.CommandType = CommandType.Text
Dim obj as object
Dim s as String
obj = cmd.ExecuteScalar("SELECT SaveData('Hello') FROM DUAL")
s = obj.ToString() -
For some reason only knows to Larre, your returnvalue must be the FIRST parameter. Not sure for the logic, but it works.
So by simply switching your code to:
cmd.Parameters.Add("RS", Oracle.DataAccess.Client.OracleDbType.Varchar2, ParameterDirection.ReturnValue)
cmd.Parameters.Add("EN", Oracle.DataAccess.Client.OracleDbType.Varchar2, 100, "HHH", ParameterDirection.Input)
It'll work. -
I am agree with kesler's opinion,Just do it.
-
Just fyi, here's the reason the returnvalue needs to be first. ODP constructs an anonymous block to execute the stored procedure, along the lines of the following:
begin :retval := myproc(:paramval);end;
and the default for ODP is to bind by position, rather than by name. So the fist parameter added needs to be the return value.
Hope it helps,
Greg -
Thanks man... I was in a lot of troubles with this, and i would never imagine that the parameter must be the first one
This discussion has been closed.