Avatar billede dennish Nybegynder
18. april 2008 - 12:35 Der er 6 kommentarer og
1 løsning

Iterer over en collection i PL/SQL

Hejsa jeg har følgende struktur

// adviser type as OBJECT
create or replace TYPE adviser AS OBJECT
EXTERNAL name 'oracle.bean.JAdviser' LANGUAGE JAVA USING SQLData
(
agentKey varchar2(100)
external name 'java.lang.String',

constructor function adviser
return self as result,

member function getKey
return varchar2 as language java
name 'oracle.bean.JAdviser.getKey() return java.lang.String',

member function getSQLTypeName
return varchar2 as language java
name 'oracle.bean.JAdviser.getSQLTypeName() return java.lang.String'
);

// collection at typen adviser
create or replace TYPE ADVISERLIST is TABLE OF adviser;

// funktion der returnerer en ADVISERLIST
create or replace FUNCTION
testFunction (tableName varchar2) RETURN ADVISERLIST
AS LANGUAGE JAVA
NAME 'oracle.bean.TestFunction.getAdvisers (java.lang.String) return oracle.sql.ARRAY';

Jeg prøver via PL/SQL at kalde min funktion testFunction

Hvis jeg skriver
select testFunction('dummy') from dual; virker det
jeg får output

TESTFUNCTION('DUMMY')                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                           
--------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
WEATHR.ADVISER(WEATHR.ADVISER,WEATHR.ADVISER,WEATHR.ADVISER)                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                   

1 rows selected

Dette output er rigtigt idet min funktion returnerer 3 x ADVISER typer i min ADVISERLIST.
Men jeg vil gerne iterere over min collection og f.eks. kalde metoden ADVISER.getKey(). JEg har skrevet følgende PL/SQL

DECLARE
  TYPE collection_advisor is VARRAY(3) of ADVISER;
  kajkvaj collection_advisor;
BEGIN
  kajkvaj := testFunction('dummy');
END;

Men får følgende fejl:

Error starting at line 1 in command:
DECLARE
  TYPE collection_advisor is VARRAY(3) of ADVISER;
  kajkvaj collection_advisor;
BEGIN
  kajkvaj := testFunction('dummy');
END;
Error report:
ORA-06550: linje 5, kolonne 14:
PLS-00382: expression is of wrong type
ORA-06550: linje 5, kolonne 3:
PL/SQL: Statement ignored
06550. 00000 -  "line %s, column %s:\n%s"
*Cause:    Usually a PL/SQL compilation error.
*Action:

Jeg har søgt nettet tynd uden held, så jeg håber virkelig der er nogle af jer hardcore database folk der kan hjælpe mig :-)
Avatar billede holdam Nybegynder
20. april 2008 - 09:48 #1
Et hurtigt skud er at erklære typen "collection_advisor" som TABLE OF adviser (i stedet for VARRAY) så den matcher returtypen på "testFunction".

Men måske burde Oracle kunne type-konvertere mellem TABLE OF og VARRAY?
Avatar billede dennish Nybegynder
24. april 2008 - 10:45 #2
Hmm nu har jeg prøvet følgende:

DECLARE
  TYPE collection_advisor is TABLE of ADVISER;
  kajkvaj collection_advisor;
BEGIN
  kajkvaj := testFunction('dummy');
END;

og får følgende fejl

Error starting at line 1 in command:
DECLARE
  TYPE collection_advisor is TABLE of ADVISER;
  kajkvaj collection_advisor;
BEGIN
  kajkvaj := testFunction('dummy');
END;
Error report:
ORA-06550: linje 5, kolonne 14:
PLS-00382: expression is of wrong type
ORA-06550: linje 5, kolonne 3:
PL/SQL: Statement ignored
06550. 00000 -  "line %s, column %s:\n%s"
*Cause:    Usually a PL/SQL compilation error.
*Action:

Holdam kan stadigvæk ikke lige se hvad jeg gør galt
Avatar billede holdam Nybegynder
24. april 2008 - 11:01 #3
Det er fordi Oracle har "stærk typeækvivalens" hvilket i denne sammenhæng betyder at typen "adviserlist" ikke er det samme som "TABLE OF adviser" - hvis det kan siges på den måde.

Du skal i stedet erklære din "kajkvaj" variabel af typen adviserlist - så burde PL/SQL-oversætteren ikke længere beklage sig.
Avatar billede dennish Nybegynder
25. april 2008 - 09:46 #4
Holdam >> tusinde tak for dit svar. Tillader mig at spøge hvordan jeg laver erklæringer af min variabel kajkvaj som værende en type af adviserlist (jeg er desværre en newbie i PL/SQL). Lige en tillægsspørgsmål(håber det er ok) kan jeg så ligesom en almindelig collection iterer over min kajkvaj variabel ?
Avatar billede holdam Nybegynder
25. april 2008 - 09:56 #5
Hej

Din PL/SQL kommer til at se således ud:

DECLARE
  kajkvaj adviserlist;
BEGIN
  kajkvaj := testFunction('dummy');
END;

- så det bliver faktisk kun nemmere :-)

Og du har helt de samme muligheder som før - den eneste forskel er at du nu bruger en type der er defineret i SQL - altså i basen - hvor du også kan nå den fra en Java stored procedure.
Avatar billede dennish Nybegynder
18. juni 2008 - 12:17 #6
holdam smider du ikke svar
Avatar billede holdam Nybegynder
18. juni 2008 - 17:48 #7
Jamen det er lige her :-)
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