Arrays as IN/OUT parameters to stored procs
I need the ability to pass Java arrays as input parameters and receive arrays as output parameters from stored procedures. I searched this forum for "array stored procedure" and came up with 9 posts dating back to April 30, 1999. In every one of these posts, people have asked how this can be done, and as yet there has not been any real solution provided. One messy solution is to add another stored proc that takes the array items as scalars and builds a PL/SQL table to pass to the original stored proc.
I am getting the impression that using arrays for IN/OUT parameters to/from stored procedures is not possible with JDK 1.1. Can it be done with JDK 1.2?
Isn't there anyone from Oracle that can provide an answer or solution?
I've searched for a way of passing a rowtype to a stored
procedure or passing an array to a stored procedure.
The following example may have some pertinence. It was posted at
http://www.classicity.com/oracle/htdocs/forums/ClsyForumID124/6.h
tml#
I also think that it would be useful to know how best to pas a
ResultSet or equivalent to a Stored Procedure, if someone has
more information. The idea is to have symmetry between the way
data is retrieved from SP's (CURSORS) and supplied to SP's (???
ARRAY/CURSOR) ?
"[Example]Example of using JDBC with VARRAYS and REF CURSORs"
This example shows how to use JDBC with VARRAYS and REF
CURSORs.
It also shows use of the PreparedStatement and CallableStatement
methods.
The example does the follows:
1. selects from a table of VARRAYs
2. inserts into a table of VARRAYs
3. selects from a table of VARRAYs
4. calls stored procedure -- parameters <ref cursor, varray>
In order to test it, you will need to do two things first:
1) Create related tables and types first. The screipt is given
below.
2) Create a package that gets called from JAVA code. The script
is given below.
======================= Step 1 create tables etc. cute here
==================
-- Run this through SQL*PLUS
drop TABLE varray_table;
drop TYPE num_varray;
drop TABLE sec;
-- create the type
create TYPE num_varray as VARRAY(10) OF NUMBER(12, 2);
-- create the table
create TABLE varray_table (col1 num_varray);
-- create the sec table
create table sec (sec_id number(8) not null, sec_grp_id number
(8) not null,
company_id number(8) not null);
insert into sec values (1,200,11);
insert into sec values (2,1100,22);
insert into sec values (3,1300,33);
insert into sec values (4,1800,44);
==================== End of step
1===========================================
================== Step 2 create package
====================================
-- Run it through sql*plus
CREATE OR REPLACE PACKAGE packageA AS
type sctype is ref cursor return SEC%ROWTYPE;
procedure get_port_consensus(sc IN OUT sctype, arr IN
num_varray);
procedure test_port_consensus(sc IN OUT sctype);
END packageA;
CREATE OR REPLACE PACKAGE BODY packageA AS
procedure test_port_consensus(sc IN OUT sctype)
IS
testArr num_varray := num_varray(200, 1100, 1300, 1800);
BEGIN
get_port_consensus(sc, testArr);
END test_port_consensus;
procedure get_port_consensus(sc IN OUT sctype, arr IN num_varray)
IS
BEGIN
open sc for select * from sec
where sec_grp_id = arr(1)
or sec_grp_id = arr(2)
or sec_grp_id = arr(3)
or sec_grp_id = arr(4);
END get_port_consensus;
END packageA;
===================== End of step 2
===================================
============ JAVA code to test the whole thing
========================
import java.sql.*;
import oracle.sql.*;
import oracle.jdbc.oracore.Util;
import oracle.jdbc.driver.*;
import java.math.BigDecimal;
public class ArrayExample
public static void main (String args<>)
DriverManager.registerDriver(new oracle.jdbc.driver.OracleDriver
// Connect to the database
// You need to put your database name after the @ sign in
// the connection URL.
// The example retrieves an varray of type "NUM_VARRAY",
// materializes the object as an object of type ARRAY.
// A new ARRAY is then inserted into the database.
Connection conn =
DriverManager.getConnection ("jdbc:oracle:oci8:@v81",
"scott", "tiger");
// It's faster when auto commit is off
conn.setAutoCommit (false);
// Create a Statement
Statement stmt = conn.createStatement ();
System.out.println("Querying varray_table");
ResultSet rs = stmt.executeQuery("SELECT * FROM varray_table");
showResultSet (rs);
// now insert a new row
// create a new ARRAY object
int elements<> = { 200, 1100, 1300, 1800 };
ArrayDescriptor desc = ArrayDescriptor.createDescriptor
("NUM_VARRAY",conn);
ARRAY newArray = new ARRAY(desc, conn, elements);
// prepare statement to be inserted and bind the num_varray type
System.out.println("PreparedStatement: Inserting into
varray_table");
PreparedStatement ps =
conn.prepareStatement ("insert into varray_table values (?)");
((OraclePreparedStatement)ps).setARRAY (1, newArray);
ps.execute ();
// query to view our newly inserted row
System.out.println("Querying varray_table again");
rs = stmt.executeQuery("SELECT * FROM varray_table");
showResultSet (rs);
// prepare a callable statement -- call the stored procedure
// passing <ref cursor in out, varray in>
System.out.println("CallableStatement: Calling Stored
Procedure");
OracleCallableStatement oraStmt1 =
(OracleCallableStatement)conn.prepareCall("{ call
packageA.get_port_consensus(?, ?) }");
oraStmt1.registerOutParameter(1, OracleTypes.CURSOR);
oraStmt1.setARRAY(2, newArray);
oraStmt1.execute();
rs = (ResultSet)oraStmt1.getObject(1);
// loop through the result set of the ref cursor and display
while (rs.next()) {
System.out.println(rs.getString("sec_grp_id"));
// Close all the resources
rs.close();
ps.close();
stmt.close();
oraStmt1.close();
conn.close();
public static void showResultSet (ResultSet rs)
throws SQLException
int line = 0;
while (rs.next())
line++;
System.out.println("Row "+line+" : ");
ARRAY array = ((OracleResultSet)rs).getARRAY (1);
System.out.println ("Array is of type "+array.getSQLTypeName());
System.out.println ("Array element is of type
code "+array.getBaseType());
System.out.println ("Array is of length "+array.length());
// get Array elements
BigDecimal<> values = (BigDecimal<>) array.getArray();
for (int i=0; i<values.length; i++)
BigDecimal value = (BigDecimal) values;
System.out.println(">> index "+i+" = "+value.intValue());
Similar Messages
-
IN OUT parameters in Stored Procedures
can anybody explain in detail what is in and out parameters in oracle stored procedures.
thanks in advanceIN is used to specify parameters that are input to the stored procedures. OUT is used to specify parameters that can be returned from the stored procedures.
Please don't get confused with procdures returning value.. You don't need to write a return statement.. just assigning the values to OUT parameters is good ebnough to retireve there values outside stored procedures.
Hope it helps. -
ADO Recordsets as IN parameters to stored procs
Is there anyone who knows whether we can pass one (or more)
recordsets to an oracle stored procedure as input parameters.
Since it can be done for OUT parameters, I thought it may be
done with IN too.
If anyone knows the way, or knows that it is not possible, I
would appreciate to hear it
ThanxYep,
I looking for the same.Did you get any joy? -
Omiting parameters for stored procs
Post Author: lihaze
CA Forum: Data Connectivity and SQL
Hi - I hope that this is a straightforward one.. I have a number of params in a shared stored proc (they do default to NULL, but the app that I am using to call Crystal firstly cannot pass in a NULL value(!!!), and also always asks for the same no. of params that are in the creport. So, I am using Crystal 8.5, I dont even want these params to be requested. How can I make sure that they arent requested in Crystal?thanksPost Author: yangster
CA Forum: Data Connectivity and SQL
to actually pass a null value using crystal reports you will have to use crystal 2008as this isn't what you are after the alternative would be to in your report edit the parameter from the stored procedureput in a value, set the default value to that value and change allow custom value to falsethis will push the default value to the parameter every single time the report is run so you will not be prompted for the parameter value anymore -
Is it possible to pass array of strings as input parameters for stored proc
Dear All,
I wrote a Stored Procedure for my crystal report. now i got a modification.
one of the parameters 'profit_center' should be modified so that it is capable to take multiple values.
now when i run report crystal report collects more than one values for parameter profit_center and sends it as input parameter to stored procedure all at a time.
the only way to handle this situation is the input parameter for stored procedure 'profit_center' should be able to take array of values and i have a filter gl.anal_to = '{?profit_center}'. this filter should also be modified to be good for array of values.
Please Help.Or you can use sys.ODCIVarchar2List
SQL> create or replace procedure print_name( In_Array sys.ODCIVarchar2List)
is
begin
for c in ( select * from table(In_Array) )
loop
dbms_output.put_line(c.column_value);
end loop ;
end ;
Procedure created.
SQL>
SQL> exec print_name(sys.ODCIVarchar2List('ALLEN','RICHARD','KING')) ;
ALLEN
RICHARD
KING
PL/SQL procedure successfully completed.SS -
Hello,
I have used ASP w/ many SQL Server stored procs before and many Oracle stored procs with Java before, but I have yet to embark on calling stored procs from Perl.
My current insert has been like this:
my $dbh = DBIConnect->connect;
my $query1;
$query1 = "INSERT into DEFAULT_PROJECT (NAME, EMAIL, LOCATION,PHONE,MGRNAME,MGREMAIL,"
."PROJNAME,PROJ_LOC,SPON_DEPT,SPON_BUS,PROJ_TYPE)
."values (?,?,?,?,?,?,?,?,?,?,?);"But am looking to replicate an equivalent call to an SP. ok, I've created my multi-table insert in SQL Plus, in PL/SQL, and it's just fine, no errors.
Now I need to make the call.
I've seen a few different things, including the use of DBIx like
DBIx::ProcedureCall qw(sysdate);
I've also seen something like
$csr = $dbh->prepare(q{
BEGIN
DEFPROJ_FORM_INSERTION;
END;
$csr->execute;I'm a bit confused having tried to shake down the CPAN board for a while with little luck.
Anyone out there know how that call might look or go, given the supplied parameters and stored proc. name?
I'd assume I'd be assigning the parameterized values much like I am now.
Can any Perl/Oracle users out there shed any light on this?
Thanks!alright, so I could not get that to work, but just to validate the insert statement I tried to alter it from an SP to a normal dynamic insert SQL statement.
I get an Oracle error citing
errERROR: Could not execute SQL! Error: ORA-00911: invalid character (DBD ERROR: OCIStmtExecute)
DBI ERROR: ORA-00911: invalid character (DBD ERROR: OCIStmtExecute),Maybe I'm overlooking something simple. Anyone see anything out of place that pertains to the SQL statement?
I think I have input it in a rather manageable, and easy to read block below:
INSERT ALL
INTO DEFAULT_PROJECT_USER
(DEFPROJ_ID,DEFPROJ_ID_LTR,NAME,EMAIL,LOCATION,PHONE,MGRNAME,MGREMAIL,PROJNAME,PROJ_LOC, SPON_DEPT,SPON_BUS,PROJ_TYPE,REG_LEGAL,NETCRED_LOSS, EXPENSE_REDUC_CKB, STRAT_GOALS,AUDIT_COMPL,REV_GEN,CACS,CUSTOMIT,CUST_IMPACT,CALL_MGT,CALL_TRACK,
CITILINK,DESKTOP,DIALER,DRI,ENGINEER,IMAGING,IPDT,MAINFR,MISC_OTHER,MORTSERV,MORTWEB,NON_MORTSERV,ORIG_PLAT,QUAL_MAP,DATAWARE_REPTS,SERV_APP_VDR,SOUTHBEND,WEB_SVCG,PROBLEM_RESOLVE,EXIST_PROC,BUS_OBJECTIVE,
PENDING_PROJ,IMPACT_AREAS,REGULATORY_COMPLY,COMPLY_DEADLINE,SUB_DATE,EXPENSE_REDUCTION_TEXT,PRIORITY_RATING,ADDL_COMMENTS,PROJ_TYPE_OTHER,OTHER_EXPL_IT)
values (defproj_user_seq.nextval,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,to_date(?,'YYYY-MM-DD HH:MI:SS'),SYSDATE,?,?,?,?,?)
INTO DEFAULT_PROJECT_PROJMGR
(DEFPROJ_ID,PROJ_MGR,STATUS,IT_PROJ_TYPE,IT_PROJNUMBER,FUNC_SPECS,FUNC_SPECS_DT,FUNC_SPECS_APPR_DT,BRD_APPROVED,BRD_APPROVED_DT,UAT_STARTDT,UAT_ENDDT,TESTER,RELEASE_DT, TARGETED_RELEASE_DT,BENEFIT_AMT,BENEFIT_CMTS,IT_LEVEL,IT_HOURS,FTES_SAVED,NUM_FTES,PROJQUE1,PROJQUE2,ACTUALCBA)
VALUES (defproj_user_seq.nextval,NULL, NULL, NULL, NULL,NULL, NULL, NULL, NULL,NULL, NULL, NULL,NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL,NULL, NULL,NULL,NULL)
INTO DEFAULT_PROJECT_QA
(DEFPROJ_ID,TERM,DEFINITION,BUS_NEED,CUST_IMPACT,CONTACT_NAME,IMPACT,IMPACT_PROCESS,IMPACT_DESC,PROCESS_LOC,PROJ_SCHED,PROJ_JUSTIF,IMPL_DATE,PROJ_EXPL,
PROJ_TYPE,PROJ_JUST_MIT,PROJ_OWNER,PROJ_DATE_STATUS)
VALUES (defproj_user_seq.nextval,NULL, NULL, NULL, NULL,NULL, NULL, NULL, NULL,NULL, NULL, NULL, NULL, NULL,NULL, NULL,NULL,NULL)
SELECT object_name AS DEFPROJ_ID_LTR FROM all_objects where rownum <= 1;what could be leading to an invalid character? The error doesn't show which line.
Thanks, but NEVER MIND...I found it - it's stupid perl! As opposed to a good language (Java).
It balks at the extra semicolon, unlike Java would.
Oh, and why am I using Perl you ask? Other than the "yeah, good question response", it's a long story, but suffice to say they don't allow for our UNIX server to be used with Java, just Perl. : (
I do use Java a good amount here, but sometimes we're bound to crap on another planet where it just isn't an option for the server on which we use Java!
Maybe someday! : )
Message was edited by:
user515689 -
Calling stored proc through JDBC
Hello all,
What I am doing is calling a stored proceedure in this manner...
CallableStatement stmt = dbB.getConn().prepareCall ("call LDPKG.LDGetData(?, ?)"); //dbB is a conn Class I made, it works fine and getConn obviously jsut returns teh Connection object... Those work fine disreguard them.
stmt.registerOutParameter(1, <IDONTKNOW>); //I dont know the return type
stmt.registerOutParameter(2, <IDONTKNOW>); //I dont know the return type
stmt.execute();I am unsure of what to put for the return type... The DB has these TYPES created as teh OUT for the stored Proc ...
TYPE t_returnId is table of LDDATA.UserId%TYPE index by BINARY_INTEGER
TYPE t_returnName is table of LDDATA.UserName%TYPE index by BINARY_INTEGER
I dont know how to translate that return type to Java... Any ideas???
Thanks!If you want the whole thing it is like this... I just didnt see the point in being redundant with the output types. Now that Date is an issue I brought it up. didnt think i needed to before.. sorry.
OracleCallableStatement stmt = (OracleCallableStatement)dbB.getConn().prepareCall ("begin LDPKG.LDGetData(?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?); end;");
stmt.registerIndexTableOutParameter(1,500, OracleTypes.NUMBER, 0);
stmt.registerIndexTableOutParameter(2,500, OracleTypes.DATE, 0);
stmt.registerIndexTableOutParameter(3,500, OracleTypes.VARCHAR, 0);
stmt.registerIndexTableOutParameter(4,500, OracleTypes.VARCHAR, 0);
stmt.registerIndexTableOutParameter(5,500, OracleTypes.VARCHAR, 0);
stmt.registerIndexTableOutParameter(6,500, OracleTypes.VARCHAR, 0);
stmt.registerIndexTableOutParameter(7,500, OracleTypes.VARCHAR, 0);
stmt.registerIndexTableOutParameter(8,500, OracleTypes.VARCHAR, 0);
stmt.registerIndexTableOutParameter(9,500, OracleTypes.NUMBER, 0);
stmt.registerIndexTableOutParameter(10,500, OracleTypes.VARCHAR, 0);
stmt.registerIndexTableOutParameter(11,500, OracleTypes.VARCHAR, 0);
stmt.registerIndexTableOutParameter(12,500, OracleTypes.VARCHAR, 0);
stmt.registerIndexTableOutParameter(13,500, OracleTypes.VARCHAR, 0);
stmt.registerIndexTableOutParameter(14,500, OracleTypes.VARCHAR, 0);
stmt.execute();I'm still looking through Google but not finding much about this :(. -
Returning Oracle Output Parameters from Stored Procedures
Hi,
Please forgive my ignorance of Oracle and PL/SQL. I'm trying to get a value out of a stored proc which I've written. The proc takes a username input parameter and returns a user guid through an output parameter. I'm able to print the output parameter to the DBMS Output but can't figure out how to return the thing in a record when calling the proc through a normal sql prompt!
My call is like so:
DECLARE
nGUID NVARCHAR2(255);
BEGIN
GETUSER(nGUID, 'WHY-DEV-QSYS-Tim Watson');
DBMS_OUTPUT.PUT_LINE (nGUID);
Would like to return the value here; what's the syntax?
END;
The signature of the proc is
CREATE OR REPLACE PROCEDURE GETUSER
USERGUID OUT NVARCHAR2,
UNAME IN NVARCHAR2
IS
Can anyone assist?
Thanks in advance!
TimThe easiest way, in my opinion, is to not write a procedure, but a function for this porpose. You would not have to declare an out parameter, but a return value:
CREATE OR REPLACE FUNCTION GETUSER
UNAME IN NVARCHAR2
return nvarchar2
IS
From SQL prompt, you can then do
SQL> select getuser(<input_string>) from dual;
and get the returnvalue.
Best regards,
Gerd -
Clearing Oracle Parameters to call diferent stored procs
Sub Main
Do While i < 3
make_excel(i)
i = i + 1
Loop
end Sub
Sub make_excel(ByVal array As Integer)
objCmd.Parameters.Add(New OracleParameter("p_cursor", OracleType.Cursor)).Direction = ParameterDirection.Output
end Sub
objCmd.Parameters.Clear()
objCmd.Parameters.Remove("p_cursor")I agree with you. I was looking into mod_plsql, but it turns out that their development standards include not using Oracle HTTP server. The whole reason why they want to be able to execute a stored proc based on what is specified in an XML doc is that they want to avoid having to change their middle-tier configurations anytime a new stored proc or a change in stored proc parameters is made. I'm not familiar with what all is involved with .NET and the middle-tier, but supposedly this way, they can specify any stored procedure name and its parameters in an XML file. The XML is then suppose to be passed on to an Oracle stored procedure which will parse the XML and dynamically execute the stored procedure that was specified in the XML.
Here is an example of the XML:
'<Root>
<PackageName>TEST_PKG</PackageName>
<ProcedureName>TEST_PROC</ProcedureName>
<Parameters>
<Parameter>
<Name>EmpID</Name>
<Value>12345</Value>
</Parameter>
<Parameter>
<Name>Org</Name>
<Value>ABC</Value>
</Parameter>
</Parameters>
</Root>I basically need to parse out the pkg/proc names:
SELECT t.COLUMN_VALUE.extract('//PackageName/text()').getstringval() PkgName,
t.COLUMN_VALUE.extract('//ProcedureName/text()').getstringval() ProcName
INTO v_pkg_name, v_proc_name
FROM TABLE(xmlsequence(XMLTYPE(v_XML_input) .extract('/Root'))) t;...and then execute the procedure:
EXECUTE IMMEDIATE 'BEGIN '||v_pkg_name||'.'||v_proc_name||'(:a, :b, :c); END;'
using in v_in_param1, v_in_param2, out v_XML_output;The problem is that this approach is very complicated since there can be any number of IN/OUT parameters and of various datatypes. I would have to create all kinds of possible bind variables! -
Output parameters for sqlj stored procs ?
is it possible to store a sqlj proc in DB which can be translated to a pl/sql procs with OUTPUT parameters ?
how is it possible ?
if not, how can i bypass this problem ?
thanks for answers..
[email protected]When you write a Java stored procedure that is called with OUT or IN OUT parameteres from the PL/SQL signature, then the OUT or IN OUT arguments must have an array signature in Java.
For example, if you want to pass a Java int IN OUT from a Java method, then the method accepts an int[]. The first element (at index 0) holds the input value, and the same element must be set for the returned output value.
Is this what you were wondering about? -
How to get multiple out parameters from a pl/sql stored procedure in ADF Jdeveloper 11g release2
I´m trying to call from AppModuleImpl a stored procedure from my oracle DB which receives one input parameter and returns 5 out parameters.
I´m using jdeveloper 11g release2 ADF and I have created a java bean "ProRecallPlatesBean " with the atributes and accesors and I serialize it. just like in this article http://docs.oracle.com/cd/E24382_01/web.1112/e16182/bcadvgen.htm#sm0297
This is my code so far:
public ProRecallPlatesBean getCallProRecallPlates(String numPlates) {
CallableStatement st = null;
try {
// 1. Define the PL/SQL block for the statement to invoke
String stmt = "begin CTS.Pk_PreIn.proRecallPlates(?,?,?,?,?,?); end;";
// 2. Create the CallableStatement for the PL/SQL block
st = getDBTransaction().createCallableStatement(stmt,0);
// 3. Register the positions and types of the OUT parameters
st.registerOutParameter(2,Types.VARCHAR);
st.registerOutParameter(3,Types.VARCHAR);
st.registerOutParameter(4,Types.VARCHAR);
st.registerOutParameter(5,Types.VARCHAR);
st.registerOutParameter(6,Types.VARCHAR);
// 4. Set the bind values of the IN parameters
st.setString(1,numPlates);
// 5. Execute the statement
st.executeUpdate();
// 6. Create a bean to hold the multiple return values
ProRecallPlatesBean result = new ProRecallPlatesBean();
// 7. Set values of properties using OUT params
result.setSpfVal(st.getString(2));
result.setTransportTypeVal(st.getString(3));
result.setTransportCompanyVal(st.getString(4));
result.setCompanyDescrVal(st.getString(5));
result.setDGAPrint(st.getString(6));
// 8. Return the result
return result;
} catch (SQLException e) {
throw new JboException(e);
} finally {
if (st != null) {
try {
// 9. Close the JDBC CallableStatement
st.close();
catch (SQLException e) {}
In Jdeveloper I went into AppModule.xml JAVA>Client Interface section and expose "getCallProRecallPlates" Then I can see "getCallProRecallPlates" in Data Controls, I drag and drop it to a JSF page, an input text component and a button are generated in order to put in there the procedure input parameter (numPlates).
I don't know if I'm on the right track.
When I click the button, the "result" variable is supposed to be filled with data from the stored procedure. I want each of those values to be displayed in Output text or input text adf components but I dont know how. Thank you very much in advance I´m a newbie and i'll appreciate your help!What version are you on?
Works fine for me on my 11g:
SQL> create or replace procedure testxml (clob_out out clob)
2 is
3 l_clob clob;
4 l_ctx dbms_xmlquery.ctxhandle;
5 begin
6 l_ctx := dbms_xmlquery.newcontext ('select * from dual');
7 l_clob := dbms_xmlquery.getxml (l_ctx);
8 clob_out := l_clob;
9 dbms_xmlquery.closecontext (l_ctx);
10 end testxml;
11 /
Procedure created.
SQL>
SQL> variable vout clob;
SQL>
SQL> exec testxml (:vout)
PL/SQL procedure successfully completed.
SQL>
SQL> print vout
VOUT
<?xml version = '1.0'?>
<ROWSET>
<ROW num="1">
<DUMMY>X</DUMMY>
</ROW>
</ROWSET>But definitely you can optimize your proc a bit: Try
create or replace procedure testxml (clob_out in out nocopy clob)
is
l_ctx dbms_xmlquery.ctxhandle;
begin
l_ctx := dbms_xmlquery.newcontext ('select * from dual');
clob_out := dbms_xmlquery.getxml (l_ctx);
dbms_xmlquery.closecontext (l_ctx);
end testxml;
/ -
Crystal crashes when add new parameters to a stored proc in a subreport
This one has been driving me nuts so any help much appreciated...
I have a stored procedure (Oracle 9i) that is used as the datasource for a subreport (needs to be in the subreport as I need to pass multi-value parameters to the proc - something I've done in numerous other procs/reports). All of the parameters from the proc are linked to data/parameters on the main report.
The report works fine at the moment.
I need to add three new parameters to the proc with an If statement on each one to run various bits of code depending on what is passed in. This is where the trouble starts.
The proc works.
If I create a main report based on the new proc, it works.
If I create a subreport based on the proc and DON'T link it to the main report, it works.
If I create a subreport based on the proc and DO link it to the main report, Crystal crashes with no explanation (just that painful error that apologies for the inconvenience). It is not all the parameters that cause this problem - it's not even restricted to just the new parameters or even just to ones that are used in the IF statements.
This is not the first proc to do this to me - just the first one where the new functionality was too critical to strip out for now.
I have been trawling the net and trying all sorts of things for days so I am hoping someone out there has a suggestion!
Versions: Oracle 9i, Crystal Reports 11.0.0.1994Hi Daniel,
Starting from the basics, after you've inserted the subreport don't link it yet. Edit the subreport and verify the database. Once it's verified, try linking the reports and adding a parameter.
Verify the linking you are using. I've seen where the field from the main report was passing invalid or coruupted data and caused the subreport to die a horrifying death.
Good luck,
Brian -
. NET to call Oracle stored procedure, use an array of types of parameters
. NET to call Oracle stored procedure, use an array of types of parameters
Step1:(In the Oracle database define an array of types)
CREATE OR REPLACE TYPE STRING_VARRAY AS VARRAY (1000) OF NVARCHAR2(255)
Step2:
CREATE OR REPLACE PROCEDURE Test
(i_test in string_varray,o_result out int)
IS
BEGIN
o_result:=i_test.count;
EXCEPTION
WHEN NO_DATA_FOUND
THEN
NULL;
WHEN OTHERS
THEN
o_result:=0;
END arraytest;
Step3:
Use System.Data.OracleClient
C# Code:
OracleConnection conn = new OracleConnection("User Id=test;Password=test;Data Source=test");
OracleCommand cmd = new OracleCommand("Test", conn);
cmd.CommandType = CommandType.StoredProcedure;
string[] str = new string[] { "11", "22" };
OracleParameter p1 = new OracleParameter("i_test", OracleType.NVarChar);
p1.Direction = ParameterDirection.Input;
p1.Value = str;
cmd.Parameters.Add(p1);
OracleParameter p2 = new OracleParameter("o_result", OracleType.Int32);
p2.Direction = ParameterDirection.Output;
cmd.Parameters.Add(p2);
int i = 0;
try
conn.Open();
cmd.ExecuteNonQuery();
i =(int) p2.Value;
catch (Exception ex)
finally
conn.Close();
Error:
Execution Failed:ORA-06550:Line 1,Column 7:
PLS-00306:Test parameters when calling the number or types of errors
ORA-06550:Line 1,Column 7:
PL/SQL:Statement ignored
Edited by: user10133982 on Jun 4, 2009 7:13 AM. NET to call Oracle stored procedure, use an array of types of parameters
The use of ODP.net(Oracle 10g), the error is still the same
Step1:(In the Oracle database define an array of types)
CREATE OR REPLACE TYPE STRING_VARRAY AS VARRAY (1000) OF NVARCHAR2(255)
Step2:
CREATE OR REPLACE PROCEDURE Test
(i_test in string_varray,o_result out int)
IS
BEGIN
o_result:=i_test.count;
EXCEPTION
WHEN NO_DATA_FOUND
THEN
NULL;
WHEN OTHERS
THEN
o_result:=0;
END arraytest;
Step3:
ODP.NET(Oracle 10g)
OracleConnection conn = new OracleConnection("User Id=test;Password=test;Data Source=test");
OracleCommand cmd = new OracleCommand("Test", conn);
cmd.CommandType = CommandType.StoredProcedure;
string[] str = new string[2] { "11", "222" };
cmd.ArrayBindCount=2;
OracleParameter p1 = new OracleParameter("i_test", OracleDbType.NVarChar);
p1.Direction = ParameterDirection.Input;
p1.CollectionType = OracleCollectionType.PLSQLAssociativeArray;
p1.Value = str;
p1.ArrayBindSize=new int[2]{2,3};
p1.ArrayBindStatus = new OracleParameterStatus[2]{
OracleParameterStatus.Success,
OracleParameterStatus.Success
cmd.Parameters.Add(p1);
OracleParameter p2 = new OracleParameter("o_result", OracleDbType.Int32);
p2.Direction = ParameterDirection.Output;
P2.CollectionType = OracleCollectionType.PLSQLAssociativeArray;
p2.Value=0;
cmd.Parameters.Add(p2);
int i = 0;
try
conn.Open();
cmd.ExecuteNonQuery();
i =(int) p2.Value;
catch (Exception ex)
finally
conn.Close();
Error:
Execution Failed:ORA-06550:Line 1,Column 7:
PLS-00306:Test parameters when calling the number or types of errors
ORA-06550:Line 1,Column 7:
PL/SQL:Statement ignored
Edited by: user10133982 on Jun 5, 2009 7:48 AM -
Passing array args into stored procs
Hi,
we are trying to use TopLink to perform the mapping of a pretty large schema (200+ tables). For the purpose UI presentation we only need a few different view types, not the full information in the schema, so we want to provide specific "view objects" mapped to the DB that can be batch read by their ids.
Defining views in the DB and mapping these to objects with TopLink doesn't work well because the views require joins and the tables are pretty large (the WHERE IN on the ids of the rows to read from the view is only applied after the entire view is instantiated).
Alternatively, we are trying to use stored procedures that take a VARRAY or TABLE OF INTEGER as input arg and return respective cursors. However, we couldn't figure out how to pass array infos into a stored proc using TopLink. Any suggestions?
Thx,
OlafI believe when you're doing it with an insert, you're saying "execute this insert statement a bunch of times, here's all the values in advance", which is different than passing an array to a stored procedure where you want it to execute once.
Oracle's ODBC driver doesnt support Associative Arrays (aka index-by tables).
Hope it helps,
Greg -
I have a stored proc that is defined as
CREATE or REPLACE
PROCEDURE ABC
(linkid IN CHAR,
Year_in IN DATE,
Method_in IN CHAR,
Date_out OUT DATE,
average_out OUT NUMBER)
is
begin
end;
another partially completed stored proc that returns a ref
cursor defined as follows:
create or replace package zzz
as
type cursorType is ref cursor;
end;
create or replace function test return zzz.cursortype
as
date_OUT date;
Average_OUT number;
l_cursor zzz.cursorType;
CURSOR temp_cur is
SELECT l.linkid, L.routenumber, ABC(l.linkid,
to_date('01/01/2000', 'mm/dd/yyyy'),
'2',
date_OUT,
average_OUT)
FROM LINK l
WHERE l.LINKID <= '010999';
begin
open temp_cur;
end;
inside test (which I need help completing), how can I refer to
the date_out and the average_out params returned by ABC() so
that these values are in turn passed to the cursortype defined
in package zzz?
Thanks in advance.Try rewriting your abc proceudre as two functions, abc1 and
abc2, and rewriting your test function as a test procedure. See
if you can fill in the blanks prefaced by hyphens -- in the
following code:
CREATE OR REPLACE FUNCTION abc1
(linkid IN CHAR,
year_in IN DATE,
method_in IN CHAR)
RETURN DATE
IS
date_out DATE;
BEGIN
SELECT --
INTO date_out
FROM --
WHERE --;
--or
date_out := --;
RETURN date_out;
END abc1;
CREATE OR REPLACE FUNCTION abc2
(linkid IN CHAR,
year_in IN DATE,
method_in IN CHAR)
RETURN NUMBER
IS
average_out NUMBER;
BEGIN
SELECT AVG (--)
INTO average_out
FROM --
WHERE --
GROUP BY --;
--or
average_out := --;
RETURN average_out;
END abc2;
CREATE OR REPLACE PACKAGE zzz
AS
TYPE cursortype IS REF CURSOR;
PROCEDURE test
(temp_cur OUT cursortype);
END zzz;
CREATE OR REPLACE PACKAGE BODY zzz
AS
PROCEDURE test
(temp_cur OUT cursortype)
IS
BEGIN
OPEN temp_cur
FOR
SELECT l.linkid,
l.routenumber,
abc1 (l.linkid,
TO_DATE ('01/01/2000', 'mm/dd/yyyy'),
'2'),
abc2 (l.linkid,
TO_DATE ('01/01/2000', 'mm/dd/yyyy'),
'2')
FROM link l
WHERE l.linkid <= '010999';
END test;
END zzz;
SQL> VARIABLE g_ref REFCURSOR;
SQL> EXEC zzz.test (:g_ref);
SQL> PRINT g_ref
Maybe you are looking for
-
I can no longer open a standard pdf file-help
Before Lion, I just clicked on the file icon and it opened in Acrobat. Now (using Lion) when I try to open a pdf file, it asks me what program I want to use to open it. I get the circle with a slash icon over the Acrobat icon, and nothing seems to
-
So this has been a problem in Mac history and has come up on my computer after installing OS X Mountain Lion. When trying to download a application from the App Store it gives this error message. It does not matter what the application is or how long
-
Sometimes I have tabs open that I only need for a short time and I don't want to bookmark them. I want my windows & tabs restored as the were and I can't get this by simply restoring session after I've had to close Firefox for an update of something
-
Automatic character tracking in Illustrator CS4
Hi all, based on [1], it looks like there is no solution but I want to make sure. Let's say I have to lines as follows: author long title where "author" is in a 20 pt Arial font and "long title" in a 10 pt Minion font. Is there an automatic character
-
Adding an existing webspage to own site
This one's bit difficult to describe so bear with me! The website I look after (call it site A) is looking to have the page of another website (site B) appear within it (the other one has numerous RSS feeds on it which appear with a brief summary). A