Index associative arrays in varchar2
Hi allIt 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 '."
Tags: Database
Similar Questions
-
Reg: Index of associative array in varchar2
All,
When I run this program: -.
DECLARE
Score TYPE IS TABLE NUMBER
INDEX BY PLS_INTEGER;score of s;
BEGIN
IF s IS NULL
THEN
Dbms_output.put_line ('null');
ON THE OTHER
Dbms_output.put_line ('not null');
END IF;
END;o/p: -.
non-null
He successfully executed & show the correct o/p... But, when I run the present
DECLARE
Score TYPE IS TABLE NUMBER
INDEX BY VARCHAR2 (20);score of s;
BEGIN
IF s IS NULL
THEN
Dbms_output.put_line ('null');
ON THE OTHER
Dbms_output.put_line ('not null');
END IF;
END;It shows the error that is: -.
If s is null then
*
ERROR on line 6:
ORA-06550: line 6, column 4:
PLS-00306: wrong number or types of arguments in the call to 'IS NULL.
ORA-06550: line 6, column 1:
PL/SQL: Statement ignored
I don't get it... only change what I've done here is to say I used the type of string in the second program instead of pls_integer.
Please tell me what exactly.
Thank you
Hello
I understand your question. But we cannot compare a collection without index right? Do you agree with me.
I'm saying that IF s IS NULL - this is not a valid statement. As far as I know, we cannot compare the entire collection without using the index.
We must compare as below
DECLARE
Score TYPE IS TABLE NUMBER
INDEX BY PLS_INTEGER;score of s;
BEGIN
(1) s: = 100;
(2) s: = 200;
(3) s: = 500;
S IF (1) IS NULL
THEN
Dbms_output.put_line ('null');
ON THE OTHER
Dbms_output.put_line ('not null');
END IF;
END;-Index by VARCHAR2
DECLARE
Score TYPE IS TABLE NUMBER
INDEX BY VARCHAR2 (20);score of s;
BEGIN('a') s: = 100;
IF s ('a') IS NULL
THEN
Dbms_output.put_line ('null');
ON THE OTHER
Dbms_output.put_line ('not null');
END IF;
END;See you soon,.
Suri
-
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 MEETINGALOC 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
-
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 ideasuser13710379 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.
-
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!
-j900685 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.
-
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?
ConcerningDon'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.
-
Associative arrays... items in the index
I can control the index of an associative array like that...
How can I control the index in the statement of collection in bulk as follows... so that I can delete records using this indexTYPE 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;
Thank youSELECT decode(mod(rownum,2),1,1,2), object_name BULK COLLECT INTO aa_recs FROM all_objects WHERE ROWNUM <= 6;
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). :-)
-
Using associative arrays in query
Hi all
Please see my schedule. It works very well
[CODE]
DECLARE
type mechanics_type_tab is table of index varchar2 (15) by varchar2 (15);
l_mechanics_type mechanics_type_tab;
L_BULLETIN t_tfo_wf_varchar_table:=t_tfo_wf_varchar_table();
l_count pls_integer: = 0;
BEGIN
FOR I IN (select bulletin_id, mechancs_type_id
of TFO_BULLETIN_PROMO_MECHANICS
where mechancs_type_id is not null) LOOP
l_count: = l_count + 1;
l_mechanics_type (i.bulletin_id): = i.mechancs_type_id;
l_mechanics_type (i.mechancs_type_id): = i.mechancs_type_id;
L_BULLETIN.extend;
L_BULLETIN (l_count): = i.bulletin_id;
END LOOP;
FOR J IN (SELECT TABLE COLUMN_VALUE (L_BULLETIN)) LOOP - this will change
DBMS_OUTPUT. Put_line ('COLUMN_VALUE =' | l_mechanics_type (J.COLUMN_VALUE));
END LOOP;
/ * does not
Insert into test_table (test1)
SELECT values l_mechanics_type (COLUMN_VALUE) OF TABLE (L_BULLETIN); */
END;
[/ CODE]
instead of the code below:
FOR J IN (SELECT TABLE COLUMN_VALUE (L_BULLETIN)) LOOP - this will change
DBMS_OUTPUT. Put_line ('COLUMN_VALUE =' | l_mechanics_type (J.COLUMN_VALUE));
END LOOP;
When I did as below
[CODE]
insert into test_table (test1) to
SELECT values l_mechanics_type (COLUMN_VALUE) OF TABLE (L_BULLETIN);
[/ CODE]
It does not work. Why it does not work.
Please note that in the real-world scenario, there are several fields to insert for test_table and test1 is one of them.
Just because the associative arrays are not supported in SQL before ORACLE 12 c.
HTH
-
Associative array as a type of database
As it is very well create an associative array inside a stored procedure:
type urltype is table of varchar2(32767) index by varchar2(30);
Can it be created as a type of database at the level of the schema?
Brian.McGinity wrote:
As it is very well create an associative array inside a stored procedure:
- type urltype is the table of index varchar2 (32767) by varchar2 (30);
Can it be created as a type of database at the level of the schema?
Non - associative arrays are a function of PL/SQL.
See table 5-1 in the doc of the PL/SQL language for a description of each type of collection and where (pl/sql, sql, etc.) they can be used.
http://docs.Oracle.com/CD/E11882_01/AppDev.112/e25519/composites.htm#CHDBHJEI
-
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
-
Quoting docs.oracle.com lines
Associative arrays are used to represent sets of data of arbitrary size, with quick search of an individual element without its position in the table and without
having to loop through all the elements in the array. Here is a small example
DECLARE
TYPE population_type IS TABLE OF NUMBER INDEX OF VARCHAR2 (64);
country_population population_type;
continent_population population_type;
howmany NUMBER;
that VARCHAR2 (64);
BEGIN
country_population ('Greenland'): = 100000; -Creates the entry
country_population ('Iceland'): = 750000; -Creates the entry
-Research associated with a value chain
howmany: = country_population ('Greenland');
continent_population ('Australia'): = 30000000;
continent_population ('Antarctica'): = 1000; -Creates the entry
continent_population ('Antarctica'): = 1001; -Replaces the previous value
-Returns "Antarctic" which comes first in alphabetical order.
who: = continent_population. FIRST;
-Returns "Australia", which comes last in the alphabetical order.
who: = continent_population. LAST;
-Returns the value corresponding to the last key, in this
-case of the Australia population.
howmany: = continent_population (continent_population. LAST);
END;
/
my doubt is in what regards the statement "with a quick search of an individual element without its position in the table".can someone give a small relevant example. Therefore the associative arrays is also appropriate for relatively small lookup tables where the collection can be constructed in memory eachtime, a procedure is called? Thanks in advance...>
my doubt is in what regards the statement "with a quick search of an individual element without its position in the table".can someone give a small relevant example.
>
Think of it as gradually close equivalent to a hash of key/value pairs. When you want to insert an item provide you the key, Oracle axe key to find the entry in the hash table. It doesn't matter if the entry is the first, last, or any other arbitrary position in the table.
>
Therefore the associative arrays is also appropriate for relatively small lookup tables where the collection can be constructed in memory eachtime, a procedure is called?
>
The scope of the variables of the procedure is only the duration of the procedure. They are built when the procedure is called and destroyed when the procedure ends.If any associative array created in the procedure must be small to minimize the impact on the performance of the table fill. If the procedure performs complex calculations or ETL one record at a time, it is more efficient to get a value from the array instead of having to re - query a database table for him.
For example, for the United States, a list of 50 State and their full name abbreviations that can be stored in an associative array and procedure could extract the code of the State of a data element, and quickly find the name of the State of the table. It would be faster than executing a query on the database on a lookup table.
-
Check if a value is in an associative array?
Hello
I am writing a process to plug into an existing infrastructure. I have an associative array of data (that I can't change the definition of) which is defined as:
type vc_arr2 is table of the varchar2 (32767) index directory.
An example of a data set can be:
Now I need to be able to see information indicating if a specific text value appears in the values, that is to say "is"Bananas"in the table? Now of course I could do it by writing a procedure loop over all the elements in order but there at - it do something built that? There are the obvious overhead (potentially) to loop through each element for each item, I'm looking for - I hope that there is something built in which more effective (IE, 'index' values or something like that).Key Text 1 => Apple 2 => Banana 3 => Pear 4 => Plum 5 => Grape etc etc
As far as I know, ARRAY. Exists() works on the key and not the value, and MEMBER OF cannot be used with associative arrays.
I'm not interested in what the key is for a given value (and I realize, it may be more than one key mapping to a given value), all I want is just if the element exists in the table.
Any help or suggestions would be greatly appreciated!No, you will need to loop through each of them, as your index finger is not on the text.
No reason to use an associative array in the first place? Why not use database and SQL tables? Oracle is good at those. ;)
-
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>
Maybe you are looking for
-
Why the update of the app Politico says it isn't compatible my current iPhone running iOS 5?
Update of the App Store of Politico APP does not download update indicating that it is "not compatible my iPhone 5" running iOS 9.2?
-
I have a hp Deskjet 3520 printer all in one and it has always been great so far. I recently put all new hp ink cartridges, but black will not work.
-
TRANSFER OF PHOTOS TO IMAGEBROWSER EX ON SD CARD
I transferred photos from the SD card in my camera in ImageBrowser EX on my laptop. I would like to transfer 100 of these images in ImageBrowser EX on a SD new card (F.) What are the steps in ImageBrowser EX to transfer these s pic on the new SD c
-
During software installation, said you that "we have no admin rights. However logged as administrator but not receive administrative rights. How can I get the permissions for all users and files so that I can complete a Setup?
-
Disable scrolling on the screen after some records
Hi all I'm working on Eclipse JDE 4.2.1... i want to create a screen where I add fields to display in a dynamic way of vector... I want to disable the scrollling on the screen as soon as vector is empty... pls look for it...