Passing ARRAYs to PL/SQL procedure

Hi,
How do i pass an array(from java program) to pl/sql stored procedure, and after doing some data manipulation in the database, i wanted to pass back the same array to the java program. Can anyone help me or post some sample code here?
Thanks in advance.
Kumar
null

Are you hoping to use JDBC or ODBC to pass this array? If JDBC, I'd suggest asking this question on the JDBC forum.
Justin Cave
ODBC Development

Similar Messages

  • Passing array to pl/sql procedure - pls-00306 wrong number/types of args

    its oracle 10.2 database;
    I have a procedure with array parameters based on simple sql types.
    eg
    create or replace type vt_attrname is table of varchar2(50);
    Now my call to the procedure works when the array is empty;
    as soon as I bulk collect into my local array, I get a compilation error.
    eg
    declare
    my_array  vt_attrname;
    begin
    select label
      bulk collect
      into my_array
      from table_name
    where 1=1;
    my_proc(p_array=>my_array);  -- syntax error
    end;if I pass null the call works but obviously array is empty.
    I have read something about varray's being incompatible between sqltypes and pl/sql.
    How do I get around this problem?
    The bulk collect is working okay.
    A small example would be appreciated.

    Yep, I spotted the syntax error earlier.
    However even though that seems to compile ok, I still get the problem with my package call.
    heres the actual call from the code
    vt_attrname and vt_attrvalues are types declared on another schema.
    I have redeclared them on the current schema now.
    create or replace type vt_attrname is table of varchar2(50);
    create or replace type vt_attrvalue is table of varchar2(500);
    create procedure <name>
    as
    v_cardapplattrtag   vt_attrname;
    v_cardapplattrvalue vt_attrvalue;
      for cardappl_cur in
        (select cardappl_id 
           from ci_cardappl
          where custcard_id = cur.document_logical_number)
        loop
        select label
          bulk collect
          into v_cardapplattrtag
          from ci_applver_attribute
          where applver_id = v_applver_id;
          v_array_size := v_cardapplattrtag.count;
        -- populate this array
        -- ppt_cardapplattrtag comes from ci_pplver_attribute
        --ppt_cardapplattrvalue -- various
    cci_setcardappl.SetCardApplAttrValue(
              pn_cardappl_id                 =>     cardappl_cur.cardappl_id,
              ppt_cardapplattrtag     =>      v_cardapplattrtag, -- works when null
              ppt_cardapplattrvalue   =>     NULL,
              pn_cardapplattrsize     =>     v_array_size,
              pv_arn                  =>     cur.application_request_id,
              pv_commit               =>    'FALSE');and the procedure protototype is
    PROCEDURE SetCardApplAttrValue(
              pn_cardappl_id           IN     NUMBER,
              ppt_cardapplattrtag     IN     VT_BPATTRNAME DEFAULT NULL,
              ppt_cardapplattrvalue   IN     VT_BPATTRVALUE DEFAULT NULL,
              pn_cardapplattrsize     IN     NUMBER,
              pv_arn                  IN     VARCHAR2,
              pv_commit               IN     VARCHAR2 DEFAULT 'FALSE');Edited by: Keith Jamieson on Sep 23, 2009 10:42 AM

  • Passing arrays to Oracle Stored procedure.

    Have any body passed arrays to Oracle stored procedures while the app is running in Weblogic app server. I am able to pass the arrays with regular JDBC connection. If I run the same piece of code using a connection recieved from the datasource of weblogic server, its not working. I am getting serialization errors with the ArrayDescriptor class. Looks like the ArrayDescriptor is not serializable.
    Does anybody know solution/workaround to pass arrays ?
    Thanks in advance

    you could write a wrapper class that extends ArrayDescriptor and implements serializable...
    for example your class would look something like this.
    public class MyArrayDescriptor extends ArrayDescriptor
    implements Serializable
    in your regular code use the wrapper class in place of the ArrayDescriptor (it will contain all the same methods as the real ArrayDescriptor) and you should be able to toss your wrapper class anywhere you please.

  • Returing array from PL/SQL procedure

    Hi,
    I am trying to return array from PL/SQL procedure. Heres is the code. I am getting an error "OracleParameter.ArrayBindSize is invalid ".
    Will anybody let me know what is wrong in following code. or does anybody have code to return PL/SQL array using VB.NET.
    oCommand.CommandText = "MyPack.TestVarchar2"
    oCommand.CommandType = CommandType.StoredProcedure
    Dim id As Integer = 10
    Dim deptname As String()
    Dim oParam1 As Oracle.DataAccess.Client.OracleParameter = New Oracle.DataAccess.Client.OracleParameter("id", Oracle.DataAccess.Client.OracleDbType.Int32)
    Dim oParam2 As Oracle.DataAccess.Client.OracleParameter = New Oracle.DataAccess.Client.OracleParameter("deptname", Oracle.DataAccess.Client.OracleDbType.Varchar2)
    oParam1.Direction = ParameterDirection.Input
    oParam2.Direction = ParameterDirection.Output
    oParam1.CollectionType = Oracle.DataAccess.Client.OracleCollectionType.None
    oParam2.CollectionType = Oracle.DataAccess.Client.OracleCollectionType.PLSQLAssociativeArray
    oParam1.Value = id
    oParam2.Value = ""
    oParam1.Size = 10
    oParam2.Size = 20
    oCommand.Parameters.Add(oParam1)
    oCommand.Parameters.Add(oParam2)
    oCommand.ExecuteNonQuery()
    Thanks
    Sameer

    Thanks Arnold for the reply..
    Yes, I am trying to get result set in array which is unknow to me (No of rows return by the query). For the test I will pre-define the result set so that I will able to set ArrayBindSize.
    I have read C# example but when I try to write it in VB.NET it gives me syntax error when I try to set the ArrayBindSize.
    oParam.ArrayBindSize = new int[3]{15,23,13} // individual max size of 3 outputsWill you please let me know how to set ArrayBindSize (VB.NET) because I am new to this..
    There is an example at otn "How to: Bind an Array to an ODP.NET Database Command" which does multiple INSERTs in one trip to database. This works fine. I need to do same for the SELECT statement which will return me multiple rows. I do not mean refCursor. If I use refCursor, it will make soft parse which I am trying to avoid using this Array techniq.
    Thanks
    Sameer

  • Error while pasing arrays to pl/sql procedure

    Hi,
    I am trying to pass an array from java to pl/sql procedure.
    I tried this code:
    CREATE OR REPLACE TYPE HEADER_UPLOAD IS OBJECT
    (VENDOR_NAME VARCHAR2(240) --hr_all_organization_units.name%TYPE
    ,BILL_TO_CUSTOMER_NAME VARCHAR2(240)-- hz_parties.party_name%TYPE
    ,BILL_TO_CUSTOMER_NUMBER VARCHAR2(240) --hz_cust_accounts.account_number%TYPE
    ,BILL_TO_SITE_USE_ID VARCHAR2(240) --hz_cust_site_uses_all.site_use_id%TYPE
    ,RESELLER_NAME VARCHAR2(240) --hz_parties.party_name%TYPE
    ,RESELLER_ADDRESS_1 VARCHAR2(240)--hz_locations.address1%TYPE
    ,RESELLER_ADDRESS_2 VARCHAR2(240)--hz_locations.address2%TYPE
    ,RESELLER_ADDRESS_3 VARCHAR2(240)--hz_locations.address3%TYPE
    ,RESELLER_ADDRESS_4 VARCHAR2(240)--hz_locations.address4%TYPE
    ,RESELLER_COUNTRY VARCHAR2(240)--hz_locations.country%TYPE
    ,RESELLER_STATE VARCHAR2(240) --hz_locations.state%TYPE
    ,RESELLER_CITY VARCHAR2(240)--hz_locations.city%TYPE
    ,RESELLER_POSTAL_CODE VARCHAR2(240)--hz_locations.postal_code%TYPE
    ,FEDERAL_GOVT_END_USER VARCHAR2(240)
    ,END_USER_NAME VARCHAR2(240)--hz_parties.party_name%TYPE
    ,END_USER_ADDRESS_1 VARCHAR2(240)--hz_locations.address1%TYPE
    ,END_USER_ADDRESS_2 VARCHAR2(240)--hz_locations.address2%TYPE
    ,END_USER_ADDRESS_3 VARCHAR2(240)--hz_locations.address3%TYPE
    ,END_USER_ADDRESS_4 VARCHAR2(240)--hz_locations.address4%TYPE
    ,END_USER_COUNTRY VARCHAR2(240)-- hz_locations.country%TYPE
    ,END_USER_STATE VARCHAR2(240) --hz_locations.state%TYPE
    ,END_USER_CITY VARCHAR2(240) --hz_locations.city%TYPE
    ,END_USER_POSTAL_CODE VARCHAR2(240)--hz_locations.postal_code%TYPE
    ,END_USER_CONTACT_NAME VARCHAR2(240)
    ,END_USER_EMAIL VARCHAR2(2000)
    ,SHIP_TO_CUSTOMER_NAME VARCHAR2(240)--ra_customers.customer_name%TYPE
    ,SHIP_TO_ADDRESS_1 VARCHAR2(240) --hz_locations.address1%TYPE
    ,SHIP_TO_ADDRESS_2 VARCHAR2(240) --hz_locations.address2%TYPE
    ,SHIP_TO_ADDRESS_3 VARCHAR2(240) --hz_locations.address3%TYPE
    ,SHIP_TO_ADDRESS_4 VARCHAR2(240) --hz_locations.address4%TYPE
    ,SHIP_TO_COUNTRY VARCHAR2(240) --hz_locations.country%TYPE
    ,SHIP_TO_STATE VARCHAR2(240) --hz_locations.state%TYPE
    ,SHIP_TO_CITY VARCHAR2(240)--hz_locations.city%TYPE
    ,SHIP_TO_POSTAL_CODE VARCHAR2(240)--hz_locations.postal_code%TYPE
    ,SHIP_TO_CONTACT_NAME VARCHAR2(240)
    ,SHIP_TO_CONTACT_PHONE VARCHAR2(50)
    ,SHIPPING_INSTRUCTIONS VARCHAR2(240)--oe_order_headers_all.shipping_instructions%TYPE
    ,SHIPPING_METHOD VARCHAR2(240) --fnd_lookup_values.meaning%TYPE
    ,ALERT_EMAIL VARCHAR2(2000)
    ,LICENSE_EMAIL VARCHAR2(2000)
    ,ORDER_CONTACT_FIRST_NAME VARCHAR2(150)
    ,ORDER_CONTACT_LAST_NAME VARCHAR2(150)
    ,ORDER_CONTACT_PHONE VARCHAR2(50)
    ,ORDER_CONTACT_FAX_NUMBER VARCHAR2(50)
    ,ORDER_CONTACT_EMAIL VARCHAR2(2000)
    ,NOTES VARCHAR2(4000)
    ,CURRENCY_CODE VARCHAR2(240) --fnd_currencies.currency_code%TYPE
    ,SERVICE_RENEWAL_ORDER varchar2(10)
    ,CUSTOMER_PO_NUMBER VARCHAR2(240) --oe_order_headers_all.cust_po_number%TYPE
    ,RESUBMITTED_ORDER VARCHAR2(10)
    ,PREV_CUSTOMER_PO_NUMBER VARCHAR2(240) --oe_order_headers_all.cust_po_number%TYPE
    ,END_USER_PO_NUMBER VARCHAR2(50)
    ,PO_NET_TOTAL NUMBER
    ,FOB VARCHAR2(240) --fnd_lookup_values.meaning%TYPE
    ,FREIGHT_TERMS VARCHAR2(240) --fnd_lookup_values.meaning%TYPE
    ,FREIGHT_ACCOUNT_NUMBER VARCHAR2(200)
    create or replace type header_upload_tab is table of header_upload;
    java code is: this is a java class which first inserts the csv file data into array headerdata
    public static String[] parseCSV(long l)
    throws SQLException, FrameworkException, IOException
    String s = "parseCSV";
    String lResult[] = new String[3];
    if(IBEUtil.logEnabled())
    IBEUtil.log("oracle.apps.ibe.shoppingcart.util.OrderUploadCSVReader", s, "Start");
    OracleConnection oracleconnection = (OracleConnection)TransactionScope.getConnection();
    OraclePreparedStatement oraclepreparedstatement = null;
    OracleResultSet oracleresultset = null;
    BLOB blob = null;
    long l1 = System.currentTimeMillis();
    if(IBEUtil.logEnabled())
    IBEUtil.log("oracle.apps.ibe.shoppingcart.util.OrderUploadCSVReader", s, "Before fetching the File data from FND_LOBS");
    oraclepreparedstatement = (OraclePreparedStatement)oracleconnection.prepareStatement(" SELECT FILE_DATA FROM FND_LOBS WHERE FILE_ID = :1 ");
    oraclepreparedstatement.defineColumnType(1, 2004);
    oraclepreparedstatement.setLong(1, l);
    try
    if(IBEUtil.logEnabled())
    IBEUtil.log("oracle.apps.ibe.shoppingcart.util.OrderUploadCSVReader", s, "Before Executing the query");
    oracleresultset = (OracleResultSet)oraclepreparedstatement.executeQuery();
    if(IBEUtil.logEnabled())
    IBEUtil.log("oracle.apps.ibe.shoppingcart.util.OrderUploadCSVReader", s, "After Executing the query");
    while(oracleresultset.next())
    blob = (BLOB)oracleresultset.getObject(1);
    finally
    if(oracleresultset != null)
    oracleresultset.close();
    if(oraclepreparedstatement != null)
    oraclepreparedstatement.close();
    if(oracleconnection != null)
    TransactionScope.releaseConnection(oracleconnection);
    if(IBEUtil.logEnabled())
    IBEUtil.log("oracle.apps.ibe.shoppingcart.util.OrderUploadCSVReader", s, "Time taken to get the BLOB object(" + (System.currentTimeMillis() - l1) + " milliseconds)");
    l1 = System.currentTimeMillis();
    if(IBEUtil.logEnabled())
    IBEUtil.log("oracle.apps.ibe.shoppingcart.util.OrderUploadCSVReader", s, "Get the stream from the BLOB");
    InputStreamReader inputstreamreader = new InputStreamReader(blob.getBinaryStream());
    if(IBEUtil.logEnabled())
    IBEUtil.log("oracle.apps.ibe.shoppingcart.util.OrderUploadCSVReader", s, "Before creating the csvreader");
    xxbcIbeOrderUploadCSVReader OrderUploadcsvreader = new xxbcIbeOrderUploadCSVReader(inputstreamreader);
    if(IBEUtil.logEnabled())
    IBEUtil.log("oracle.apps.ibe.shoppingcart.util.OrderUploadCSVReader", s, "After creating the csvreader");
    OrderUploadcsvreader.setFieldSeparator(",");
    OrderUploadcsvreader.setHandleEscapes(true);
    if(IBEUtil.logEnabled())
    IBEUtil.log("oracle.apps.ibe.shoppingcart.util.OrderUploadCSVReader", s, "Before getting the headers");
    // Fetch the Header Record
    ArrayList arraylistH = OrderUploadcsvreader.getHeaders();
    if(IBEUtil.logEnabled())
    IBEUtil.log("oracle.apps.ibe.shoppingcart.util.OrderUploadCSVReader", s, "After getting the headers");
    String s1 = (String)arraylistH.get(0);
    if ("HEADER".equals(s1))
    if(IBEUtil.logEnabled())
    IBEUtil.log("oracle.apps.ibe.shoppingcart.util.OrderUploadCSVReader", s, "Parse and Create the Header Record");
    // Fetch the Header Data. This data will be inserted into Staging table, XXBC_IBE_ORDER_HEADER_IFACE
    ArrayList arraylistHData = OrderUploadcsvreader.readRecord();
    String headerData[] = new String[60];
    for(int i = 1; i < arraylistH.size(); i++) {
    headerData[i] = "";
    for(int i = 1; i < arraylistH.size(); i++)
    String h_element = (String)arraylistH.get(i);
    String h_value = (String)arraylistHData.get(i);
    if(IBEUtil.logEnabled())
    IBEUtil.log("oracle.apps.ibe.shoppingcart.util.OrderUploadCSVReader", s, h_element);
    if ("VENDOR NAME*".equals(h_element)) headerData[1] = h_value;
    if ("BILL TO CUSTOMER*".equals(h_element)) headerData[2] = h_value;
    if ("BILL TO CUSTOMER NUMBER*".equals(h_element)) headerData[3] = h_value;
    if ("BILL TO SITE NUMBER*".equals(h_element)) headerData[4] = h_value;
    if ("RESELLER*".equals(h_element)) headerData[5] = h_value;
    if ("RESELLER ADDRESS LINE 1*".equals(h_element)) headerData[6] = h_value;
    if ("RESELLER ADDRESS LINE 2".equals(h_element)) headerData[7] = h_value;
    if ("RESELLER ADDRESS LINE 3".equals(h_element)) headerData[8] = h_value;
    if ("RESELLER ADDRESS LINE 4".equals(h_element)) headerData[9] = h_value;
    if ("RESELLER COUNTRY*".equals(h_element)) headerData[10] = h_value;
    if ("RESELLER STATE*".equals(h_element)) headerData[11] = h_value;
    if ("RESELLER CITY*".equals(h_element)) headerData[12] = h_value;
    if ("RESELLER POSTAL CODE*".equals(h_element)) headerData[13] = h_value;
    if ("FEDERAL GOVT END USER".equals(h_element)) headerData[14] = h_value;
    if ("END USER*".equals(h_element)) headerData[15] = h_value;
    if ("END USER ADDRESS LINE 1*".equals(h_element)) headerData[16] = h_value;
    if ("END USER ADDRESS LINE 2".equals(h_element)) headerData[17] = h_value;
    if ("END USER ADDRESS LINE 3".equals(h_element)) headerData[18] = h_value;
    if ("END USER ADDRESS LINE 4".equals(h_element)) headerData[19] = h_value;
    if ("END USER COUNTRY*".equals(h_element)) headerData[20] = h_value;
    if ("END USER STATE*".equals(h_element)) headerData[21] = h_value;
    if ("END USER CITY*".equals(h_element)) headerData[22] = h_value;
    if ("END USER POSTAL CODE*".equals(h_element)) headerData[23] = h_value;
    if ("END USER CONTACT**".equals(h_element)) headerData[24] = h_value;
    if ("END USER CONTACT EMAIL**".equals(h_element)) headerData[25] = h_value;
    if ("SHIP TO CUSTOMER*".equals(h_element)) headerData[26] = h_value;
    if ("SHIP TO ADDRESS LINE 1*".equals(h_element)) headerData[27] = h_value;
    if ("SHIP TO ADDRESS LINE 2".equals(h_element)) headerData[28] = h_value;
    if ("SHIP TO ADDRESS LINE 3".equals(h_element)) headerData[29] = h_value;
    if ("SHIP TO ADDRESS LINE 4".equals(h_element)) headerData[30] = h_value;
    if ("SHIP TO COUNTRY*".equals(h_element)) headerData[31] = h_value;
    if ("SHIP TO STATE*".equals(h_element)) headerData[32] = h_value;
    if ("SHIP TO CITY*".equals(h_element)) headerData[33] = h_value;
    if ("SHIP TO POSTAL CODE*".equals(h_element)) headerData[34] = h_value;
    if ("SHIP TO CONTACT**".equals(h_element)) headerData[35] = h_value;
    if ("SHIP TO CONTACT PHONE NUMBER**".equals(h_element)) headerData[36] = h_value;
    if ("SHIPPING INSTRUCTIONS".equals(h_element)) headerData[37] = h_value;
    if ("SHIPPING METHOD*".equals(h_element)) headerData[38] = h_value;
    if ("ALERT EMAIL*".equals(h_element)) headerData[39] = h_value;
    if ("LICENSE EMAIL**".equals(h_element)) headerData[40] = h_value;
    if ("ORDER CONTACT FIRST NAME*".equals(h_element)) headerData[41] = h_value;
    if ("ORDER CONTACT LAST NAME*".equals(h_element)) headerData[42] = h_value;
    if ("ORDER CONTACT PHONE NUMBER*".equals(h_element)) headerData[43] = h_value;
    if ("ORDER CONTACT FAX NUMBER".equals(h_element)) headerData[44] = h_value;
    if ("ORDER CONTACT EMAIL*".equals(h_element)) headerData[45] = h_value;
    if ("NOTES".equals(h_element)) headerData[46] = h_value;
    if ("CURRENCY*".equals(h_element)) headerData[47] = h_value;
    if ("SERVICE RENEWAL ORDER".equals(h_element)) headerData[48] = h_value;
    if ("CUSTOMER PO NUMBER*".equals(h_element)) headerData[49] = h_value;
    if ("RESUBMISSION*".equals(h_element)) headerData[50] = h_value;
    if ("PREVIOUS CUSTOMER PO NUMBER**".equals(h_element)) headerData[51] = h_value;
    if ("END USER PO NUMBER".equals(h_element)) headerData[52] = h_value;
    if ("PO NET TOTAL*".equals(h_element)) headerData[53] = h_value;
    if ("FOB*".equals(h_element)) headerData[54] = h_value;
    if ("FREIGHT TERMS*".equals(h_element)) headerData[55] = h_value;
    if ("FREIGHT ACCOUNT NUMBER".equals(h_element)) headerData[56] = h_value;
    if(IBEUtil.logEnabled())
    IBEUtil.log("oracle.apps.ibe.shoppingcart.util.OrderUploadCSVReader", s, (String)headerData);
    } // End of processing Header Data
    if(IBEUtil.logEnabled())
    IBEUtil.log("oracle.apps.ibe.shoppingcart.util.OrderUploadCSVReader", s, "Insert the Header Record into Interface Table");
    if(IBEUtil.logEnabled())
    IBEUtil.log("oracle.apps.ibe.shoppingcart.util.OrderUploadCSVReader", s, (String)headerData[1]);
    if(IBEUtil.logEnabled())
    IBEUtil.log("oracle.apps.ibe.shoppingcart.util.OrderUploadCSVReader", s, (String)headerData[2]);
    if(IBEUtil.logEnabled())
    IBEUtil.log("oracle.apps.ibe.shoppingcart.util.OrderUploadCSVReader", s, "checkpoint");
    oracleconnection = (OracleConnection)TransactionScope.getConnection();
    oracleconnection.setAutoCommit(true);
    if(IBEUtil.logEnabled())
    IBEUtil.log("oracle.apps.ibe.shoppingcart.util.OrderUploadCSVReader", s, "After getting connection");
    ArrayDescriptor descriptor = ArrayDescriptor.createDescriptor( "HEADER_UPLOAD_TAB", oracleconnection );
    if(IBEUtil.logEnabled())
    IBEUtil.log("oracle.apps.ibe.shoppingcart.util.OrderUploadCSVReader", s, "before new array");
    ARRAY array_to_pass = new ARRAY( descriptor, oracleconnection, headerData );
    if(IBEUtil.logEnabled())
    IBEUtil.log("oracle.apps.ibe.shoppingcart.util.OrderUploadCSVReader", s, "calling procedure");
    OraclePreparedStatement ps =
    (OraclePreparedStatement)oracleconnection.prepareStatement ( "BEGIN insert_data(:1); END;" );
    ps.setARRAY( 1, array_to_pass );
    ps.execute();.......continued
    the above code executes till the message :---IBEUtil.log("oracle.apps.ibe.shoppingcart.util.OrderUploadCSVReader", s, "before new array");
    after that it gives error as :---Exception=java.sql.SQLException: Fail to convert to internal representation
    Kindly Help....
    Thanks in advance
    Gaurav

    Gaurav,
    Just a guess, but try the following:
    ArrayDescriptor descriptor = ArrayDescriptor.createDescriptor( "SCOTT.HEADER_UPLOAD_TAB", oracleconnection );In other words, prefix the data-type name, HEADER_UPLOAD_TAB, with its schema owner name.
    Good Luck,
    Avi.

  • Passing array to oracle stored procedure in VC++ 2005

    Hi,
    I am try to send an array of integers to a stored procedure via ODBC 10.2.0.3 on VC++2005 enviornment. I get the below error
    ORA-06550: line 1, column 7:
    PLS-00306: wrong number or types of arguments in call to 'MYPROC1'
    ORA-06550: line 1, column 7:
    PL/SQL: Statement ignored ... Error Code = 6550
    []E R R O R
    The same code works if I use an INSERT statement.
    SQLUSMALLINT* rowsProcessed = new SQLUSMALLINT;
    RETCODE nRetCode;
    const int arraySize = 200;
    long ptrVal[arraySize];
    long ptrInd[arraySize];
    long ptrStatus[arraySize];
    for (int i = 0; i < arraySize; i++)
    ptrVal = i;
    ptrInd = 0;
    nRetCode = SQLSetStmtAttr(m_hstmt, SQL_ATTR_PARAM_BIND_TYPE, SQL_PARAM_BIND_BY_COLUMN, 0);
    // assign the number of sets of parameters that are to be inserted
    nRetCode = SQLSetStmtAttr(m_hstmt, SQL_ATTR_PARAMSET_SIZE, (SQLPOINTER)iSizeOfArray, 0);
    // assign an array to retrieve status info for each row of parameter values
    nRetCode =SQLSetStmtAttr(m_hstmt, SQL_ATTR_PARAM_STATUS_PTR, (SQLPOINTER)ptrStatus, 0);
    // assign a buffer to store the number of sets of parameters that have been processed
    nRetCode = SQLSetStmtAttr(m_hstmt, SQL_ATTR_PARAMS_PROCESSED_PTR, (SQLPOINTER)rowsProcessed, 0);
    nRetCode = SQLBindParameter(m_hstmt, nParamIndex, nDirection, SQL_C_LONG, SQL_INTEGER, 0, 0, ptrVal, 0, ptrInd);
    //suceeds
    SQLPrepare(m_hstmt, (SQLCHAR*)"INSERT INTO my_table VALUES (?)", SQL_NTS);
    //fails
    SQLPrepare(m_hstmt, (SQLCHAR*)"{CALL mypackage.myproc1(?)}", SQL_NTS);
    SQLExecute(m_hstmt);
    package is
    create or replace package mypackage
    as
    type mytable is table of binary_integer;
    procedure myproc1( l_tab in mytable);
    end;
    show errors
    create or replace package body mypackage
    as
    procedure myproc1( l_tab in mytable)
    as
    begin
    insert into my_table values (100);
    commit;
    FORALL i IN l_tab.first .. l_tab.last
    INSERT into my_table values( l_tab(i) );
    end;
    end;
    any ideas?

    I 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

  • Oracle Data Provider (ODP) Passing Arrays to PL/SQL

    Does anyone know how to pass an array or collection of data (from VB.net) to PL/SQL using the new Oracle Data Provider?
    My PL/SQL procedure is accepting type Table (Table array).
    This was easily done with Oracle Objects (in VB6) but I've found no way to do this with the new provider with .Net.
    It seems like a serious limitation if it can't be done.
    Anyones help would be appreciated.

    Just out of interest, what are the performance implications of using REF CURSORS for retrieving resultsets from Oracle stored procedures via ODP.NET?
    When coding the PL/SQL for these, the REF CURSOR is left OPEN and not explicitly CLOSED. When does the cursor actualy get closed? Is there a risk of reaching "maximum open cursors" or some other limit more quickly if REF CURSORS are used in this manner?
    I haven't found any documentation of this issue as yet.

  • Passing Queries to PL/SQL procedures

    Hi,
    Is there any way in PL/SQL procedure that i can pass two Queries Texts as parameters and return the result set by taking MINUS of the rwo Query results.
    Thanx in Advace
    Shafiq

    Here is the principle...
    SQL> conn scott/tiger
    Connected.
    SQL> CREATE OR REPLACE FUNCTION qry_minus
      2     (p1 IN VARCHAR2, p2 IN VARCHAR2)
      3     RETURN sys_refcursor
      4  IS
      5     return_value sys_refcursor;
      6  BEGIN
      7     OPEN return_value FOR p1||' MINUS '||p2;
      8     RETURN return_value;
      9  END;
    10  /
    Function created.
    SQL> VAR q refcursor
    SQL> exec :q := qry_minus('SELECT deptno FROM dept', 'SELECT deptno FROM emp')
    PL/SQL procedure successfully completed.
    SQL> print q
        DEPTNO
            40
    SQL> Obviously because the query is text strings the calling program is responsible for ensuring the validity of the two queries (matching number and datatype of selected columns, etc).
    Cheers, APC

  • Passing parameters to pl/sql procedure called in portal

    Hi all,
    I am trying to use a javascript window.open function to create a small popup window that is populated by a pl/sql procedure from inside portal.
    I am trying to pass it a parameter to refine a SQL query running in that procedure, unfortunately I'm not sure of the syntax. The url that I'm trying to open in the new window looks like this:
    http://my.server.com:7777/portal/pls/portal/myschema.mypackage.myprocedure
    If I just run this, it works fine and the popup window opens correctly and displays all results. If I try to pass a parameter, it errors out with a 404 Page Not Found.
    The parameter itself comes from a text field that the user can enter a value into. I am able to get the value of that text field and append it to the url I'm generating, but I can't find the proper syntax.
    I've tried numerous syntax variants, but none of them seem to work. The procedure does have the parameter defined in both the spec and body and properly handles it. Can anyone point me in the right direction?
    Thanks,
    -Mike Markiw

    You said you have a text field where a user enters a value, so I am assuming that you have form...
    you can try following
    <form action="/pls/portal/myschema.mypackage.myprocedure" method="post">
    your text field "inVar"
    your submit button
    </form>
    I am sure your myprocedure has inVar as an input...
    If you just want to pass a value to a procedure you can always do following:
    http://my.server.com:7777/portal/pls/portal/myschema.mypackage.myprocedure?inVar=the value

  • 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?

  • Pass array to a stored procedure

    I have a comma delimited string that looks like this:
    1,t,2,t,3,f,4,t
    So I want to parse threw ththis string I send and update the DB. The numbers are ID's and t and f is the other field. An example would be great

    Actually, Tom, what you missed was the important bit. The poster wants to parse a comma separated string. .
    v := myTableType( myType( 1,'t' ), myType( 2,'f' ) );Your solution skips the hard bit ;)
    Here's my go. Of course, it requires the inputter to ensure that the string is correctly parsable (i.e. an even number of values, alternate values numeric).
    Cheers, APC
    SQL> CREATE OR REPLACE TYPE o AS OBJECT  (col1 NUMBER, col2 VARCHAR2(1));
      2  /
    Type created.
    SQL> CREATE OR REPLACE TYPE ot AS TABLE OF o;
      2  /
    Type created.
    SQL> DECLARE
      2     lv VARCHAR2(32767);
      3     i NUMBER;
      4     j NUMBER;
      5     tt ot;
      6     x number;
      7     y varchar2(1);
      8  BEGIN
      9     -- initialise
    10     lv := '1,t,2,t,3,f,4,t';
    11     tt := ot();
    12     i := 0;
    13     j := 0;
    14     LOOP
    15        i := i+1;
    16        EXIT WHEN instr(lv, ',', 1, i) = 0;
    17        --  get first value
    18        j := j+1;
    19        x := to_number(trim(substr(lv, instr(lv, ',', 1, i)-1, 1)));
    20        --  get second value
    21        i := i+1;
    22        y := trim(substr(lv, instr(lv, ',', 1, i)-1, 1));
    23        -- add found values to array
    24        tt.extend;
    25        tt(j) := o(x, y);
    26     END LOOP;
    27     dbms_output.put_line('recs='||to_char(tt.count));
    28  END;
    29  /
    recs=4
    PL/SQL procedure successfully completed.
    SQL>

  • Passing array from java stored procedure to plsql

    I have a java store procedure that is parsing an xml document and returning element values to my plsql application(8.1.7). I'm mapping a java.lang.String return type to VARCHAR2. However I'm running into the 4k limit when trying to return a string from java that is over 4k. Truncation of varchar returning over 4k is a known issue in 8i.
    So my next idea was to split that value of the element into 2000char and put in an array then pass that back to the plsql procedure. I know that oracle.sql.ARRAY can be converted into a plsql TABLE. But I believe you can only use the oracle.sql.ARRAY type when you are doing jdbc programming and are working with a connection.
    SO FINALLY MY QUESTION IS...
    Can anyone think of a solution that will allow me to pass over 4k of character data from my java stored procedure (not jdbc), back to my plsql app?
    Thanks.

    My understanding is that oracle 8 has a 4k limitation on any plsql function return data. A varchar can hold 32k within a function/package, but it cannot return more than 4k outside it's scope.
    Do you have an example you could share where you use the clob as a return type?
    Thanks!

  • Passing array as input to procedure

    Hi,
           create or replace type t_employee_id is table of number;
          create or replace type t_employee_name  is table of varchar2(4000);
    I have created type for array input.
    declare
      p_id t_employee_id;
      p_name t_employee_name;
    begin
       p_id(1):=12;
      p_name(1):='no22';
    p_id(2):=300;
    p_name(2):='XXX';
    p_id(3):=4;
    p_name(3):='bn';
      sp_sample(p_id => p_id,
                p_name => p_name);
    end;
    CREATE OR REPLACE PROCEDURE sp_sample(p_id   IN t_employee_id,
                                          p_name IN t_employee_name) IS
      v_error EXCEPTION;
      PRAGMA EXCEPTION_INIT(v_error, -23456);
    BEGIN
      FORALL i IN 1 .. p_id.COUNT SAVE EXCEPTIONS
        INSERT INTO employee
          (employee_id, employee_name)
        VALUES
          (p_id(i), p_name(i));
      COMMIT;
    EXCEPTION
      WHEN v_error THEN
        FOR i IN 1 .. SQL%BULK_EXCEPTIONS.COUNT LOOP
          dbms_output.put_line('Error:' || SQL%BULK_EXCEPTIONS(i)
                               .ERROR_INDEX || 'Message' ||
                               SQLERRM(-sql%BULK_EXCEPTIONS(i).ERROR_CODE));
          dbms_output.put_line('\n');
        END LOOP;
    END sp_sample;By compling the above code I getting error like this
    ORA-06531-Reference to uninitialized collection.
    Thanks in advance.

    ... and The Holly Book of All PL/SQL Programmers (also known as: Oracle® Database PL/SQL Language Reference) says:
    Collection Initialization
    Until you initialize it, a nested table or varray is atomically null; the collection itself is null, not its elements. To initialize a nested table or varray, you use a constructor, a system-defined function with the same name as the collection type. This function constructs collections from the elements passed to it.
    You must explicitly call a constructor for each varray and nested table variable. Associative arrays, the third kind of collection, do not use constructors. Constructor calls are allowed wherever function calls are allowed.
    Example 5-10 initializes a nested table using a constructor, which looks like a function with the same name as the collection type.
    Example 5-10 Constructor for a Nested Table
    DECLARE
    TYPE dnames_tab IS TABLE OF VARCHAR2(30);
    dept_names dnames_tab;
    BEGIN
    dept_names := dnames_tab('Shipping','Sales','Finance','Payroll');
    END;
    Because a nested table does not have a declared size, you can put as many elements in the constructor as necessary.------------------------------------------------------------------------------------------------------------------------------
    It's very abstract and not intuitive but there is a difference between 'the collection is NULL (not initialized)' and 'the collection that is not NULL (initialized), but it has no elements' and 'the collection that has all elements NULL'. If you declare a variable of VARCHAR2(30) datatype then Oracle will allocate memory for this variable. However if you have a variable of a collection type then simply declaring it is not enough - you have to call a constructor so Oracle can allocate memory for this variable before it's first use.
    So you can have:
    declare
      p_id t_employee_id := t_employee_id();
      p_name t_employee_name := t_employee_name();
    begin
       p_id(1):=12;
      p_name(1):='no22';
    p_id(2):=300;
    p_name(2):='XXX';
    p_id(3):=4;
    p_name(3):='bn';
      sp_sample(p_id => p_id,
                p_name => p_name);
    end;or simply
    declare
      p_id t_employee_id := t_employee_id (12, 300, 4);
      p_name t_employee_name := t_employee_name ('no22', 'XXX', 'bn') ;
    begin
      sp_sample(p_id => p_id,
                p_name => p_name);
    end;

  • Passing array to Oracle stored procedure

    Is it possible to pass an array (TYPES.Array) to an oracle stored procedure in WLI? I know it can be done in vanilla jdbc.
    I have tried to do this but I'm getting this exception:
    java.sql.SQLException: Fail to convert to internal representation:

    Well well well......I was able to fix the same.
    The implementation for writeSQL is the catch. We need to give the conversion only in that.
    Anyway, thanks.

  • Returning collection-associative array from pl-sql procedure

    CREATE OR REPLACE procedure test_ganesh( p_deptno IN number,gana out PARTIES_RESULT)
    is
    query varchar2(200);
    PARTY_ID varchar2(200);
    PARTY_CODE varchar2(200);
    PARTY_NAME varchar2(200);
    PARTY_SEQ VARCHAR2(200);
    counter number;
    TYPE PARTIES IS TABLE OF varchar2(2000) index by binary_integer;
    txn_parties PARTIES;
    type PARTIES_RESULT IS TABLE OF PARTIES index by binary_integer;
    total_result PARTIES_RESULT;
    TYPE EmpTyp IS REF CURSOR;
    p_du EmpTyp;
    p_cursor EmpTyp;
    global_counter number;
    begin
    global_counter:=1;
    counter:=1;
    open p_cursor FOR
    select A.ref_no
    from ot_lc_txn_details A
    where rownum <12;
    LOOP
    FETCH p_cursor INTO query;
    EXIT WHEN p_cursor%NOTFOUND;
    counter:=1;
    open p_du FOR
         select party_id,party_code,seq_no,party_name from ot_txn_party where ref_no=query;
         LOOP
         FETCH p_du INTO PARTY_ID,PARTY_CODE,PARTY_SEQ,PARTY_NAME;
         EXIT WHEN p_du%NOTFOUND;
         txn_parties(counter):=PARTY_ID || '&&&' || PARTY_CODE || '&&&'||PARTY_SEQ || '&&&' || PARTY_NAME;
              counter:=counter+1;
         END LOOP;
         CLOSE p_du;
    total_result(global_counter):=txn_parties;
    global_counter:=global_counter+1;
    END LOOP;
    CLOSE p_cursor;
    --open gana FOR SELECT * FROM table(cast(total_result as PARTIES_RESULT)) ;
    end;
    The error comes at line one, PLS-00905- object PARTIES_RESULT is invalid.
    i have used the create type thing to create this type.
    if i remove the out parameter it works, no compilation error.
    Questions i) How to return the associative array as out parameter?
    ii)Am i doing aynthing qrong here?
    iii) Can i open a ref cursor to this associative array and then return that ref_cursor?
    Please anyone reply back, Thanks in advance
    Message was edited by:
    user649602

    As an example:
    SQL> create type PARTIES is table of varchar2(2000);
      2  /
    Type created.
    SQL> create or replace procedure proc1(p_deptno number,gana out parties) as
      2  begin
      3   select ename
      4   bulk collect into gana
      5   from emp
      6   where deptno = p_deptno;
      7  end;
      8  /
    Procedure created.                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                       

Maybe you are looking for

  • Vendor return in case of procurment against cost centre

    All SAP Gurus, We have procured some spares against Cost Center. Goods are received. But later we found that these are defective, so need to be send back to the vendor. How this can be done in SPA (because do not we  have these components in stock as

  • How to add content source in office 365 ?

    How to add content source in office 365 , where I can add find Manage Content Sources page to click on New Content Source LInk

  • Login prompt appearing when opening Excel Files - SharePoint 2010 SP1 - Office 2007

    hi, i have 2 sites on the same server, 1 at Port 80 and 1 at port 8300 https://contoso.com https://contoso.com:8300 Both are under same AD and credentials. But when users on 8300 port site, tries to open office files such as Word or Excel. In read on

  • Listening to radio using smart phone

    Hi, I'm new to this and a technophobe so please forgive me. I've just had an e-mail from BT advising that i've used more than 7gb of my 10gb. I've recently bought an i-phone and i've downloaded a few apps which i thought might account for this.  Howe

  • Graph, Widget @ Lion OS Server

    Gents, Good day I was very confused to upgrade my Mac mini server from SL server to Lion, so I started with the clients then yesterday I end up upgrading the server to Lion. I feel the server os is changed completely to client OS plus + server Tool .