Skip to Main Content

Analytics Software

Announcement

For appeals, questions and feedback about Oracle Forums, please email oracle-forums-moderators_us@oracle.com. Technical questions should be asked in the appropriate category. Thank you!

How to handle Unstructured Text file in ODI ?

3408387May 3 2017

I have a text file having this kind of data

REC_CODE ORDER_ID    CUSTOMER_ID   ORDER_DATE

ORD  1     1 01-01-2001

LIN 1   1    1 1

LIN    1 2 2   3

LIN   1 3  1   2

ORD 2 3    02-01-2001

LIN      2 1 1 1

LIN 2    2 2 3

LIN 2   3 1   2

If you see this data carefully ORD corresponds to the Order Level details where as LIN corresponds to Line details of the Order, The problem is the file is not delimited or having fixed width this varies as you can see there are single space and multiple spaces in file.

Any suggestions on handling this in ODI to import the data and process it ? I tried File technology for this since it is unstructured i was not able to get through the first step.

Comments

Cookiemonster76

Seeing as your create table doesn't work, that's hardly surprising.

You can't have a column called number.

Your code refers to a variable called number that doesn't exist - and couldn't exist if you actually declared it due to the name. You probably want to use p_od instead.

Fix your naming and try again. If you're still having problems post the revised code, along with the details of any errors you get and we'll help you out.

Saubhik
Answer

This can be done in single SQL like

INSERT INTO numbers

select lvl from

(select level lvl from dual

   connect by level <=100

)

where mod(lvl,2)=0 ;

By the way DO NOT name a column as NUMBER, this is bad practice as that is a Oracle key word.

Assuming this is homework and you need to do like what teacher suggested then you can do something like

CREATE OR REPLACE PROCEDURE insert_even IS

BEGIN

for i in 1..100 loop

   IF mod(i,2)=0

   then

    INSERT INTO numbers values(i);

   end if;

end loop;

end;

CREATE OR REPLACE PROCEDURE insert_even IS

p_od NUMBER:=1;

p_do NUMBER:=100;

BEGIN

  loop

   IF mod(p_od,2)=0

   then

    INSERT INTO numbers values(p_od);

   end if;

   p_od := p_po+1;

   exit when p_od>p_do;

end loop;

end;

NOTE: I haven't tested any of the above, So you need to write, debug and test.

Marked as Answer by xiobijaph · Sep 27 2020
Manik

Saubhik wrote:

This can be done in single SQL like

INSERT INTO numbers

select lvl from

(select level lvl from dual

connect by level <=100

)

where mod(lvl,2)=0 ;

Without subquery:

------------------------

SELECT LEVEL * 2 lvl

      FROM DUAL

CONNECT BY LEVEL <= 50;

Another way using sequence :

create sequence seq_even start with 2 increment by 2;

Cheers,

Manik.

xiobijaph

I changed names and still doesn't work
pastedImage_0.png

Cookiemonster76

Of course it doesn't.

IF mod(another,2) =0

That refers to a PL/SQL variable/parameter called 'another'.

There's no such variable declared.

There's a column of that name but you have no use for it at that point.

Likewise

INSERT INTO excercise values(another)

Trying to insert the column into itself doesn't really make sense does it?

Meanwhile you've got a variable called p_od which you are incrementing in the loop. Don't you think it would make more sense to use that instead?

BrunoVroman

Hello,

you have already seen previous answers, I won't repeat the same; but apart form using a simple statement (INSERT ... LEVEL ... -I would insert " 2 * LEVEL"-), two additional remarks:

-A- writing code like "p_od := 1; LOOP p_od := p_od + 1: IF mod( p_od, 2 ) = 0 THEN ... EXIT WHEN p_od = p_do ..." looks really sad...

To give simply one example: you might jump the odd numbers: FOR i IN 1..50 LOOP INSERT ... 2 * i ... END LOOP;

-B- and please take the 2 minutes necessary to modify your "display name" to something more human-friendly, currently you look like a "bot"... Please have a look at

Best regards,

Bruno Vroman.

P.S. better late than never: Season's greetings, Oracle-mathematical way

xiobijaph

Saubhik napisał(-a):

This can be done in single SQL like

INSERT INTO numbers

select lvl from

(select level lvl from dual

connect by level <=100

)

where mod(lvl,2)=0 ;

Yeah, its work, but I need to use procedure

I used your second option

pastedImage_1.png
No errors, but still 'no data found'

And third example:pastedImage_2.png

Saubhik

You need to RUN the procedure you have created. Creating procedure is different from EXECUTING the procedure.

BEGIN

your_procedure_name;

END;

Gaz in Oz

Using a while loop, here's an example anonymous PL/SQL block demonstrating, well, a while loop:

declare

  p_od NUMBER := 2;

  p_do NUMBER := 100;

begin

  while true loop

      -- INSERT INTO numbers (p_od) VALUES (p_od);

      dbms_output.put_line(p_od);

      p_od := p_od + 2;

      exit when p_od > p_do;

  end loop;

end;

/

...your variable naming is not good. Naming variables the same as the columns in a table you are trying to manipulate will result in maintenance issues because the code looks ambiguous.

Manik

Gaz in Oz wrote:

Using a while loop, here's an example anonymous PL/SQL block demonstrating, well, a while loop:

  1. declare
  2. p_odNUMBER:=2;
  3. p_doNUMBER:=100;
  4. begin
  5. whiletrueloop
  6. --INSERTINTOnumbers(p_od)VALUES(p_od);
  7. dbms_output.put_line(p_od);
  8. p_od:=p_od+2;
  9. exitwhenp_od>p_do;
  10. endloop;
  11. end;
  12. /

...your variable naming is not good. Naming variables the same as the columns in a table you are trying to manipulate will result in maintenance issues because the code looks ambiguous.

Even if you remove 'while true'  it would work

Cheers,

Manik.

Cookiemonster76

If you're going to demo a while loop, wouldn't it be an idea to have one that actually acts like a while loop? (where the WHILE check actually evaluates to false at some point and exits that way)

e.g.

declare

  p_od NUMBER := 2;

  p_do NUMBER := 100;

begin

  while p_od <= p_do loop

      -- INSERT INTO numbers (p_od) VALUES (p_od);

      dbms_output.put_line(p_od);

      p_od := p_od + 2;

  end loop;

end;

/

xiobijaph

Ok, now I have results. Thank you

L. Fernigrini

Please then take 15 seconds to mark correct and useful answers, and remember to set your user name to something more meaningful than "9910aa55-1382-4bbb-8a9b-338b89308abe"

xiobijaph

I changed user name 1 minute after register but still doesnt work:
pastedImage_0.png

Cookiemonster76

Most of us can't read Polish, and we can't copy and paste the text from that image into google translate.

xiobijaph

Nothing important:

"Thanks for joining to community Oracle, you will find here answers on your questions. You can contact with others people...

Display name: xiobijaph"

Nevermind, maybe after some time my name will update

1 - 16
Locked Post
New comments cannot be posted to this locked post.

Post Details

Locked on May 31 2017
Added on May 3 2017
0 comments
200 views