Associative array of index files by varchar2 - PLS 00382

I have a SQL anonymous block that creates a report. At the end of each section, I need to summarize the data by "renting". The list of locations is finished (approx. 15 in a table) and not all sections will have data for each location, but I want the locations to order the same so I thought I'd use an associative array to store summary data. But when I try to initialize the associative array (I simply put the slots in the array in the "correct" order) I receive PLS-00382 expression is of the wrong type.

Here is the code (the lines where the error occurs are in bold):

TYPE summary_data () IS RENDERING
Summary1 NUMBER,
NUMBER of summary2
NUMBER of summary3
);

Summ_arr TYPE IS TABLE of summary_data INDEX OF VARCHAR2 (5);

location_summary summ_arr;

aLoc VARCHAR2 (5);

PROCEDURE init_summ (aSummArr IN OUT summ_arr) IS
BEGIN
aSummArr.Delete;

BEGIN
FOR in aLoc (select name - name is VARCHAR2 (5))
table
control key)
LOOP
aSummArr (aLoc) .summary_1: = 0;
aSummArr (aLoc) .summary_2: = 0;
aSummArr (aLoc) .summary_3: = 0;
END LOOP;
EXCEPTION
-exception handling
END;

END;

If this is not allowed, or I do something wrong? I tried substituting:

Summ_arr TYPE IS TABLE of summary_data INDEX OF VARCHAR2 (5);

with

Summ_arr TYPE IS TABLE of summary_data INDEX table.key%TYPE;

Nothing helps.

Thanks in advance for your help with this.

ANNUAL GENERAL MEETING

ALOC is a record variable. You need to refrence the column in the file said. So, something like this:

aSummArr(aLoc.name).summary_1 := 0;

Cheers, APC

Tags: Database

