Passing Array of UDT or Collection as IN OUT using OracleDbType.InputOutput
Hi gurus,
I received the following helpful and correct answer to this thread
Re: Error Passing UDT as Collections using OracleDbType.Object
However I'm now trying to modify it to be an OracleDbType.InputOutput as the correct answer modified my original code.
Using the above thread, could someone please let me know how to do this so I can pass a Collection in modifiy it in the Stored Procedure and get back the results. There are no samples I could see.
Rob
http://www.scnet.com.au
Hi,
I looked at the other thread, but I'm not quite clear I understand what you're doing if the solution as "bind as OracleDbType.Array instead of Object", although you didnt explicitely state what plsq type of object you've created that you're trying to pass. Is it Table of Object? You'd bind as Object for that.
Here's a complete example of IN OUT table of object. The CLUB and PERSON classes are generated via ODT, and the only change I made was to make m_person in Club.cs public instead of private , just for the sake of not having too add code, in order to keep the example simple.
Hope it helps,
Greg
drop type CLUB;
drop type PERSON;
create TYPE PERSON AS OBJECT (name varchar2(4000),age number);
create type CLUB as table of PERSON;
create or replace procedure AddLastName(v1 in out club)
IS
BEGIN
for i in 1 .. v1.count loop
v1(i).name := v1(i).name|| ' Darling';
end loop;
END;
show err;
using System;
using System.Data;
using Oracle.DataAccess.Client;
namespace inout_table_of_object {
class Program
static void Main(string[] args)
PERSON[] arr_pers = new PERSON[2];
arr_pers[0] = new PERSON();
arr_pers[0].NAME = "Ian";
arr_pers[0].AGE = 6;
arr_pers[0].AGEIsNull = false;
arr_pers[1] = new PERSON();
arr_pers[1].NAME = "Melody";
arr_pers[1].AGE = 8;
arr_pers[1].AGEIsNull = false;
CLUB club = new CLUB();
club.m_PERSON = arr_pers;
using (OracleConnection con = new OracleConnection("user id=scott;password=tiger;data source=orcl"))
con.Open();
using (OracleCommand cmd = new OracleCommand("SCOTT.ADDLASTNAME", con))
cmd.CommandType = CommandType.StoredProcedure;
using (OracleParameter p1 = new OracleParameter("", OracleDbType.Object, ParameterDirection.InputOutput))
p1.UdtTypeName = "SCOTT.CLUB";
p1.Value = club;
cmd.Parameters.Add(p1);
cmd.ExecuteNonQuery();
CLUB club2 = (CLUB)(p1.Value);
PERSON[] arr_pers2 = club2.Value;
foreach (PERSON person in arr_pers2)
Console.WriteLine(person.NAME + " " + person.AGE);
}OUTPUT
======
Ian Darling 6
Melody Darling 8
Press any key to continue . . .
Similar Messages
-
How can i pass array as argument in magento api method calling using sudzc API in iphone Native APP
0down votefavorite
I am implementing magento standard api method in native iphone app. I use webservice generated by sudzc. To call method I use:
[service call:self action:@selector(callHandler:) sessionId:@" " resourcePath:@" " args:@""];
When I used methods e.g. cart.info or product.info in which I have to pass one parameter; it gives valid response. But when I used method e.g. cart_product.add in which I have to pass an argument as value of array it gives error
SQLSTATE[42000]: Syntax error or access violation:
1064 You have an error in your SQL syntax;
check the manual that corresponds to your MySQL server version for the right syntax to use near ')' at line 1
I have tested in SOAP UI also. There also it gives me same error. But same method works in PHP file. Even I tried by creating same soap request which I created using JavaScript but still it doesn't work.
Can anyone help me to pass array as a parameter using sudzc api to call magento web services?There is an error in your SQL.
-
Passing array of UDT in web service method
I have a backend Java class with method that takes an array of User Defined Type:
public example.ws2j.service.StatusCodeVO[] getAllStatusCodes(DepartmentCodeVO[]
deptCode)
StatusCodeVO[] resp = new StatusCodeVO[2];
resp[0].setName("Christy");
resp[0].setStatusCodeID(150L);
resp[1].setName("Bawiz");
resp[1].setStatusCodeID(110L);
return resp;
And run serviceGen, everything deploys fine. When I invoke this method from the
generated web service homepage I get the following error. Is the problem happening
during receipt or return from the call? How do I diagnose? I can attach my java
class & build.xml if you'd like... THANKS!
javax.xml.rpc.soap.SOAPFaultException javax.xml.rpc.soap.SOAPFaultException at
weblogic.webservice.core.DefaultOperation.invoke(DefaultOperation.java:459) at
weblogic.webservice.core.DefaultOperation.invoke(DefaultOperation.java:339) at
weblogic.webservice.server.servlet.ServletBase.invokeMultiOutput(ServletBase.java:271)
at weblogic.webservice.server.servlet.ServletBase.invokeOperation(ServletBase.java:244)
at weblogic.webservice.server.servlet.WebServiceServlet.invokeOperation(WebServiceServlet.java:306)
at weblogic.webservice.server.servlet.ServletBase.handleGet(ServletBase.java:198)
at weblogic.webservice.server.servlet.ServletBase.doGet(ServletBase.java:124)
at weblogic.webservice.server.servlet.WebServiceServlet.doGet(WebServiceServlet.java:224)
at javax.servlet.http.HttpServlet.service(HttpServlet.java:740) at javax.servlet.http.HttpServlet.service(HttpServlet.java:853)
at weblogic.servlet.internal.ServletStubImpl$ServletInvocationAction.run(ServletStubImpl.java:1058)
at weblogic.servlet.internal.ServletStubImpl.invokeServlet(ServletStubImpl.java:401)
at weblogic.servlet.internal.ServletStubImpl.invokeServlet(ServletStubImpl.java:306)
at weblogic.servlet.internal.WebAppServletContext$ServletInvocationAction.run(WebAppServletContext.java:5412)
at weblogic.security.service.SecurityServiceManager.runAs(SecurityServiceManager.java:744)
at weblogic.servlet.internal.WebAppServletContext.invokeServlet(WebAppServletContext.java:3086)
at weblogic.servlet.internal.ServletRequestImpl.execute(ServletRequestImpl.java:2544)
at weblogic.kernel.ExecuteThread.execute(ExecuteThread.java:153) at weblogic.kernel.ExecuteThread.run(ExecuteThread.java:134)Hello,
There are two issues, one is the generated webservice test page and the second is the actual webservice itself. The test page does
its best to introspect and create sample data, but it could have problems. The actual service in this case could be doing just
fine. You could try generating a client from the service (using clientgen) and see if it works OK. Also, after you build and
deploy the service, get the WSDL and post it here, it may give us a better clue to what is happening.
Thanks,
Bruce
Peter wrote:
I have a backend Java class with method that takes an array of User Defined Type:
public example.ws2j.service.StatusCodeVO[] getAllStatusCodes(DepartmentCodeVO[]
deptCode)
StatusCodeVO[] resp = new StatusCodeVO[2];
resp[0].setName("Christy");
resp[0].setStatusCodeID(150L);
resp[1].setName("Bawiz");
resp[1].setStatusCodeID(110L);
return resp;
And run serviceGen, everything deploys fine. When I invoke this method from the
generated web service homepage I get the following error. Is the problem happening
during receipt or return from the call? How do I diagnose? I can attach my java
class & build.xml if you'd like... THANKS!
javax.xml.rpc.soap.SOAPFaultException javax.xml.rpc.soap.SOAPFaultException at
weblogic.webservice.core.DefaultOperation.invoke(DefaultOperation.java:459) at
weblogic.webservice.core.DefaultOperation.invoke(DefaultOperation.java:339) at
weblogic.webservice.server.servlet.ServletBase.invokeMultiOutput(ServletBase.java:271)
at weblogic.webservice.server.servlet.ServletBase.invokeOperation(ServletBase.java:244)
at weblogic.webservice.server.servlet.WebServiceServlet.invokeOperation(WebServiceServlet.java:306)
at weblogic.webservice.server.servlet.ServletBase.handleGet(ServletBase.java:198)
at weblogic.webservice.server.servlet.ServletBase.doGet(ServletBase.java:124)
at weblogic.webservice.server.servlet.WebServiceServlet.doGet(WebServiceServlet.java:224)
at javax.servlet.http.HttpServlet.service(HttpServlet.java:740) at javax.servlet.http.HttpServlet.service(HttpServlet.java:853)
at weblogic.servlet.internal.ServletStubImpl$ServletInvocationAction.run(ServletStubImpl.java:1058)
at weblogic.servlet.internal.ServletStubImpl.invokeServlet(ServletStubImpl.java:401)
at weblogic.servlet.internal.ServletStubImpl.invokeServlet(ServletStubImpl.java:306)
at weblogic.servlet.internal.WebAppServletContext$ServletInvocationAction.run(WebAppServletContext.java:5412)
at weblogic.security.service.SecurityServiceManager.runAs(SecurityServiceManager.java:744)
at weblogic.servlet.internal.WebAppServletContext.invokeServlet(WebAppServletContext.java:3086)
at weblogic.servlet.internal.ServletRequestImpl.execute(ServletRequestImpl.java:2544)
at weblogic.kernel.ExecuteThread.execute(ExecuteThread.java:153) at weblogic.kernel.ExecuteThread.run(ExecuteThread.java:134) -
How to use OracleDbType.Array provided by ODP with User defined type ?
Can anyone help me how to use OracleDbType.Array provided by ODP.NET ?
I need to pass string array to a oracle stored procedure .
User defined array type defined in oracle is :
CREATE TYPE TYPE_NAME IS TABLE OF varchar2(20) ;
This type is defined outside of any package , and i have tested that if definition of type is modified to
CREATE TYPE TYPE_NAME IS TABLE OF varchar2(20) index by binary_integer , i am able to pass array as AssociativeArray to my Stored Procedure.
But how to pass array object if the Type's definition does not contain index by clause ?
Please help how to pass Array object to Oracle Stored Procedure ?The solution described in Passing Array of UDT or Collection as IN OUT using OracleDbType.InputOutput
is working for me.
Edited by: stzueger on Jan 2, 2012 10:32 AM -
How to Pass String array from Java to PL/SQL and this use in CURSOR
hi,
I cant understand how to pass Array String as Input Parameter to the Procedure and this array use in Cursor for where condition like where SYMPTOM in( ** Array String **).
This array containing like (SYMPTOM ) to be returned from the java to the
pl/sql (I am not querying the database to retrieve the information).
I cannot find an example on this. I will give the PL/SQL block
create or replace procedure DISEASE_DTL<*** String Array ***> as
v_SYMPTOM number(5);
CURSOR C1 is
select distinct a.DISEASE_NAME from SYMPTOM_DISEASE_RD a
where ltrim(rtrim(a.SYMPTOM)) in ('Fever','COUGH','Headache','Rash') ------- ***** Here use this array element(like n1,n2,n3,n4,n5..) ******
group by a.DISEASE_NAME having count(a.DISEASE_NAME) > 3 ----------- ***** 3 is no of array element - 1 (i.e( n - 1))*****
order by a.DISEASE_NAME ;
begin
for C1rec IN C1 loop
select count(distinct(A.SYMPTOM)) into v_SYMPTOM from SYMPTOM_DISEASE_RD a where A.DISEASE_NAME = C1rec.DISEASE_NAME;
insert into TEMP_DISEASE_DTLS_SYMPTOM_RD
values (SL_ID_SEQ.nextval,
C1rec.DISEASE_NAME,
(4/v_SYMPTOM), --------**** 4 is no of array element (n)************
(1-(4/v_SYMPTOM)));
end loop;
commit;
end DISEASE_DTL;
Please give the proper solution and step ..
Thanking you,
AsishI've haven't properly read through your code but here's an artificial example based on a sql collection of object types - you don't need that, you just need a type table of varchar2 rather than a type table of oracle object type:
http://orastory.wordpress.com/2007/05/01/upscaling-your-jdbc-app/ -
URGENT: Passing Array from JSP to a Stored Procedure
Hi,
Can some one please help me understanding how can I pass array from JSP page to a stored procedure in database.
Thanks in advance.
JatinderThanks.
I tried ArrayExampla.java and was successful in passing array values to the stored database procedure.
How can I use this class in JSP? Like I have first JSP where in I will collect input from the user and then submit it to the second JSP - that needs to call the ArrayExample.java to pass the values as array to the database.
How should I call this java code in my second JSP?
Thanks in advance. -
Passing Array of java objects to and from oracle database-Complete Example
Hi all ,
I am posting a working example of Passing Array of java objects to and from oracle database . I have struggled a lot to get it working and since finally its working , postinmg it here so that it coudl be helpful to the rest of the folks.
First thinsg first
i) Create a Java Value Object which you want to pass .
create or replace and compile java source named Person as
import java.sql.*;
import java.io.*;
public class Person implements SQLData
private String sql_type = "PERSON_T";
public int person_id;
public String person_name;
public Person () {}
public String getSQLTypeName() throws SQLException { return sql_type; }
public void readSQL(SQLInput stream, String typeName) throws SQLException
sql_type = typeName;
person_id = stream.readInt();
person_name = stream.readString();
public void writeSQL(SQLOutput stream) throws SQLException
stream.writeInt (person_id);
stream.writeString (person_name);
ii) Once you created a Java class compile this class in sql plus. Just Copy paste and run it in SQL .
you should see a message called "Java created."
iii) Now create your object Types
CREATE TYPE person_t AS OBJECT
EXTERNAL NAME 'Person' LANGUAGE JAVA
USING SQLData (
person_id NUMBER(9) EXTERNAL NAME 'person_id',
person_name VARCHAR2(30) EXTERNAL NAME 'person_name'
iv) Now create a table of Objects
CREATE TYPE person_tab IS TABLE OF person_t;
v) Now create your procedure . Ensure that you create dummy table called "person_test" for loggiing values.
create or replace
procedure give_me_an_array( p_array in person_tab,p_arrayout out person_tab)
as
l_person_id Number;
l_person_name Varchar2(200);
l_person person_t;
l_p_arrayout person_tab;
errm Varchar2(2000);
begin
l_p_arrayout := person_tab();
for i in 1 .. p_array.count
loop
l_p_arrayout.extend;
insert into person_test values(p_array(i).person_id, 'in Record '||p_array(i).person_name);
l_person_id := p_array(i).person_id;
l_person_name := p_array(i).person_name;
l_person := person_t(null,null);
l_person.person_id := l_person_id + 5;
l_person.person_name := 'Out Record ' ||l_person_name ;
l_p_arrayout(i) := l_person;
end loop;
p_arrayout := l_p_arrayout;
l_person_id := p_arrayout.count;
for i in 1 .. p_arrayout.count
loop
insert into person_test values(l_person_id, p_arrayout(i).person_name);
end loop;
commit;
EXCEPTION WHEN OTHERS THEN
errm := SQLERRM;
insert into person_test values(-1, errm);
commit;
end;
vi) Now finally create your java class which will invoke the pl/sql procedure and get the updated value array and then display it on your screen>Alternatively you can also check the "person_test" tbale
import java.util.Date;
import java.io.*;
import java.sql.*;
import oracle.sql.*;
import oracle.jdbc.driver.*;
import java.text.DateFormat;
import java.text.ParseException;
import java.text.SimpleDateFormat;
public class ArrayDemo
public static void passArray() throws SQLException
Connection conn = getConnection();
ArrayDemo a = new ArrayDemo();
Person pn1 = new Person();
pn1.person_id = 1;
pn1.person_name = "SunilKumar";
Person pn2 = new Person();
pn2.person_id = 2;
pn2.person_name = "Superb";
Person pn3 = new Person();
pn3.person_id = 31;
pn3.person_name = "Outstanding";
Person[] P_arr = {pn1, pn2, pn3};
Person[] P_arr_out = new Person[3];
ArrayDescriptor descriptor =
ArrayDescriptor.createDescriptor( "PERSON_TAB", conn );
ARRAY array_to_pass =
new ARRAY( descriptor, conn, P_arr);
OracleCallableStatement ps =
(OracleCallableStatement )conn.prepareCall
( "begin give_me_an_array(?,?); end;" );
ps.setARRAY( 1, array_to_pass );
ps.registerOutParameter( 2, OracleTypes.ARRAY,"PERSON_TAB" );
ps.execute();
oracle.sql.ARRAY returnArray = (oracle.sql.ARRAY)ps.getArray(2);
Object[] personDetails = (Object[]) returnArray.getArray();
Person person_record = new Person();
for (int i = 0; i < personDetails.length; i++) {
person_record = (Person)personDetails;
System.out.println( "row " + i + " = '" + person_record.person_name +"'" );
public static void main (String args[]){
try
ArrayDemo tfc = new ArrayDemo();
tfc.passArray();
catch(Exception e) {
e.printStackTrace();
public static Connection getConnection() {
try
Class.forName ("oracle.jdbc.OracleDriver");
return DriverManager.getConnection("jdbc:oracle:thin:@<<HostNanem>>:1523:VIS",
"username", "password");
catch(Exception SQLe) {
System.out.println("IN EXCEPTION BLOCK ");
return null;
and thats it. you are done.
Hope it atleast helps people to get started. Comments are appreciated. I can be reached at ([email protected]) or [email protected]
Thanks
Sunil.sHi Sunil,
I've a similar situation where I'm trying to insert Java objects in db using bulk insert. My issue is with performance for which I've created a new thread.
http://forum.java.sun.com/thread.jspa?threadID=5270260&tstart=30
I ran into your code and looked into it. You've used the Person object array and directly passing it to the oracle.sql.ARRAY constructor. Just curios if this works, cos my understanding is that you need to create a oracle.sql.STRUCT out of ur java object collection and pass it to the ARRAY constructor. I tried ur way but got this runtime exception.
java.sql.SQLException: Fail to convert to internal representation: JavaBulkInsertNew$Option@10bbf9e
at oracle.jdbc.driver.DatabaseError.throwSqlException(DatabaseError.java:112)
at oracle.jdbc.driver.DatabaseError.throwSqlException(DatabaseError.java:146)
at oracle.jdbc.oracore.OracleTypeADT.toDatum(OracleTypeADT.java:239)
at oracle.jdbc.oracore.OracleTypeADT.toDatumArray(OracleTypeADT.java:274)
at oracle.jdbc.oracore.OracleTypeUPT.toDatumArray(OracleTypeUPT.java:115)
at oracle.sql.ArrayDescriptor.toOracleArray(ArrayDescriptor.java:1314)
at oracle.sql.ARRAY.<init>(ARRAY.java:152)
at JavaBulkInsertNew.main(JavaBulkInsertNew.java:76)
Here's a code snippet I used :
Object optionVal[] = {optionArr[0]}; // optionArr[0] is an Option object which has three properties
oracle.sql.ArrayDescriptor empArrayDescriptor = oracle.sql.ArrayDescriptor.createDescriptor("TT_EMP_TEST",conn);
ARRAY empArray = new ARRAY(empArrayDescriptor,conn,optionVal);If you visit my thread, u'll see that I'm using STRUCT and then pass it to the ARRAY constructor, which works well, except for the performance issue.
I'll appreciate if you can provide some information.
Regards,
Shamik -
How can i pass arrays in a procedure as IN parameter
for eg.
If I have a procedure which takes an input login id and a input status
procedure test(loginId IN varchar, status IN varchar)
-- the procedure does insert and update using the input login id and input status
Now, suppose i have a bunch of input login ids and a bunch of status, how can i pass the login id and status values as an array to the procedure instead of calling the procedure in a loop?This is best done using an object type and collection type, so you can make use of bulk SQL to perform the DML. I've given a short demo below:-
First your target table...
SQL> create table my_table ( id number, status varchar2(1) );
Table created.Now we create an object type ( this defines the record structure for your parameter ). We then create a nested table type (collection) based on this record structure:-
SQL> create type login_record_ot as object
2 ( id number
3 , status varchar2(1)
4 );
5 /
Type created.
SQL> create type login_records_ntt as table of login_record_ot;
2 /
Type created.Now a demo package with a procedure to insert the input collection into the target table. This uses the TABLE expression ( combined with CAST just in case you are on 8i )...
SQL> create package pkg as
2 procedure insert_records (
3 login_records_in in login_records_ntt
4 );
5 end pkg;
6 /
Package created.
SQL> create package body pkg as
2
3 procedure insert_records (
4 login_records_in in login_records_ntt
5 ) is
6 begin
7 insert into my_table ( id, status )
8 select x.id
9 , x.status
10 from table( cast( login_records_in as login_records_ntt )) x;
11 dbms_output.put_line( sql%rowcount || ' rows inserted.' );
12 end insert_records;
13
14 end pkg;
15 /
Package body created.Now to use it. I'll load a dummy variable with a collection of IDs/statuses and pass them to the pkg.insert_records procedure...
SQL> declare
2 some_records login_records_ntt := login_records_ntt(
3 login_record_ot( 1, 'X' ),
4 login_record_ot( 2, 'Y' ),
5 login_record_ot( 3, 'Z' ),
6 login_record_ot( 4, 'A' ),
7 login_record_ot( 5, 'B' )
8 );
9 begin
10 pkg.insert_records( some_records );
11 end;
12 /
5 rows inserted.
PL/SQL procedure successfully completed.
SQL>
SQL> select * from my_table;
ID S
1 X
2 Y
3 Z
4 A
5 BRegards
Adrian -
Hi,
I am facing issues like Type Mismatch while passing Array of interfaces from .NET to VBA and vice versa using VSTO technology.
My requirement is that ComInterfaceType needs to be InterfaceIsIDispatch.
My Interface definition is somewhat like this
[ComVisible(true)]
[InterfaceType(ComInterfaceType.InterfaceIsIDispatch)]
[Guid("AAF48FBC-52B6-4179-A8D2-944D7FBF264E")]
public interface IInterface1
[DispId(0)]
IInterface2[] GetObj();
[DispId(1)]
void SetObj(ref IInterface2[] obj);
[ComVisible(true)]
[InterfaceType(ComInterfaceType.InterfaceIsIDispatch)]
[Guid("CDC06E1D-FE8C-477E-97F1-604B73EF868F")]
public interface IInterface2
IF i am passing array of above interface (created in C#.Net) to VBA using GetObj API,i am getting type mismatch error in VBA while assigning the value to variable in VBA.Even assigning to variant type variable gives TypeMismatch.
Also while passing Array of interfaces from VBA using SetObj API,excel crashes and sometimes it says method doesn't exists.
Kindly provide some assistance regarding the same.
ThanksHi,
I am facing issues like Type Mismatch while passing Array of interfaces from .NET to VBA and vice versa using VSTO technology.
My requirement is that ComInterfaceType needs to be InterfaceIsIDispatch.
My Interface definition is somewhat like this
[ComVisible(true)]
[InterfaceType(ComInterfaceType.InterfaceIsIDispatch)]
[Guid("AAF48FBC-52B6-4179-A8D2-944D7FBF264E")]
public interface IInterface1
[DispId(0)]
IInterface2[] GetObj();
[DispId(1)]
void SetObj(ref IInterface2[] obj);
[ComVisible(true)]
[InterfaceType(ComInterfaceType.InterfaceIsIDispatch)]
[Guid("CDC06E1D-FE8C-477E-97F1-604B73EF868F")]
public interface IInterface2
IF i am passing array of above interface (created in C#.Net) to VBA using GetObj API,i am getting type mismatch error in VBA while assigning the value to variable in VBA.Even assigning to variant type variable gives TypeMismatch.
Also while passing Array of interfaces from VBA using SetObj API,excel crashes and sometimes it says method doesn't exists.
Kindly provide some assistance regarding the same.
Thanks -
How to pass Array of Java objects to Callable statement
Hi ,
I need to know how can I pass an array of objects to PL/SQL stored procedure using callable statement.
So I am having and array list of some object say xyz which has two attributes string and double type.
Now I need to pass this to a PL/SQL Procedure as IN parameter.
Now I have gone through some documentation for the same and found that we can use ArrayDescriptor tp create array (java.sql.ARRAY).
And we will use a record type from SQL to map this to our array of java objects.
So my question is how this mapping of java object's two attribute will be done to the TYPE in SQL? can we also pass this array as a package Table?
Please help
ThanksI seem to remember that that is in one of Oracle's online sample programs.
http://www.oracle.com/technology/sample_code/tech/java/sqlj_jdbc/index.html -
How to pass array into xslt from java
i have a xslt in which i am passing some parameter from java there is one parameter which is a array in java which i need to pass becouse array length is not defined so that xslt will work dynakically according to the parameter.
right now i am passing parameter but not able to send the array parameter that's why my code is not fully dynamic
please give suggestion.
anaghit is not possible to pass array by using XSLT, you can wirite all values into a String with certain delim symbol, pass this string, then use xsl.substring() to get different values.
-
hi,
is it possible to pass an array into a resultset? if yes please indicate how.
thank you all in advanceHi,
Sorry for the confusion, here's what I'm trying to accomplish.
I'm trying to create a report in Crystal Report and use Java as data source. My Java application needs to generate some value and pass them to the report as parameters. After some research I've found that I can use a Java Bean class as data source for Crystal Report that returns a ResultSet. Therefore I'm trying to pass some values in my Java app into the Bean class as array and convert them to a ResultSet for Crystal Report.
If you know of a different way please let me know, otherwise, this is what I meant by passing array into resultset.
thanks for your reply, -
ORA-00932 when trying to pass ARRAY from Java SP to PL/SQL
Hi all
I am trying to pass ARRAYs back and forth between PL/SQL and Java stored procedures. But I keep getting:
ORA-00932: inconsistent datatypes: expected a return value that is an instance of a user defined Java class convertible to an Oracle type got an object that could not be converted
Here's my PL/SQL:
create or replace type CONTENTP.sentences_array as VARRAY(1000) of CLOB
-- I've also tried .. as TABLE of CLOB and varray/table of VARCHAR2
declare
proc_clob CLOB;
arr SENTENCES_ARRAY;
begin
SELECT document_body
into proc_clob
from documents
where document_id = 618784;
arr := processdocument.sentencesplit (proc_clob);
end;
PROCESSDOCUMENT package definition:
CREATE OR REPLACE PACKAGE CONTENTP.PROCESSDOCUMENT AS
FUNCTION sentenceSplit(Param1 CLOB)
return SENTENCES_ARRAY
AS
LANGUAGE java
NAME 'com.contentp.documents.ProcessDocument.sentenceSplit(oracle.sql.CLOB) return oracle.sql.ARRAY';
FUNCTION removeHTML(Param1 CLOB)
return CLOB
AS
LANGUAGE java
NAME 'com.contentp.documents.ProcessDocument.removeHTML(oracle.sql.CLOB) return oracle.sql.CLOB';
end;
Java sentenceSplit code:
public static oracle.sql.ARRAY sentenceSplit ( CLOB text) throws IOException, SQLException
Connection conn = new OracleDriver().defaultConnection();
String[] arrSentences = sent.getsentences ( CLOBtoString (text) );
ArrayDescriptor arrayDesc =
ArrayDescriptor.createDescriptor ("SENTENCES_ARRAY", conn);
ARRAY ARRSentences = new ARRAY (arrayDesc, conn, arrSentences);
return ARRSentences;
I have confirmed that the String[] arrSentences contains a valid string array. So the problem seems to be the creation and passing of ARRSentences.
I have looked at pages and pages of documents and example code, and can't see anything wrong with my declaration of ARRSentences. I'm at a loss to explain what's wrong.
Thanks in advance - any help is much appreciated!I am trying to do something similar but seems like getting stuck at registerOutParameter for this.
Type definition:
CREATE OR REPLACE
type APL_CCAM9.VARCHARARRAY as table of VARCHAR2(100)
Java Stored Function code:
public static ARRAY fetchData (ARRAY originAreaCds, ARRAY serviceCds, ARRAY vvpcs) {
Connection connection = null;
ARRAY array = null;
try {
connection = new OracleDriver ().defaultConnection();
connection.setAutoCommit(false);
ArrayDescriptor adString = ArrayDescriptor.createDescriptor("VARCHARARRAY", connection);
String[] result = new String [2];
result[0] = "Foo";
result[1] = "Foo1";
array = new ARRAY (adString, connection, result);
connection.commit ();
return array;
} catch (SQLException sqlexp) {
try {
connection.rollback();
} catch (SQLException exp) {
return array;
Oracle Stored Function:
function FETCH_TRADE_DYN_DATA (AREA_CDS IN VARCHARARRAY, SERVICE_CDS IN VARCHARARRAY,VV_CDS IN VARCHARARRAY) return VARCHARARRAY AS LANGUAGE JAVA NAME 'com.apl.ccam.oracle.js.dalc.TDynAllocation.fetchData (oracle.sql.ARRAY, oracle.sql.ARRAY, oracle.sql.ARRAY) return oracle.sql.ARRAY';
Java Code calling Oracle Stored Procedure:
ocs = (OracleCallableStatement) oraconn.prepareCall(queryBuf.toString());
ArrayDescriptor adString = ArrayDescriptor.createDescriptor("VARCHARARRAY", oraconn);
String[] originAreaCds = sTDynAllocationVO.getGeogAreaCds();
ARRAY areaCdArray = new ARRAY (adString, oraconn, originAreaCds);
ocs.registerOutParameter(1, OracleTypes.ARRAY);
ocs.setArray (2, areaCdArray);
String[] serviceCds = sTDynAllocationVO.getServiceCds();
ARRAY serviceCdsArray = new ARRAY (adString, oraconn, serviceCds );
ocs.setArray (3, serviceCdsArray);
String[] vvpcs = sTDynAllocationVO.getVesselVoyagePortCdCallNbrs();
ARRAY vvpcsArray = new ARRAY (adString, oraconn, vvpcs);
ocs.setArray (4, vvpcsArray);
ocs.execute();
ARRAY results = ocs.getARRAY(1);
Error I get:
Parameter Type Conflict: sqlType=2003
Thanks for help in advance. -
Pass array to oracle stored procedure
I have such a problem: I have to pass array to stored procedure, so I declare type:
create type tNumberArray as table of number
and create procedure:
create or replace procedure proc_1 (in_param in tNumberArray) as
.... BODY OF PROCEDURE ...
when I call this procedure from C# like this:
int []pParam = new int[3] {1,2,3};
OracleCommand cmd = new OracleCommand("proc_1", dbConn);
cmd.CommandType = CommandType.StoredProcedure;
OracleParameter param14 = new OracleParameter("param", OracleDbType.Decimal);
param14.Value = pParam;
param14.CollectionType = OracleCollectionType.PLSQLAssociativeArray;
param14.Size = 3;
param14.Direction = ParameterDirection.Input;
cmd.Parameters.Add(param14);
cmd.ExecuteNonQuery();
an error occures. It say that there invalid number or type of parameters.
But when I declare both type and procedure in a package everything goes fine.
What is the matter? Did anybody have the same problem?Not I got next problem:
when I cannot pass parameter to stored procedure and get array fro it. In other words returning array from procedure and passing some input parameters to it does not word!
Does anybody know why it happens? -
Passing arrays to methods?
Hi all,
Thanks to most of the main contributors in this forum nearly all of my major hurdles in transitioning from proc-C to Cocoa have been overcome. However, while I was shown how to use NSMutableArray in conjunction with NSDictionary to do pretty much the same job as a C-style multi-dimensional array, dictionaries aren't always the perfect solution in every situation. So, let's suppose I wanted to construct a pure Cocoa facsimile of a C-style [4][x] array like this...
NSArray *replicaArray = [NSArray arrayWithObjects:
[NSNull null], // index 0 (unused)
[NSMutableArray array], // index 1
[NSMutableArray array], // index 2
[NSMutableArray array],nil]; // index 3
I threw in an NSNull as the first array object because (whenever possible) I adopted the habit of leaving row0 and column0 of multidimensional arrays unused to make for more natural, readable iteration ops and stuff. The above code works perfectly well, but with 4-5 different arrays in the same proc-C apps I often had to pass them to common functions (to handle things like bubble-sorting etc.) like the one below:
void bubbleSortSimpleArray (short arry[ ], short numsToSort)
short ctr,loopCtr,storeValue;
for (loopCtr = 1; loopCtr <= numsToSort; loopCtr++)
ctr = 1;
while (ctr < numsToSort)
if (arry[ctr] > arry[ctr+1])
storeValue = arry[ctr+1];
arry[ctr+1] = arry[ctr];
arry[ctr] = storeValue;
++ctr;
Of course, thanks to the advantages of Cocoa this entire code block can be replaced in just a couple lines with 'sortUsingSelector'. Sorry for the lengthy outline in attempting to describe my problem as clearly as possible , but (finally) _is it possible to pass arrays to methods_ in our Cocoa code in a similar way? I was thinking something along the lines of:
- (void)doMoreProcessing:(id)array
//do some other common stuff on my array(s) here...
That'd simplify converting some of my old code and be a real bonus for me, but I haven't been able to find any reference about this on the net so far, and experimenting with my code hasn't provided me with any answers yet, either... Any guidance on this would be very much appreciated!
Thanks in advance.
ErnieHi Bang A. Lore,
Thanks for your input but I've got it figured out now However, while you quite correctly say:
Pointers work the same way as they do in C.
the cause of my problems wasn't a lack of understanding of pointers, but by the syntax differences between proc-C and obj-C. I'm well aware of the fact that the name of a passed array is just a pointer to its address in memory of course, but attempting to use a mandatory 'C' style header declaration along the lines of:
- (void)test2DArray:(NSMutableArray*)array[][];
just kept giving me parse errors, as did any attempt to use square brackets in the implementation file. While 'C' insists on using them, I found (after some more experimentation) that obj-C will quite happily accept:
- (void)test2DArray:(NSMutableArray*)array;
...or the even simpler...
- (void)test2DArray:(id)array;
Also pleasantly surprised to find that Cocoa doesn't seem to give a hoot whether the (array) object you pass it is flat OR multidimensional -- whereas 'C' insists you even provide the called function with the number of rows contained in a multi-subscripted array -- which often meant I had to include two versions of many functions containing identical code, depending on whether they were called by 1D or 2D arrays.
Once I hit on the idea of omitting the square brackets entirely (just to stop the darned parse errors and see what would happen out of curiosity), the problem just went away.
Thanks once again. Appreciate it!
Maybe you are looking for
-
Error while running SDK application in XIR2 server machine
Hi all, Thanks for your support provided so far. I have developed a .NET sdk application to extract the metadata from the XI-R2 universe and report files. I'm able to run the application in my machine. But when I run my tool in the server machine whi
-
Tiger - All Sahring Options/Services disabled, greyed out
Hello from Portugal! I noticed that on System Preferences I had all my Sharing services disabled and cannot select any of them (greyed out). Also, the Firewall Tab was disabled to (greyed out), and I couldn't select it either. I noticed that as the f
-
Hello All Engineers, I have attached a VI with this post. Here in this VI i have two systems data coming from the field, getting the single value from each system in every second. I want as a result 2 waveform in the output chart but i am getting onl
-
When will email alarms work in iCal 3.0 and Leopard?
I have been trying to follow the Apple discussions of some of the problems in iCal 3.0 under Leopard. Fortunately, I haven't experienced some of them. The one that is bothering me is the inability to send email alarms. This is a feature I used a lot
-
My iphone 4s is rapidly switching back and forth from wifi to 4g
Hey! My iPhone 4S is rapidly switching back and forth from wifi to 4G. It will remain connected to wifi for about 10 seconds and switch to 4G for half a second. Then the cycle repeats. It's definitely been a drain on my battery. I've already switched