Avatar billede ihtezaz Praktikant
04. december 2008 - 15:43 Der er 4 kommentarer og
1 løsning

pl sql spørgsmål. Steng parameter laves om til array

Hej,

Jeg modtager en streng parameter i min funktion. Denne streng har kommaseparet tekst i sig, det jeg har brug for er at
få de enkelte tekster der er adskilt med et komma, ned i hver deres index i en array. På forhånd tak
Avatar billede pgroen Nybegynder
04. december 2008 - 16:15 #1
Pudsigt, jeg har lige ledt efter det samme, og fandt denne her:

(Jeg ville nok raffinere den lidt, bla. til at anvende regulære udtryk, men den virker såmænd udmærket som den er...)

tp_vc255tab er defineret som:
  TYPE tp_vc255tab IS TABLE OF VARCHAR2 (255);








  FUNCTION str2tbl (
    p_str          IN  VARCHAR2,
    p_field_delim  IN  VARCHAR2 DEFAULT CHR (31),
    p_row_delim    IN  VARCHAR2 DEFAULT CHR (13)
  )
    RETURN tp_vc255tab AS
    l_str    VARCHAR2 (20000);
    l_n      NUMBER;
    l_data  tp_vc255tab      := tp_vc255tab ();
  BEGIN
    l_str := REPLACE (p_str, p_row_delim, p_field_delim);

    LOOP
      l_n := INSTR (l_str, p_field_delim);
      EXIT WHEN (NVL (l_n, 0) = 0);
      l_data.EXTEND;
      l_data (l_data.COUNT) := TRIM (SUBSTR (l_str, 1, l_n - 1));
      l_str := SUBSTR (l_str, l_n + LENGTH (p_field_delim));
    END LOOP;

    RETURN l_data;
  END;
Avatar billede Slettet bruger
04. december 2008 - 21:07 #2
Oracle har en indbygget procedure til det: DBMS_UTILITY.COMMA_TO_TABLE.

Den er egentlig bygget til at lave en liste af tabelnavne om til en tabel med tabelnavne. Derfor er længden af et navn i listen begrænset til 32 karakterer.

Og derfor er pgroens bud nok det bedste generelle svar.

Manual:
http://download.oracle.com/docs/cd/B19306_01/appdev.102/b14258/d_util.htm#i1002468
Avatar billede ihtezaz Praktikant
04. december 2008 - 22:24 #3
Tak for jeres svar, læser jeg det rigtig, at l_data er en array af strenge altså varchar, som jeg kan gennemløbe, således varchar v := l_data[0];

Er ny til PL SQL, så uddyb gerne svaret :)
Avatar billede pgroen Nybegynder
05. december 2008 - 09:10 #4
Et lille eksempel:


SQL> create type tp_vc255tab IS TABLE OF VARCHAR2 (255);
  2  /

Type created.

SQL> create  FUNCTION str2tbl (
  2    p_str          IN  VARCHAR2,
  3    p_field_delim  IN  VARCHAR2 DEFAULT CHR (31),
  4    p_row_delim    IN  VARCHAR2 DEFAULT CHR (13)
  5  )
  6    RETURN tp_vc255tab AS
  7    l_str    VARCHAR2 (20000);
  8    l_n      NUMBER;
  9    l_data  tp_vc255tab      := tp_vc255tab ();
10  BEGIN
11    l_str := REPLACE (p_str, p_row_delim, p_field_delim);
12 
13    LOOP
14      l_n := INSTR (l_str, p_field_delim);
15      EXIT WHEN (NVL (l_n, 0) = 0);
16      l_data.EXTEND;
17      l_data (l_data.COUNT) := TRIM (SUBSTR (l_str, 1, l_n - 1));
18      l_str := SUBSTR (l_str, l_n + LENGTH (p_field_delim));
19    END LOOP;
20 
21    RETURN l_data;
22  END;
23  /

Function created.

SQL> select * from table(str2tbl('a;b;;d;e;f;',';'));

COLUMN_VALUE
---------------------------------------------------------------
a
b

d
e
f

6 rows selected.
Avatar billede ihtezaz Praktikant
07. december 2008 - 18:42 #5
Super, det virkede fint. Tak pgroen. :) tak til dig også joern.
Avatar billede Ny bruger Nybegynder

Din løsning...

Tilladte BB-code-tags: [b]fed[/b] [i]kursiv[/i] [u]understreget[/u] Web- og emailadresser omdannes automatisk til links. Der sættes "nofollow" på alle links.

Loading billede Opret Preview
Kategori
Computerworld tilbyder specialiserede kurser i database-management

Log ind eller opret profil

Hov!

For at kunne deltage på Computerworld Eksperten skal du være logget ind.

Det er heldigvis nemt at oprette en bruger: Det tager to minutter og du kan vælge at bruge enten e-mail, Facebook eller Google som login.

Du kan også logge ind via nedenstående tjenester