Output Array Binding

I am looking for an example of output array binding (equivalent to BULK COLLECT). The input sample code is very good, but the documentation talks about output binding as well, but there are no examples.
If anyone has a short example that shows how to set up the bind variables, I would very much appreciate it.

Hi,
From
http://download-west.oracle.com/docs/cd/B19306_01/win.102/b14307/featOraCommand.htm#BABBDHBB
<snippet>
// execute the cmd
cmd.ExecuteNonQuery();
//print out the parameter's values
Console.WriteLine("parameter values after executing the PL/SQL block");
for (int i = 0; i < 3; i++)
Console.WriteLine("Param2[{0}] = {1} ", i,
(cmd.Parameters[1].Value as Array).GetValue(i));
for (int i = 0; i < 3; i++)
Console.WriteLine("Param3[{0}] = {1} ", i,
(cmd.Parameters[2].Value as Array).GetValue(i));
</snippet>
Cheers,
Greg

Similar Messages

  • Exception Handling for Array Binding

    Hi
    1)
    I am using a Stored Procedure.
    I am using array binding and if i am sending an array of count 10 to be inserted in a table and only 9 got inserted,i deliberatly inserted one errorneous record in array, the count returned by ExecuteNonQuery() is 10.Why ?
    How can i come to know exact number of rows inserted in table, how can i use Output variables, because the array bind count is 10 so if i add an output parameter it gives error ArrayBind count is wrong....
    2)
    Is it possible to roll back all the inserts if error occurs in any of the insert by Oracle engine.What it does is it inserts all correct records and leaves the errorneous record and doesn't even throw any exception or any message.
    Answer - This can be achieved by using OracleTransaction and don't use Exception handling in procedure otherwise there wont be any exception thrown by procedure which is necessary to detect if an error occured during insert.If you use exception handling OracleEngine will insert correct rows and leave errorneous record and return count of inserted + non inserted records which is wrong.
    Please help.
    Message was edited by:
    user556446
    Message was edited by:
    user556446

    You'll need to encapsulate your validation within it's own block as described below:
    -- this will die on the first exception
    declare
      TYPE T_BADDATA_TEST IS TABLE OF VARCHAR2(1000) INDEX BY binary_integer ;
      tbt T_BADDATA_TEST ;
      aBadTypeFound exception ;
    begin
       tbt(0) := 'a';
       tbt(1) := 'b';
       tbt(2) := 'c';
        for idx in tbt.first..tbt.last loop
          if tbt(idx) =  'b' then
              raise aBadTypeFound ;     
          else
              dbms_output.put_line(tbt(idx));     
          end if  ;
        end loop ;
    end ;--encapsulate the exception area in a begin/end block to handle the exception but continue on
    declare
      TYPE T_BADDATA_TEST IS TABLE OF VARCHAR2(1000) INDEX BY binary_integer ;
      tbt T_BADDATA_TEST ;
      aBadTypeFound exception ;
    begin
       tbt(0) := 'a';
       tbt(1) := 'b';
       tbt(2) := 'c';
        for idx in tbt.first..tbt.last loop
          BEGIN
          if tbt(idx) =  'b' then
              raise aBadTypeFound ;     
          else
              dbms_output.put_line(tbt(idx));     
          end if  ;
          EXCEPTION
            WHEN aBadTypeFound THEN
                dbms_output.put_line(tbt(idx) || ' is bad data');       
            WHEN OTHERS THEN
                dbms_output.put_line('exception');       
          END ;
        end loop ;
    end ;
    output:
    a
    b is bad data
    c
    ***/

  • Reg: PLS-00418: array bind type must match PL/SQL table row type error

    I am trying to access a table of records through JDBC OracleCallableStatement. I am able to do it fine for all mappings except for the ones below
    TYPE CAT_CD_TYPE IS TABLE OF A.B %TYPE INDEX BY BINARY_INTEGER;
    TYPE ORG_CD_TYPE IS TABLE OF C.D %TYPE INDEX BY BINARY_INTEGER;
    Column B is CHAR(1) and Column D is CHAR(2). I am trying to register the out parameters of Oraclecallablestatement as
    cstmt.registerIndexTableOutParameter(2, 2000, OracleTypes.CHAR, 0);
    cstmt.registerIndexTableOutParameter(3, 2000, OracleTypes.CHAR, 0);
    All the other mappings work fine. These two fail with the error
    SQLException in invokeDBPackage() : ORA-06550: line 1, column 32:
    PLS-00418: array bind type must match PL/SQL table row type
    ORA-06550: line 1, column 35:
    PLS-00418: array bind type must match PL/SQL table row type
    ORA-06550: line 1, column 7:
    PL/SQL: Statement ignored
    I tried other OracleTypes mappings too but no luck so far.
    Any advice on this would be greatly appreciated.

    Hi,
    I'm not sure it's reasonable to expect someone to sift through that much stuff.
    Which parameter is it having a problem with?
    Can you modify the following to reproduce the behavior?
    Thanks
    Greg
    create package mypack5 as
    TYPE v2array is table of emp.ename%type index by BINARY_INTEGER;
    PROCEDURE test_it(thearray IN v2array, numrecs out number);
    END;
    CREATE or replace PACKAGE BODY MYPACK5 AS
    PROCEDURE test_it(thearray IN v2array, numrecs out number)
    IS
    begin
    numrecs := thearray.count;
    END;
    END;
    using System;
    using System.Data;
    using Oracle.DataAccess.Client;
    public class indexby
    public static void Main()
    OracleConnection con = new OracleConnection("data source=orcl;user id=scott;password=tiger;");
    con.Open();
    OracleCommand cmd = new OracleCommand("mypack5.test_it", con);
    cmd.CommandType = CommandType.StoredProcedure;
    OracleParameter Param1 = cmd.Parameters.Add("param1", OracleDbType.Varchar2);
    Param1.Direction = ParameterDirection.Input;
    Param1.CollectionType = OracleCollectionType.PLSQLAssociativeArray;
    Param1.Size = 3;
    string[] vals = { "foo", "bar", "baz" };
    Param1.Value = vals;
    OracleParameter Param2 = cmd.Parameters.Add("param2", OracleDbType.Int32, DBNull.Value, ParameterDirection.Output);
    cmd.ExecuteNonQuery();
    Console.WriteLine("{0} records passed in", Param2.Value);
    con.Close();
    }

  • PLS-00418: array bind type must match PL/SQL table row type

    If a PL/SQL table is indexed by CHAR and is a parameter
    in a Stored Program, we are not able to call the stored
    program from the Java code.
    We get the following error code.
    java.sql.SQLException: ORA-06550: line 1, column 62:
    PLS-00418: array bind type must match PL/SQL table row type
    ORA-06550: line 1, column 7:
    PL/SQL: Statement ignored
    But if we change the CHAR into VARCHAR2 then it works.
    We are using Oracle9i Enterprise Edition Release 9.2.0.5.0 -64bit Production ,
    JServer Release 9.2.0.5.0 - Production
    and JDK1.4.
    Thanks
    Push..

    Hi,
    I'm not sure it's reasonable to expect someone to sift through that much stuff.
    Which parameter is it having a problem with?
    Can you modify the following to reproduce the behavior?
    Thanks
    Greg
    create package mypack5 as
    TYPE v2array is table of emp.ename%type index by BINARY_INTEGER;
    PROCEDURE test_it(thearray IN v2array, numrecs out number);
    END;
    CREATE or replace PACKAGE BODY MYPACK5 AS
    PROCEDURE test_it(thearray IN v2array, numrecs out number)
    IS
    begin
    numrecs := thearray.count;
    END;
    END;
    using System;
    using System.Data;
    using Oracle.DataAccess.Client;
    public class indexby
    public static void Main()
    OracleConnection con = new OracleConnection("data source=orcl;user id=scott;password=tiger;");
    con.Open();
    OracleCommand cmd = new OracleCommand("mypack5.test_it", con);
    cmd.CommandType = CommandType.StoredProcedure;
    OracleParameter Param1 = cmd.Parameters.Add("param1", OracleDbType.Varchar2);
    Param1.Direction = ParameterDirection.Input;
    Param1.CollectionType = OracleCollectionType.PLSQLAssociativeArray;
    Param1.Size = 3;
    string[] vals = { "foo", "bar", "baz" };
    Param1.Value = vals;
    OracleParameter Param2 = cmd.Parameters.Add("param2", OracleDbType.Int32, DBNull.Value, ParameterDirection.Output);
    cmd.ExecuteNonQuery();
    Console.WriteLine("{0} records passed in", Param2.Value);
    con.Close();
    }

  • Array Bind: nbr of updated rows?

    Hello,
    when using array binding with UPDATE statements, how to look up the number of updated rows?
    I couldn't find any parameter property such as ArrayBindAffectedRows.
    Is it possible to use array bind with SQL statements which return values, e.g.:
    UPDATE emp SET salary = salary + :increase
    WHERE mgr = :mgrNo
    RETURNING salary INTO :newSalary;
    Hm, arrays :increase and :newSalary might have different lengths.
    Thanks,
    Armin

    Ok this is genuinly tricky.
    The only way I can think of to get this is to use FORALL and BULK COLLECT. This does an array-bound insert from PL/SQL. But you need to pass Associative Arrays from ODP.NET to PL/SQL to get this started.
    Any other solution I could think of would require running some PL/SQL code for each update statement, for instance in a trigger. But avoiding the context switches from PL/SQL to SQL is a main reason to use array binding in the first place.
    Here's a complete sample program:
    I used inline PL/SQL for compactness, but you might want to save the block as a procedure.
    using System;
    using System.Data;
    using Oracle.DataAccess.Client;
    using Oracle.DataAccess.Types;
         public class Test
          static OracleConnection connect()
            string constr = "data source=oracle;user id=scott;password=tiger";
            OracleConnection con = new OracleConnection(constr);
            con.Open();
            return con;
        const string sql = @"
    declare
      type NumTable is table of Number index by binary_integer;
      l_managers NumTable := :mgr;
      l_increase NumTable := :inc;
      l_newSals NumTable;
      l_records int;
    begin
      forall idx in l_managers.first .. l_managers.last
        update emp
        SET
        sal = sal + l_increase(idx)
        WHERE mgr = l_managers(idx)
        RETURNING sal BULK COLLECT INTO l_newSals;
      :records_affected := l_newSals.count;
    end;
        [STAThread]
        static void Main(string[] args)
          try
            using (OracleConnection con = connect())
              string cr = new String(new char[] {(char)13});
              OracleCommand cmd = new OracleCommand(sql.Replace(cr,""),con);
              OracleDecimal[] increases = new OracleDecimal[] {10,20,30};
              int[] managers = new int[] { 7698,7839,7782};
             OracleParameter pMgr = cmd.Parameters.Add("manager",
                 OracleDbType.Int32,
                 ParameterDirection.Input);
              pMgr.CollectionType = OracleCollectionType.PLSQLAssociativeArray;
              pMgr.Size = managers.Length;
              pMgr.Value = managers;
              OracleParameter pInc = cmd.Parameters.Add("increase",
                 OracleDbType.Decimal,
                 ParameterDirection.Input);
              pInc.CollectionType = OracleCollectionType.PLSQLAssociativeArray;
              pInc.Size = increases.Length;
              pInc.Value = increases;
              OracleParameter pRecs = cmd.Parameters.Add("records",
                 OracleDbType.Int32 ,
                 ParameterDirection.Output);
              pRecs.CollectionType = OracleCollectionType.None;
              cmd.ExecuteNonQuery();
              int recs = (int)pRecs.Value;
              Console.WriteLine("{0} records affected",recs );
          catch (Exception ex)
            Console.WriteLine(ex);
    }

  • Associative  array binding - poor performance

    Dear All
    i have very very low performence when i am inserting a binary array using associative array bind. i mean when i insert huge jagged binary array.
    the jagged array has
    BinarryArray[0][0]........BinarryArray[0][8000]
    BinarryArray[1][0]........BinarryArray[1][8000]
    BinarryArray[3600][0]........BinarryArray[3600][8000]
    BinarryArray[0] - i have 8000 byte end so on. total is 3600 X 8000
    that means 28,800KB hence to ~28MB.
    the C# code is as follows
    string strInsert "Insert Into T Values(t.SEQUENCE.currval, :paramArr);
    OracleCommand objCommand = new OracleCommand;
    OracleParameter objParam = new OracleParameter(paramArr, OracleDbtype.blob, 8000, system.data.ParameterDirection.Input,true,0,0,"ColumnName", system.data.DataRowVersion.Curren, BinarryArray);
    objCommandtext = strInsert;
    objCommand.ArrayBindCount = BinarryArray.Length;
    objCommand.Parameters.Clear();
    objCommand.Parameters.Add(paramArr);
    objCommand.ExecuteNonQuery();
    In generall the Insertion is good for each row in the array i get separate row in the DB but it works so slow.
    why??????
    see the code below

    well??

  • User Defined Type - Array bind Query very slow

    Hi.
    I have following Problem. I try to use Oracle Instant Client 11 and ODP.NET to pass Arrays in SELECT statements as Bind Parameters. I did it, but it runs very-very slow. Example:
    - Inittial Query:
    SELECT tbl1.field1, tbl1.field2, tbl2.field1, tbl2.field2 ... FROM tbl1
    LEFT JOIN tbl2 ON tbl1.field11=tbl2.field0
    LEFT JOIN tbl3 ON tbl2.field11=tbl3.field0 AND tbll1.field5=tbl3.field1
    ...and another LEFT JOINS
    WHERE
    tbl1.field0 IN ('id01', 'id02', 'id03'...)
    this query with 100 elements in "IN" on my database takes 3 seconds.
    - Query with Array bind:
    in Oracle I did UDT: create or replace type myschema.mytype as table of varchar2(1000)
    than, as described in Oracle Example I did few classes (Factory and implementing IOracleCustomType) and use it in Query,
    instead of IN ('id01', 'id02', 'id03'...) I have tbl1.field0 IN (select column_value from table(:prmTable)), and :prmTable is bound array.
    this query takes 190 seconds!!! Why? I works, but the HDD of Oracle server works very hard, and it takes too long.
    Oracle server we habe 10g.
    PS: I tried to use only 5 elements in array - the same result, it takes also 190 seconds...
    Please help!

    I recommend you generate an explain plan for each query and post them here. Based on what you have given the following MAY be happening:
    Your first query has as static IN list when it is submitted to the server. Therefore when Oracle generates the execution plan the CBO can accurately determine it based on a KNOWN set of input parameters. However the second query has a bind variable for this list of parameters and Oracle has no way of knowing at the time the execution plan is generated what that list contains. If it does not know what the list contains it cannot generate the most optimal execution plan. Therefore I would guess that it is probably doing some sort of full table scan (although these aren't always bad, remember that!).
    Again please post the execution plans for each.
    HTH!

  • Support for Array Binding and PL/SQL tables (IN, INOUT, or OUT)

    I have attempted, unsuccessfully, to use array binding in stored procedure/function calls where the sp/sf has parameters that are PL/SQL tables. I have seen the topic floating around in this forum, but I have not seen the explicit questions:
    - Does ODP.NET support PL/SQL tables as IN, INOUT or OUT parameters to stored procedures/functions?
    - Will any planned ODP.NET release support PL/SQL tables as IN, INOUT or OUT parameters to stored procedures/functions?
    I am aware that I can use REF CURSORS to handle the OUT situation, but I need to make a design decision concerning supporting parameters of IN and INOUT PL/SQL tables.
    Thanks.
    James

    You really MUST do this!! - i.e. include support for PL/SQL table parameters (IN INOUT and OUT) in a future release of ODP.NET.
    PL/SQL tables are a fundamental type in Oracle stored procedures and you will be preventing a huge number of existing projects from migrating to .NET if you don't acknowledge them as part and parcel of Oracle programming.
    I sincerely hope support for PL/SQL table parameters is treated as a serious issue.
    Think what a coup it would be for you over Microsoft (who don't currently support PL/SQL tables with their .NET native provider for Oracle and don't look as if they will at least in the short term)!
    Please, please, please!

  • Using array binding to perform multiple rowupdates in one pass

    For the first time I am attempting to use array binding in VB.NET to update multiple rows via a single execution of a stored procedure. My subroutine is:
    Friend Sub UpdateSolutionStatusUsingArrays(ByVal intNumBeingUpdated As Integer, ByVal arrScenarioID() As Integer, ByVal arrSolutionID() As Integer, ByVal arrInOrOut() As Integer, ByVal arrTimePeriod() As Integer)
    Try
    'Set up the Command object
    Dim cmdUpdateSolutionStatus As OracleCommand
    cmdUpdateSolutionStatus = New OracleCommand
    cmdUpdateSolutionStatus.CommandType = CommandType.StoredProcedure
    cmdUpdateSolutionStatus.CommandText = "ProcUpdateSolutionStatus"
    cmdUpdateSolutionStatus.Connection = cnnORACLE
    cmdUpdateSolutionStatus.ArrayBindCount = intNumBeingUpdated - 1
    cmdUpdateSolutionStatus.CommandTimeout = CInt(tblOptions.Rows(intDatabaseIndex).Item("ConnectionTimeout"))
    'Add ScenarioID array as parameter
    Dim p_ScenarioID As New OracleParameter("ScenarioID", OracleDbType.Int32)
    p_ScenarioID.Direction = ParameterDirection.Input
    p_ScenarioID.Value = arrScenarioID
    cmdUpdateSolutionStatus.Parameters.Add(p_ScenarioID)
    'Add SolutionID array as parameter
    Dim p_SolutionID As New OracleParameter("SolutionID", OracleDbType.Int32)
    p_SolutionID.Direction = ParameterDirection.Input
    p_SolutionID.Value = arrSolutionID
    cmdUpdateSolutionStatus.Parameters.Add(p_SolutionID)
    'Add InOrOut array as parameter
    Dim p_InOrOut As New OracleParameter("InOrOut", OracleDbType.Int32)
    p_InOrOut.Direction = ParameterDirection.Input
    p_InOrOut.Value = arrInOrOut
    cmdUpdateSolutionStatus.Parameters.Add(p_InOrOut)
    'Add TimePeriod array as parameter
    Dim p_TimePeriod As New OracleParameter("TimePeriod", OracleDbType.Int32)
    p_TimePeriod.Direction = ParameterDirection.Input
    p_TimePeriod.Value = arrTimePeriod
    cmdUpdateSolutionStatus.Parameters.Add(p_TimePeriod)
    'Open connection
    cnnORACLE.Open()
    'Run stored procedure
    cmdUpdateSolutionStatus.ExecuteNonQuery()
    'Tidy up
    cmdUpdateSolutionStatus = Nothing
    cnnORACLE.Close()
    Catch ex As Exception
    WriteLog("Subroutine UpdateSolutionStatusUsingArrays:" & ex.Message.ToString)
    strState = "Error"
    'Update Run Status to show error has occurred
    cnnORACLE.Close()
    UpdateRunStatusORACLE(7)
    End Try
    End Sub
    When the routine tries to run cmdUpdateSolutionStatus.ExecuteNonQuery() I get the error message:
    Unable to cast object of type 'System.Int32[]' to type 'System.IConvertible'.
    I have tried all sorts of variants of the code but with no success. The arrays are being set up correctly. Anyoneone know what I'm missing?
    Stewart

    Try declaring the arrays as OracleNumber datatype instead of Integer. I've had this issue before, and I believe this is what I did to solve the problem.

  • Insert SDO_GEOMETRY using array binding

    Hi,
    does anyone know howto insert the elem_info array and the ordinates array of a SDO_GEOMETRY object using array binding and ODP or if there is a way to insert the SDO_GEOMETRY object using the same technique.
    /Anders

    The current releases of ODP.NET do not support object types, hence no "proper" SDO_GEOMETRY support. You can retrieve the data as an XML-type as illustrated here:
    Re: ODP.Net + Spatial
    I know of no way to insert an SDO_GEOMETRY object using array binding at this time.
    If someone else has a solution, please do post!
    - Mark

  • Procedure Array Binding a Null Value

    Can you perform array binding in ODP.NET (to a procedure for example that inserts values) and assume that if there are null values in the array that the records inserted will have the corresponding null values in their records?

    Here's a quick sample using pl/sql associative arrays to insert null values into a table (I think this is what you mean)...
    SQL*Plus: Release 10.1.0.3.0 - Production on Fri Feb 18 09:38:55 2005
    Copyright (c) 1982, 2004, Oracle.  All rights reserved.
    SQL> connect /
    Connected.
    SQL> create table null_array_insert
      2  (
      3    first_name  varchar2(32) not null,
      4    middle_name varchar2(32) null,
      5    last_name   varchar2(32) not null
      6  );
    Table created.
    SQL> create or replace package null_array_test as
      2    -- create a type for each column
      3    type t_first_name is table of null_array_insert.first_name%type
      4      index by binary_integer;
      5
      6    type t_middle_name is table of null_array_insert.middle_name%type
      7      index by binary_integer;
      8
      9    type t_last_name is table of null_array_insert.last_name%type
    10      index by binary_integer;
    11
    12    -- the procedures that will perform our work
    13    procedure bulk_insert (p_first_name  in t_first_name,
    14                           p_middle_name in t_middle_name,
    15                           p_last_name   in t_last_name);
    16  end null_array_test;
    17  /
    Package created.
    SQL> create or replace package body null_array_test as
      2    procedure bulk_insert (p_first_name  in t_first_name,
      3                           p_middle_name in t_middle_name,
      4                           p_last_name   in t_last_name) is
      5    begin
      6      forall i in p_first_name.first..p_first_name.last
      7      insert into null_array_insert (first_name,
      8                                     middle_name,
      9                                     last_name)
    10                          values    (p_first_name(i),
    11                                     p_middle_name(i),
    12                                     p_last_name(i));
    13    end bulk_insert;
    14  end null_array_test;
    15  /
    Package body created.
    Here's the C# code:
    using System;
    using System.Data;
    using Oracle.DataAccess.Client;
    using Oracle.DataAccess.Types;
    namespace Associative
      /// <summary>
      /// Summary description for Class1.
      /// </summary>
      class Class1
        /// <summary>
        /// The main entry point for the application.
        /// </summary>
        [STAThread]
        static void Main(string[] args)
          string connStr = "User Id=/";
          OracleConnection oraConn = new OracleConnection(connStr);
          oraConn.Open();
          // create the command object and set attributes
          OracleCommand cmd = new OracleCommand("null_array_test.bulk_insert", oraConn);
          cmd.CommandType = CommandType.StoredProcedure;
          // create parameter objects for each parameter
          OracleParameter p_first_name = new OracleParameter();
          OracleParameter p_middle_name = new OracleParameter();
          OracleParameter p_last_name = new OracleParameter();
          // set parameter type for each parameter
          p_first_name.OracleDbType = OracleDbType.Varchar2;
          p_middle_name.OracleDbType = OracleDbType.Varchar2;
          p_last_name.OracleDbType = OracleDbType.Varchar2;
          // set the collection type for each parameter
          p_first_name.CollectionType = OracleCollectionType.PLSQLAssociativeArray;
          p_middle_name.CollectionType = OracleCollectionType.PLSQLAssociativeArray;
          p_last_name.CollectionType = OracleCollectionType.PLSQLAssociativeArray;
          // set the parameter values
          p_first_name.Value = new string[4]{"First 1", "First 2", "First 3", "First 4"};
          p_middle_name.Value = new string[4]{"Middle 1", "", "Middle 3", ""};
          p_last_name.Value = new string[4]{"Last 1", "Last 2", "Last 3", "Last 4"};
          // set the size for each array
          p_first_name.Size = 4;
          p_middle_name.Size = 4;
          p_last_name.Size = 4;
          // set array bind size for the columns since they
          // are a variable size type (varchar2)
          p_first_name.ArrayBindSize = new int[4]{32, 32, 32, 32};
          p_middle_name.ArrayBindSize = new int[4]{32, 32, 32, 32};
          p_last_name.ArrayBindSize = new int[4]{32, 32, 32, 32};
          // add the parameters to the command object
          cmd.Parameters.Add(p_first_name);
          cmd.Parameters.Add(p_middle_name);
          cmd.Parameters.Add(p_last_name);
          // execute the insert
          cmd.ExecuteNonQuery();
          p_last_name.Dispose();
          p_middle_name.Dispose();
          p_first_name.Dispose();
          cmd.Dispose();
          oraConn.Dispose();
    And after running the code:
    SQL> select * from null_array_insert;
    FIRST_NAME                       MIDDLE_NAME                      LAST_NAME
    First 1                          Middle 1                         Last 1
    First 2                                                           Last 2
    First 3                          Middle 3                         Last 3
    First 4                                                           Last 4
    4 rows selected.
    SQL> select * from null_array_insert where middle_name is null;
    FIRST_NAME                       MIDDLE_NAME                      LAST_NAME
    First 2                                                           Last 2
    First 4                                                           Last 4
    2 rows selected.
    SQL>Hope that helps,
    - Mark

  • Can I use Array Binding with a ExecuteDataSet or ExecuteReader methods?

    I want to use Array binding with selects. From the examples that I see so far it seems like everyone is showing the ExecuteNonQuery method. I wonder if I can use this functionality with a regular query that returns ref cursoros.
    Andrzej

    what is the error you recieve?

  • How to loop an output array and pass each index to the next VI in the sequence in TestSTAND?

    Hi,
    I have 2 VIs - XX and YY. The output of XX generates an array of strings.
    The input of YY takes in a string. I have VIs XX followed by YY in the
    sequence editor.
    For each item in the output array of XX, I want to pass that item into
    YY and execute YY.
    How do I do this in TestStand without creating an intermediate VI.
    Your help is greatly appreciated folks!
    Thx

    Hi,
    What you could do is set the second step to loop.
    Then use as one of the parameters to VI YY the string array using RunState.LoopIndex as the array index.
    eg. Locals.MyStringArray[RunState.LoopIndex]
    Hope this helps
    Regards
    Ray Farmer
    Regards
    Ray Farmer

  • PL/SQL array bind output variable

    I've been trying to learn how to pass an array to an pl/sql script. Getting the data into the db seems to be working fine, but I would like to know if there was a problem inserting the data. More specifically, I would like to know THE SPECIFIC ROW that caused the problem.
    pl/sql code:
    create or replace procedure pp (
              v_out      out number,
              v_listtype in repair_codes.listtype%type,
    v_repaircode in repair_codes.repaircode%type
    is
    begin
    insert into repair_codes (listtype, repaircode) values (v_listtype,v_repaircode);
         v_out:=1;
    commit;
         --just setting up test variable for now     
    end;
    vb.code:
    Dim cmd As New OracleCommand("pp", dbConn)
    cmd.CommandType = CommandType.StoredProcedure
    cmd.ArrayBindCount = 3
    Dim al(2) As String
    Dim ar(2) As String
    al(0) = "JOE1"
    al(1) = "JOE2"
    al(2) = "JOE3"
    ar(0) = "TEST1"
    ar(1) = "TEST2"
    ar(2) = "TEST3456789"
    Dim out As New OracleParameter("v_out", OracleDbType.Varchar2, 20)
    out.Direction = ParameterDirection.Output
    cmd.Parameters.Add(out)
    Dim listtype As New OracleParameter("v_listtype", OracleDbType.Varchar2)
    listtype.Value = al
    cmd.Parameters.Add(listtype)
    Dim repaircode As New OracleParameter("v_repaircode", OracleDbType.Varchar2)
    repaircode.Value = ar
    cmd.Parameters.Add(repaircode)
    dbConn.Open()
    Try
    cmd.ExecuteNonQuery()
    Catch ex As OracleException ' catches only Oracle errors
    ex = ex
    Select Case ex.Number
    Case 1
    MessageBox.Show("Error attempting to insert duplicate data.")
    Case 12545
    MessageBox.Show("The database is unavailable.")
    Case Else
    MessageBox.Show("Database error: " & ex.Message.ToString())
    Dim wha = ex.Errors(0).ArrayBindIndex 'always '0'
    End Select
    Finally
    dbConn.Close()
    End Try
    error:
    OracleParameter.ArrayBindSize is invalid
    Code above will work if I remove everything about the 'output' variable
    To test I would like to put in data for a column that is too large, have all other rows inserted, but return the row that had bad data. Thanks for any thoughts on this-

    I have a similar issue, i.e. the pl/sql table type as out parameter is causing probleml in one API related to Oracle Applications. I have singled this problem out by creating wrappers and testing them against BPEL process. Now as soon as I put an out parameter with pl/sql table in my wrapper, I start getting errors. Why the invoke even care about what is in output while calling the API? How can I get rid of it. I am not able to pin point where exactly you made the changes. Could you please share some more info or possibly share the BAD and GOOD code.
    We will probably get away with this by creating just a wrapper that would have NO out parameter as PL/SQL table as I don't think we need it anyway.
    Still want to know what is the issue here as we would like to avoid any custom wrapper creation?
    Shobhit
    Message was edited by:
    Shobhit.Kapila

  • Array out of bounds exception when outputting array to file

    Could someone please tell me why i'm getting this array out of bounds exception?
    public class Assignment1 {
    public static void main(String[] names)throws IOException {
    BufferedReader keyboard = null;
    String userChoice;
    String inputFile = null;
    String studentData;
    String searchFile = null;
    String searchName;
    String stringIn;
    PrintWriter outputFile;
    FileWriter fWriter = null;
    BufferedReader fReader = null;
    int first;
    int last;
    int mid;
    int midValue;
    int i;
    int number;
    // creates keyboard as a buffered input stream
    keyboard = new BufferedReader(new InputStreamReader(System.in));
    //prompts user to choose 1 or 2 to make a corresponding choice
    System.out.println("Please Enter: ");
    System.out.println("1 to Create a File: ");
    System.out.println("2 to Search a File: ");
    userChoice = keyboard.readLine(); //user enters 1 or 2
    // converts a String into an int value
    number = Integer.parseInt(userChoice);
    fReader = new BufferedReader(new FileReader("studentData.txt"));
    if (number == 1) {          
    System.out.println("Please Enter the File Name to Create: ");
    studentData = keyboard.readLine();
    File file = new File("studentData.txt");
    fWriter = new FileWriter("studentData.txt");
    outputFile = new PrintWriter(fWriter);
    names = new String[200];
    i=0;
    //keep looping till sentinel
    while (studentData != "end" && studentData != null &&
    i < names.length) {
    if (studentData.equals("end")) break; //break and call sort
    System.out.println("Enter a name and press Enter. " +
    "Type 'end' and press Enter when done: ");
    studentData = keyboard.readLine();
    //loop for putting the names into the array
    for(i=0; i<names.length; i++) ;
    outputFile.println(names);
    } [b]outputFile.close();

    package assignment1;
    import java.io.*;
    import java.util.*;
    public class Assignment1 {
        public static void main(String[] names)throws IOException {
           BufferedReader keyboard = null;
           String userChoice;
           String inputFile = null;
           String studentData;
           String searchFile = null;
           String searchName;
           String stringIn;
           PrintWriter outputFile;
           FileWriter fWriter = null;
           BufferedReader fReader = null;
           int first;
           int last;
           int mid;
           int midValue;
           int i;
           int number;
           // creates keyboard as a buffered input stream
           keyboard = new BufferedReader(new InputStreamReader(System.in));
           //prompts user to choose 1 or 2 to make a corresponding choice
           System.out.println("Please Enter: ");
           System.out.println("1 to Create a File: ");
           System.out.println("2 to Search a File: ");
           userChoice = keyboard.readLine();    //user enters 1 or 2
           // converts a String into an int value
           number = Integer.parseInt(userChoice); 
           fReader = new BufferedReader(new FileReader("studentData.txt"));
           if (number == 1) {          
               System.out.println("Please Enter the File Name to Create: ");
               studentData = keyboard.readLine();
               File file = new File("studentData.txt");
               fWriter = new FileWriter("studentData.txt");
               outputFile = new PrintWriter(fWriter);
               names = new String[200];
               i=0;
                //keep looping till sentinel
                while (studentData.equals("end") && studentData != null &&
                       i < names.length) {
                   if (studentData.equals("end")) break;   //break and call sort
                   System.out.println("Enter a name and press Enter. " +
                                       "Type 'end' and press Enter when done: ");
                    studentData = keyboard.readLine();
                    //loop for putting the names into the array
                    for(i=0; i<names.length; i++) ;
                    outputFile.println(names);
    } outputFile.close();
    //call selectionSort() to order the array
         selectionSort(names);
         // Now output to a file.
    fWriter = new FileWriter("studentData.txt");
    outputFile = new PrintWriter(fWriter);
    } else if (number == 2) {
    System.out.println("Please Enter a File Name to search: ");
    searchFile = keyboard.readLine();
    inputFile = ("studentData.txt");
    } if (searchFile == "studentData.txt") {                      
    // Input from a file. See input file streams.
    fReader = new BufferedReader(new FileReader("studentData.txt"));
    System.out.println("Please enter a Name to search for: ");
    searchName = keyboard.readLine();
    //enter binary search code
    first = 0;
    last = 199;
    while (first < last)
    mid = (first + last)/2; // Compute mid point.
    if (searchName.compareTo(names[mid]) < 0) {
    last = mid; // repeat search in bottom half.
    } else if (searchName.compareTo(names[mid]) > 0) {
    first = mid + 1; // Repeat search in top half.
    } else {
    // Found it.
    System.out.println("The Name IS in the file.");
    } // did not find it.
    System.out.println("The Name IS NOT in the file.");
    } else //if userChoice != 1 or 2, re-prompt then start over
    System.out.println("Please Enter 1 or 2 or correctly " +
    "enter an existing file!!");
    // fWriter = new FileWriter("studentdata.txt");
    //outputFile = new PrintWriter(fWriter); //output
    public static void selectionSort(String[] names) {
    //use compareTo!!!!
    int smallIndex;
    int pass, j = 1, n = names.length;
    String temp;
    for (pass = 0; pass < n-1; pass++)
    //Code for Do/While Loop
    do {
    //scan the sublist starting at index pass
    smallIndex = pass;
    //jtraverses sublist names[pass+1] to names[n-1]
    for (j = pass+1; j < n; j++)
    //if smaller string found, smallIndex=that position
    if (names[j].compareTo(names[smallIndex]) < 0)
    smallIndex = j;
    temp = names[pass]; //swap
    names[pass] =names[smallIndex];
    names[smallIndex] = temp;
    } while (j <= names.length);
    //File file = new File("studentData.txt");
    This is the output window:
    init:
    deps-jar:
    compile:
    run:
    Please Enter:
    1 to Create a File:
    2 to Search a File:
    1
    Please Enter the File Name to Create:
    test
    Exception in thread "main" java.lang.NullPointerException
    at assignment1.Assignment1.selectionSort(Assignment1.java:134)
    at assignment1.Assignment1.main(Assignment1.java:73)
    Java Result: 1
    BUILD SUCCESSFUL (total time: 9 seconds)

Maybe you are looking for

  • Using Crystal Reports formulas in Command Objects

    Post Author: Hamish CA Forum: Formula Is this possible? When I try and reference a formula in a command object something like select * from tablenamewhere id in (@testFormula) @testFormula prints out as 1,2 on the report if I remove the reference in

  • Connectivity with  oracle database using web Dynpro(for java)

    Hi, In web Dynpro we will connect to SAP systems by using Adaptive RFC.  Then How to connect the oracle 8i/9i using webdynpro? Plese tell me the procedure to establish the connecting using enterprise portal? Thanks & Regards, Mastanvali Shaik

  • Apple Mail 6.2 with OS 10.8.2 Folder Search

    hello there, i have a problem with the search function of mail 6.2. i have pop accounts and folders within mail. they are stored in "local" in the sidebar. when i write something into the search-field everything ist found in the IN and OUT box, but N

  • Can't connect to PC server from Mac after PC is put behind switch.NE ideas?

    After adding a switch in my network i bumped into some network trouble. Here's my new setup: Airport Extreme iBook via WIFI Airport Express - LAN cable - SWITCH - PC/XBOX360/PS2 All computers have internet access, i can access PC via VNC on my iBook,

  • Reading Lyrics from the iPod....?

    Is there anybody who knows how to make use of the storage of song lyrics in the iPod? I'm using now the widget "Sing that iTune", which is able to display lyrics within the widget, but also stores it as a .txt file in a separate folder, called 'Sing