Similar Questions

  • An associative array in PL/SQL: key = varchar2, value = varray (varchar2)

    I'm doing an associative array, where the key is a string and the value is an array of strings.

    I tried to declare it like this:

    PROCEDURE myProcedure IS
    tableau_donnees argument type is varray (200) of VARCHAR2 (20);
    Column TYPE IS an ARRAY OF tableau_donnees INDEX BY VARCHAR2 (20);
    my_collection columns; -collection of multi dimensional pl/sql
    BEGIN
    my_collection ('test') (1): = "Hello"; -It is the idea...
    "my_collection ('test') (2): = ' 8128 is the number";
    my_collection ("some other field' ') (1): = 'foo';
    -etc etc.

    But I get the error Oracle ORA-06531, reference to an uninitialized collection:

    Cause: A service of element or member of a nested table or varray has been referenced (where an initialized collection is necessary) without the collection has been initialized.

    Action: Initialize the collection with an appropriate constructor or assignment of the whole object.

    I tried to use 'extend()' initialize the varray, but no help...
    my_collection('test').extend (200);

    -----
    I also tried this:

    PROCEDURE myProcedure IS
    Data TYPE of TABLE IS OF VARCHAR2 (20);
    Column TYPE IS an ARRAY OF data INDEX BY VARCHAR2 (20);
    my_collection columns; -collection of multi dimensional pl/sql


    But it's always the same. I am quite new to PL/SQL, if any help would be great!


    -j

    900685 wrote:
    I'm doing an associative array, where the key is a string and the value is an array of strings.

    create or replace
      procedure myProcedure
        is
            type data_array
              is
                varray(200) of varchar2(20);
            type coltype
              is
                table of data_array
                index by varchar2(20);
            my_collection coltype;
        begin
            my_collection('test') := data_array('hello','8128 is the number');
            my_collection('some other field') := data_array('foo');
    end;
    /
    

    And if you want to add elements in varray:

    create or replace
      procedure myProcedure
        is
            type data_array
              is
                varray(200) of varchar2(20);
            type coltype
              is
                table of data_array
                index by varchar2(20);
            my_collection coltype;
        begin
            my_collection('test') := data_array('hello');
            my_collection('test').extend;
            my_collection('test')(2) := '8128 is the number';
            my_collection('some other field') := data_array('foo');
    end;
    /
    

    Or:

    create or replace
      procedure myProcedure
        is
            type data_array
              is
                varray(200) of varchar2(20);
            type coltype
              is
                table of data_array
                index by varchar2(20);
            my_collection coltype;
        begin
            my_collection('test') := data_array(); -- initialize
            my_collection('test').extend;
            my_collection('test')(1) := 'hello';
            my_collection('test').extend;
            my_collection('test')(2) := '8128 is the number';
            my_collection('some other field') := data_array('foo');
    end;
    /
    

    SY.

  • Index associative arrays in varchar2

    Hi all
    It seems that associative arrays are indexes by varchar2
    automatically sorted by index value.
    Please run this test:
    declare 
    
      TYPE TEST_ARRAY IS TABLE OF VARCHAR2(10) INDEX BY VARCHAR2(10);
      aTest TEST_ARRAY;
      
      cIndex VARCHAR2(10);
    begin
      -- Test here
      aTest('X') := 'X';
      aTest('A') := 'A';
      aTest('C') := 'C';
      aTest('Z') := 'Z';
      aTest('C') := 'C';
      aTest('B') := 'B';
      aTest('AB') := 'AB';
      aTest('12') := '12';
      
      cIndex := aTest.FIRST;
      while cIndex IS NOT NULL LOOP
              dbms_output.put_line('aTest('||cIndex||')='||aTest(cIndex)); 
              cIndex := aTest.NEXT( cIndex );
      END LOOP;
       
    END;
    Now, the questions are:
    1. are you aware of the documentation of Oracle that describe the behavior above?
    2. are you aware of no example where associative arrays index in varchar2
    is not sorted by its index? (Finally, except changing the NLS_SORT setting)
    3. is it safe to use this feature of "sort"?

    Thank you
    Thomas

    1. are you aware of the documentation of Oracle that describe the behavior above?

    " Associative arrays: ' indexes are stored in the sort order, not order of creation '."

  • What is the difference between associative arrays and nested tables?

    Hello
    What is the difference between associative arrays and nested tables?

    nested tables cannot be indexed by other than pls_integer and unlike nested tables table associative cananot be declared at the schema level.

    is there any other difference set apart from the diff above 2?

    user13710379 wrote:
    What is the difference between associative arrays and nested tables?

    Name-value pairs (associative) against a list of values (table standard/nested table).

    nested tables cannot be indexed by other than pls_integer

    They are not "indexed" the way in which an associative array is indexed. A standard table is referenced by the position of the cell in the table. This position is essentially the offset of the memory of the cell from the start address of the table.

    Can not solve a cell in an associative array directly via a memory offset index. You place a cell reference value it by his 'name' (a search in the linked list/hash table).

    The following example shows the difference between the pairs of name / value and a list of core values.

    SQL> declare
      2          --// associative arrays are NAME-VALUE pairs
      3          type TArr1 is table of varchar2(10) index by pls_integer;
      4          type TArr2 is table of varchar2(10) index by varchar2(10);
      5
      6          arr1    TArr1;
      7          arr2    TArr2;
      8  begin
      9          arr1(100) := '1st entry';
     10          arr1(1) := '2nd entry';
     11          arr1(5) := '3rd entry';
     12
     13          arr2('john') := 'New York';
     14          arr2('jane') := 'Paris';
     15          arr2('jack') := 'London';
     16
     17  end;
     18  /
    
    PL/SQL procedure successfully completed.
    
    SQL>
    SQL>
    SQL> declare
      2          --// standard arrays are lists
      3          type TArr3 is table of varchar2(10);
      4          type TArr4 is table of number;
      5
      6          arr3    TArr3;
      7          arr4    TArr4;
      8  begin
      9          arr3 := new TArr3( '1st entry', '2nd entry', '3rd entry' );
     10
     11          arr4 := new TArr4( 100, 1, 5 );
     12  end;
     13  /
    
    PL/SQL procedure successfully completed.
    
    SQL> 
    
  • join an associative array with table

    I'm new to associative arrays.

    Here, I'm doing the equivalent of as follows:
     create table mytable as select n1,padding from T1 where rownum <=5;
    Table created.
    And join this table with T1 and the corresponding records to get top 10
      1   SELECT * FROM
      2   (
      3     SELECT
      4              T1.n1
      5            , T1.small_vc
      6            , mytable.padding
      7      FROM
      8             mytable
      9            , T1
     10      WHERE
     11            mytable.n1 = T1.n1
     12   )
     13* WHERE ROWNUM <= 10;
    Now with the assicative bays
      1  DECLARE
      2          type array is table of T1%rowtype index by binary_integer;
      3          l_data array;
      4          l_rec T1%rowtype;
      5  BEGIN
      6          SELECT
      7                    *
      8          BULK COLLECT INTO
      9          l_data
     10          FROM T1
     11          WHERE ROWNUM <=5;   -- the top 5 records
     12          FOR i IN 1..l_data.count
     13          LOOP
     14                BEGIN
     15  --
     16               SELECT
     17                     *
     18               INTO
     19                     l_rec
     20               FROM
     21                     T1
     22               WHERE
     23                     T1.n1 = l_data(i).n1;
     24             EXCEPTION
     25               WHEN OTHERS THEN
     26                       DBMS_OUTPUT.PUT_LINE(to_char(SQLCODE) || ' - ' || substr(SQLERRM,1,200));
     27        END;
     28     END LOOP;
     29* END;
    [email protected]> /
    -1422 - ORA-01422: exact fetch returns more than requested number of rows
    -1422 - ORA-01422: exact fetch returns more than requested number of rows
    -1422 - ORA-01422: exact fetch returns more than requested number of rows
    -1422 - ORA-01422: exact fetch returns more than requested number of rows
    -1422 - ORA-01422: exact fetch returns more than requested number of rows
    Of course the encoding isn't fair. Also, I want to display the first 10 results set.

    Thank you

    Mich

    Talebzadeh mich wrote:

    Does it fast enough and I think it is necessary for using the pipeline to multiple joins functions to update the tables of FACTS so to speak.

    A pipeline returns data that are not indexed. So by default, using data from a pipeline function involves a full production table scan. That's why native SQL tables are better than a pipeline - as these are accessible and used optimally (via the index partitions, bitmaps, clusters, etc.).

    Since PTFS uses memory structures as associative arrays do, what are the main benefits of using TFP compared to the associative arrays in addition to the fact that in MFP memory structures are presented in the SQL format?

    Not the same structure. An associative array is typically a list linked and "indexed" differently.

    A normal array is accessible by compensation. Let's say it's an array of bytes 4 IEEE floats. 1st entry is at position 0 in the structure of memory. The 2nd entry at position 4. Etc.

    Index number of the table is used to determine the offset of this table cell in the structure of memory.

    An associative array is "indexed" using strings or dates or numbers (not sequential). Thus a structure like a linked list must be used. Access to the range means a search in this linked to the match index list and then read the value of this cell in the table.

    The associative arrays do exist in the SQL engine. It is a unique data structure of PL/SQL engine.

    As to the benefits of a pipeline - this is when the data must be processed and plain vanilla SQL is not able to do this and PL/SQL is required.

    Simple example. A flat web service XML data structure. A table of pipeline can use UTL_HTTP to make the service web call, retrieve the XML code and that the output data as rows and columns - in effect turning a web service interface into something that looks like a SQL table and can be used as if it were a table SQL.

    Reading Tom on the use of pipelines comments:
    http://asktom.Oracle.com/pls/asktom/f?p=100:11:2814739467100916:P11_QUESTION_ID:19481671347143

    Also when can I use associative arrays functions insteard table in pipeline?

    Associative arrays are useful for the only PL/SQL data. For example, which deals with the pair name / value that are placed by a customer and that are used to determine which query or process data. For the majority of the PL/SQL code and the treatment, associative arrays are not necessary. And often wrongly used that developers do not seem to understand what an associative array is and how it differs from a normal table structure.

  • What is the preferred means of data transmission as a type of record between the nested table of pl/sql program or an associative array

    What is the preferred means of data transmission in the associative array of the nested table record vs

    Choose between Nested Tables and associative arrays

    The two nested tables and associative arrays (formerly index - by tables) use similar index notation, but they have different characteristics when it comes to persistence and ease of passing parameters.

    Nested tables can be stored in a column of data, but can of associative arrays. Nested tables can simplify the SQL operations where you would normally join a single-column table with a larger table.

    Associative arrays are appropriate for relatively small lookup tables where the collection can be constructed in memory whenever a procedure is called or a package is initialized. They are good for the collection of the information volume is unknown beforehand, because there is no fixed limit on their size. Their index values are more flexible, as associative array indices can be negative, can be no sequential and can use values of string instead of numbers.

    PL/SQL automatically converts between the bays of the host and the associative arrays that use values of digital keys. The most effective way to move the collections to and from the database server is to implement data values in associative arrays, and then use these associative arrays with erections in bulk (the FORALL statement or BULK COLLECT clause).

    With the help of documents and Collections of PL/SQL

    Read this:

    How to pass the record set as a parameter of the procedure.

    https://community.Oracle.com/thread/2375173?TSTART=0

  • PLS-00201 when adressing field in an associative array

    To calculate the scores, I created an associative array that contains the totals of players until last week.

    In a loop, I can make each player and add their scores this week to their total of last week.

    Code:

    Associative array:
    italics
    create or replace
    TYPE "NUMBER_ARRAY" in the table of the number;

    cur_vorige_totalen_array number_array;

    FOR r_vorige_totalen in c_vorige_totalen (ld_training_dag)
    LOOP
    cur_vorige_totalen_array.extend;
    cur_vorige_totalen_array (r_vorige_totalen.lidnummer): = r_vorige_totalen.totaal_punten_dit_seizoen;
    END LOOP;
    italics

    To add the total to the current scores can do:
    italics
    OPEN c_huidige_totalen.
    LOOP
    Get the c_huidige_totalen COLLECT LOOSE cur_totalen_array LIMIT 100;
    EXIT WHEN c_huidige_totalen % NOTFOUND;
    END LOOP;
    CLOSE C_huidige_totalen;

    FORALL i IN cur_totalen_array. FIRST... cur_totalen_array. LAST
    Training_aanwezigheid UPDATE your
    SET ta.totaal_punten_dit_seizoen TREAT (cur_totalen_array (i) AS huidige_totalen_type) = .totaal_punten_dit_seizoen + cur_vorige_totalen_array (ta.lidnummer)
    WHERE ta.lidnummer = TREAT (cur_totalen_array (i) AS huidige_totalen_type) .lidnummer
    AND ta.training_id = p_training_id;
    italics

    I get an error PLS-00201 (ta.lidnummer must be set) on "BOLD" cur_vorige_totalen_array (ta.lidnummer) "BOLD"

    Is it not possible to address ta.lidnummer in this way? How can I solve my problem in this case?

    TX for your advicec

    Hello

    Discover FORALL statement Chater:
    http://download.Oracle.com/docs/CD/B19306_01/AppDev.102/b14261/forall_statement.htm#i34324
    Your code is not to comply with these restrictions:
    >
    -Part of a loop FORALL, impossible to make reference to the collection even in both the SET clause and the WHERE clause of an UPDATE statement. You need to maybe make a second copy of the collection and the new name in the WHERE clause.
    -Impossible to refer to the individual record fields in the DML statements called by a FORALL statement. Instead, you can specify the entire file with the ROW SET clause in an UPDATE statement, or the VALUES clause in an INSERT statement.
    -Indexes collection should be just the index rather than an expression variable, such that I rather than I + 1.
    >
    The last restriction is because you use this:
    FORALL i IN cur_totalen_array. FIRST... cur_totalen_array. LAST
    Training_aanwezigheid UPDATE your
    SET ta.totaal_punten_dit_seizoen = TREAT (cur_totalen_array (i) AS huidige_totalen_type) .totaal_punten_dit_seizoen
    + cur_vorige_totalen_array ( ta.lidnummer )

    Single index variable is allowed as a clue - you cannot use variable I have here.

    Published by: kordirko on 2010-10-20 23:38

  • need help in the associative arrays indexed by varchar

    Hi, I wanted to fill an associative array that is indexed by varchar, but I'm confused by incrementing the pointer so that the next lines gets inserted into the next available place.
    sample data:
    type ty_tb_tab_acc is record (account varchar2 (30));
    type ty_tb_indx_acct is table of index ty_tb_tab_acc by varchar2 (35);

    cursor sampls_cursor is
    Select an account in sam_tab where the clause goes in here

    say that my cursor returns 20 accounts. now, I want these 20 accounts will be inserted in the table associative ty_tb_indx_acct
    How should I buckle and incrment table?

    Please share your ideas

    user13710379 wrote:
    If this isn't the case, associatve tables approach I should use.
    My requirement:
    1.i will be 2 sliders who choose (type varchar2) account number according to diff where clause.
    2. then, I need to compare these two cusrsor account number and fill out a folder or a collection, if the two account numbers are the same.

    This must be done using SQL. Not the tables or collections or associative arrays.

    SQL is the MOST powerful language, that you have in the Oracle RDBMS. It is faster than PL/SQL, when it comes to crunch data. It is more scalable.

    So why then pull data SQL in PL/SQL (expensive) memory? And then shoot some more SQL data in memory of PL/SQL (expensive)? And then use PL/SQL loop processing to compare the two sets of data?

    SQL can do that very quickly and very efficiently - as it was designed for this specific purpose.

    See the JOIN, INTERSECT , and LESS SQL operations to compare data sets.

  • The associative arrays, insert, rownum as index loop or not.

    Hi guys,.
    I want to keep this subset of rows around 5000 in a collection / table temporary but don't know how to do it. have not found much on google either.
    the associative array seems good because it has no limit (and it may be more than 5000) and it offers a quick access.

    DECLARE
    TYPE assoc_array_str_type IS TABLE OF VARCHAR2 (32) INDEX OF PLS_INTEGER;
    assoc_array_str_type v1.
    BEGIN

    (23231) v1: = 10;

    -Select distinct rownum, rmnumber made in v1.

    END;

    I thought that I have use rownum as index but have the feeling that I can't 'load' a set of data both in the associative array. I need to loop and then add one don't I? is there a faster way?

    You can use in bulk to collect:

    declare
       type assoc_array_str_type is table of varchar2(32) index by pls_integer;
       v1 assoc_array_str_type;
    begin
       select ename
       bulk collect into  v1
       from   emp;
    
       dbms_output.put_line('v1(1)='||v1(1));
       dbms_output.put_line('v1(2)='||v1(2));
    end;
    /
    v1(1)=KING
    v1(2)=BLAKE
    
  • How to get the 'index' of an associative array?

    Hello

    Is it possible to get the 'index' of an associative array?

    I saw say about 3000 ID.

    Corresponding to each of these identifiers, thre is a 'key' (the 'key' can repeat for different ID)... tell key1, key2, key3.

    Now, I want to show the top of page 8 keys ().

    Could you please tell me how can I do this?

    Concerning

    Don't know what you are exactly looking for.

    To get the index of an array of assotiative you should do something like

    SQL> declare
       type arr is table of number
                      index by varchar2 (5);
    
       var   arr;
       idx   varchar2 (5);
    begin
       --  fill the array
       for id in 1 .. 12
       loop
          var ('key' || to_char (id, 'fm00')) := id;
       end loop;
    
    --  get the keys
       idx := var.first;
       dbms_output.put_line (idx);
    
       while idx is not null
       loop
          idx := var.next (idx);
          dbms_output.put_line (idx);
       end loop;
    end;
    /
    key01
    key02
    key03
    key04
    key05
    key06
    key07
    key08
    key09
    key10
    key11
    key12
    PL/SQL procedure successfully completed.
    
  • Implementation of associative array (indexes per Table) in the procedure

    Hi guys,.

    I'm trying to implement collections in the procedure. I am trying to store integer values as well as the names & to print the same list of names. Here is my procedure

    create or replace procedure (coll_proc)

    )

    is

    pay type is table of the index number to varchar2 (20);

    salary_list salary;

    L_Name varchar2 (2000);

    Start

    salary_list ('Aude'): = 62000.

    salary_list ("Mohammed"): = 50000;

    ("Julian") salary_list: = 45000;

    L_Name: = salary_list.first;

    l_name is not null loop

    dbms_output.put_line (' the wages of ' |) L_Name | « est » ||' ='|| TO_CHAR (salary_list (L_Name)));

    L_Name: = salary_list. Next (L_Name);

    end loop;

    end;

    Below is the error

    "Error (2.1): PLS-00103: encountered the symbol") "when expecting one of the following numbers: Remove current exists prior" "

    You people could please check this & tell me that where I'm going wrong.

    Hello

    It seems that you have all the parameters in your stored procedure, so remove the "()" after the name of the procedure.

    create or replace procedure coll_proc
    is
      type salary is table of number index by varchar2(20);
      salary_list salary;
      l_name varchar2(2000);
    begin
      salary_list('Rajnish'):=62000;
      salary_list('Minakshi'):=50000;
      salary_list('Seetha'):=45000;
    
      l_name:= salary_list.first;
      while l_name is not null loop
        dbms_output.put_line('Salary of ' ||l_name|| 'is'||'='|| to_char(salary_list(l_name)));
        l_name:=salary_list.next(l_name);
      end loop;
      end;
    

    I tried this and able to create the procedure

    Procedure created.
    

    Kind regards

    Jitendra

  • Associative arrays... items in the index

    I can control the index of an associative array like that...
     TYPE aat_id IS TABLE OF PLS_INTEGER INDEX BY PLS_INTEGER;
      aa_ids aat_id;
    
    BEGIN
    
         aa_ids(1) := 3;
         aa_ids(2) := 8;
         aa_ids(2) := 10;
         
    aa_ids.delete(2);
    
    dbms_output.put_line(aa_ids.count);
    
    END;
    How can I control the index in the statement of collection in bulk as follows... so that I can delete records using this index
     SELECT decode(mod(rownum,2),1,1,2), object_name BULK COLLECT INTO aa_recs
         FROM   all_objects WHERE  ROWNUM <= 6;
    Thank you
    HESH.

    HESH wrote:

    but I have to play with the collected values, I want to delete the values in bulk without a loop through the list there at - it a trick possible to do this?

    Using not PL/SQL and bays of PL/SQL at all - just using simple native SQL.

    Before bulk collection and construction of an associative array, for the use of the values in table for future SQL operations, I rather to store the collection of values in a TWG (global temporary table) instead. A TWG can be indexed - and can thus provide much better access to the data as an associative array. He played better. It can be used via SQL, native mode.

    The best place for the data is in the database. Not in the PL/SQL layer. This means that in SQL tables and not in PL/SQL tables or collections.

    There are very few situations in PL/SQL, which require the use of associative arrays. If few, the majority of the PL/SQL code using associative arrays, IMO do badly. And what you've posted so far, I do not see a specific requirement for associative arrays.

    So be sure you use the correct feature - and make sure that it is also well put to use in your code.

    PS. HESH is a strange name. I'm used to HESH meaning High Explosive Squash Head (used for the filming of shielding). :-)

  • the associative arrays containing the record type, cannot be used first

    I am having trouble with the declaration of an associative array containing the Types of records and iteration using FIRST and NEXT functions.
    This problem of mine is only appear when I use that types of records, the FIRST and FOLLOWING operators work very well when you use the regular NUMBER.

    Trying to get the first element of the array, I get: ORA-06550: line 22, column 40: PLS 00382: expression is of the wrong type

    See the code snippet below. Anyone know if this can be done in PL/SQL?

    -----------------------------------------------------------------------------------------
    DECLARE


    -Set the record structure that will contain information on a post
    TYPE PostRec IS (RECORD
    post_type VARCHAR2 (4) - maybe DEB/CRED
    );

    lr_charge_back_post PostRec;

    TYPE post_table IS TABLE OF PostRec NOT NULL
    INDEX BY VARCHAR2 (4);

    assoc_posts post_table;

    BEGIN


    -lr_charge_back_post.post_type: = "asd";
    assoc_posts('1').post_type: = '1';

    lr_charge_back_post: = assoc_posts.first;

    END;
    /

    Returns the index, not the file FIRST:

    SQL> declare
      2  TYPE PostRec IS RECORD (
      3  post_type VARCHAR2(4) -- Can be DEB/CRED
      4  );
      5
      6  lr_charge_back_post  varchar2(20);
      7  TYPE post_table IS TABLE OF PostRec NOT NULL
      8  INDEX BY VARCHAR2(4);
      9
     10
     11  assoc_posts post_table;
     12
     13  BEGIN
     14
     15
     16  --lr_charge_back_post.post_type := 'asd';
     17  assoc_posts('1').post_type := '1';
     18
     19  lr_charge_back_post := assoc_posts.first;
     20  dbms_output.put_line('idx='||lr_charge_back_post);
     21  END;
     22  /
    idx=1
    
    PL/SQL procedure successfully completed.
    
    SQL> declare
      2  TYPE PostRec IS RECORD (
      3  post_type VARCHAR2(4) -- Can be DEB/CRED
      4  );
      5
      6  lr_charge_back_post  varchar2(20);
      7  TYPE post_table IS TABLE OF PostRec NOT NULL
      8  INDEX BY VARCHAR2(4);
      9
     10
     11  assoc_posts post_table;
     12
     13  BEGIN
     14
     15
     16  --lr_charge_back_post.post_type := 'asd';
     17  assoc_posts('idx').post_type := '1';
     18  lr_charge_back_post := assoc_posts.first;
     19  dbms_output.put_line('idx='||lr_charge_back_post);
     20  END;
     21  /
    idx=idx
    
    PL/SQL procedure successfully completed.
    

    Max
    http://oracleitalia.WordPress.com

  • Cannot run the autonomous block for input of associative array parameter

    Hello

    I have created an associative array in a package-PKG_CMT_DAP

    TYPE r_supply_type_id IS RECORD(
                                   supply_type_id            varchar2(50));
    TYPE t_supply_type_id IS TABLE OF r_supply_type_id INDEX BY BINARY_INTEGER;
    l_supply_type_id t_supply_type_id;
    

    Later created a test procedure with an input of the above kind parameter

    create or replace
    procedure test_prc(p_in_st_id IN PKG_CMT_DAP.t_supply_type_id)
    AS
    v_input1 number;
    v_input2 number;
    BEGIN
    FOR z IN 1..p_in_st_id.COUNT 
    LOOP
    DBMS_output.put_line(p_in_st_id(z)supply_type_id);
    END LOOP;
    END test_prc;
    

    How to update successfully.

    Created a stand-alone as block below

    DECLARE
    BEGIN
    test_prc(p_in_st_id=>(100,200,300));
    END;
    

    Above am past in 100,200,300 as an input string, and the expected output should display all the numbers above on the screen.

    But it throws the below error

    Error report:
    ORA-06550: line 3, column 1:
    PLS-00306: wrong number or types of arguments in call to 'TEST_PRC'
    ORA-06550: line 3, column 1:
    PL/SQL: Statement ignored
    06550. 00000 -  "line %s, column %s:\n%s"
    *Cause:    Usually a PL/SQL compilation error.
    *Action:
    

    Could you please help me where I am doing wrong?

    Kind regards

    Claudy Kotekal

    Claudy,

    While calling the procedure, you must declare the variable of type table. Give the values for the elements in the begin block and then pass that variable in the procedure. Something like below:

    Declare

    in_array PKG_CMT_DAP. r_supply_type_id;

    Begin

    in_array (1) .supply_type_id: = 100;

    in_array (2) .supply_type_id: = 200;

    in_array (3) .supply_type_id: = 300;

    test_prc (in_array);

    end;

    NOTE: There might be a few problems with my code syntax, but logic would be same.

    Try this and let me know.

    Thank you

  • An associative array, how the records using the loop counter?

    In the associative array, how the records using the loop counter? for example
    declare
        type population is table of number index by varchar2(64);
        city_population population;   
    begin
        city_population('Samillve') := 200;
        city_population('Lindenhurst') := 300;    
        
        for i in 1 .. city_population.count
        loop
            dbms_output.put_line(city_population(i)); -- compiler error
        end loop;
    end;
    /

    That would look like

    SQL> ed
    Wrote file afiedt.buf
    
      1  declare
      2      type population is table of number index by varchar2(64);
      3      city_population population;
      4      l_index varchar2(64);
      5  begin
      6      city_population('Samillve') := 200;
      7      city_population('Lindenhurst') := 300;
      8      l_index := city_population.first;
      9      while( l_index IS NOT NULL )
     10      loop
     11          dbms_output.put_line(city_population(l_index ));
     12          l_index := city_population.next(l_index);
     13      end loop;
     14* end;
    SQL> /
    300
    200
    
    PL/SQL procedure successfully completed.
    

    Justin

Maybe you are looking for