Avatar billede miqe Nybegynder
17. maj 2007 - 14:23 Der er 9 kommentarer og
1 løsning

PL/SQL Udtræk af enkelt række til variabel

Jeg er rimeligt ny i PL/SQL.

Jeg kan finde ud af at trække et antal rækker ud med en for-løkke:
FOR REC IN(SELECT blablabla...)
LOOP
...
END LOOP;

Jeg kan dog ikke finde ud af at trække en eneklt række ud uden et LOOP.

Har bl.a. forsøgt:
SELECT MAX(foo),MIN(bar) INTO foobar FROM barfoo;
med det resultat at jeg bliver bedt om at erklære min variabel foobar.
Dette er i og for sig fornuftigt nok, men hvilken datatype skal jeg bruge?
Hvis det kan hjælpe er foo og bar af uger taget dato elementer. f.eks.: TO_CHAR(muuh,'IW')

Går ud fra at det er hammer nemt at gøre, når man er nået lidt længere end "Hello World"-stadiet.

Håber i kan være behjælpelige
På forhånd tak
Miqe
Avatar billede miqe Nybegynder
17. maj 2007 - 14:33 #1
Det skal lige nævnes at jeg godt kan trække værdierne ud enkeltvis, men jeg ønsker at trække flere accumulerede værdier ud fra samme tabel i ét select-statement.
Avatar billede miqe Nybegynder
17. maj 2007 - 14:39 #2
Begynder pludslig at spørge mig selv om hvor stor fordelen er i at konsolidere mine udtræk, da PL/SQL jo kompileres i databasen.
Med andre ord: Gør det nogen forskel, når både kode og SQL foregår i database-programmet?
Til den der kan svare på dette er der ekstra points at hente.
Avatar billede Slettet bruger
17. maj 2007 - 20:42 #3
PL/SQL skal kompileres. Men det sker jo kun een gang. Det må afhænge af, hvordan du skal anvende det. Skriv lige lidt mere om det.

Her er et eksempel på at hente to elementer:

DECLARE
  v_Max NUMBER;
  v_Min NUMBER;
BEGIN
  SELECT MAX( foo ), MIN ( bar )
    INTO v_Max, v_Min
    FROM barfoo;
  DBMS_OUTPUT.PUT_LINE ( 'Maksimum af foo = ' || v_Max );
END;
/

mvh, Jørn
Avatar billede Slettet bruger
17. maj 2007 - 21:31 #4
Du kan tage et kig i manualen. PL/SQL User's Guide and Reference findes på http://download-uk.oracle.com/docs/cd/B19306_01/appdev.102/b14261/toc.htm

mvh, Jørn
Avatar billede miqe Nybegynder
18. maj 2007 - 20:29 #5
Hej Jørn

Så man skal altså bruge 2 variable i stedet for 1 hvis men ikke vil bruge en for-løkke?
Kunne være rart at smide hele resultatet ind i en eller anden form for array.

Jeg har hørt at det generelt skulle være bedre at hente mange data ud i ét query end at hente dem ud enkeltvis i små queries; specielt hvis det er de samme tabeller der er tale  om.
Kunne dog forestille mig at dette ikke er så væsentligt, når all ens kode i forvejen er compilet ind i selvsamme database.
Avatar billede Slettet bruger
18. maj 2007 - 23:12 #6
At lave en insert-into til to variable er ikke det samme som at lave to select-sætninger. Der er stadig kun een select.

Men her er to eksempler, du kan bruge:

*** 1. implicit record
...
for r in (select max(foo) as max_foo, min(bar) as min_bar from barfoo)
loop
  dbms_output.put_line ( 'max af foo = ' || r.max_foo );
end loop;
...


*** 2. explicit record type
declare
  type max_min_record_type is record ( max_foo user_objects.object_name%type, min_bar user_objects.OBJECT_TYPE%type );
  max_min_rc max_min_record_type;
begin
  select max(object_name), min(object_type) into max_min_rc
  from user_objects;
  dbms_output.put_line('max = ' || max_min_rc.max_foo );
  dbms_output.put_line('min = ' || max_min_rc.min_bar );
end;

med output

max = TABLE_NAME
min = INDEX
Avatar billede miqe Nybegynder
19. maj 2007 - 08:52 #7
> At lave en insert-into til to variable er ikke det samme som at lave to select-sætninger. Der er stadig kun een select.

Svaret er selvfølgelig fuldstændigt i henhold til mit spørgsmål.
Tak for nogle gode eksempler.

Hvis du kan svare mig på om det gør en forskel med antallet af queries i oracle, nu hvor koden er compilet i databasen forhøjer jeg til 60 points.
Avatar billede Slettet bruger
19. maj 2007 - 09:50 #8
Miqe: Det vil oftetst være hurtigere at bruge et stort select fremfor mange mindre. Men det afhænger af kompleksiteten af det store select-statement sammenlignet med kompleksiteten af de mange, men mindre komplekse statements. Hvis man skal lave full-table-scan på en stor tabel, kan det være en fordel at samle alle opslag i een select-statement. Men du bør altid undersøge hvert enkelt eksempel.

At du kører PL/SQL kan være en fordel. Men det afhænger af brugen: Er det en stump PL/SQL der genbruges, eller danner du ny dynamisk SQL hver gang? Oversættelse tager måske også tid.

Men hvor komplekst er det arbejde, du skal have udført? Har du et eksempel, hvilken omgivelse arbejder du egentlig i?
Avatar billede miqe Nybegynder
19. maj 2007 - 10:32 #9
I dette tilfælde drejer det sig mere om at forstå Oracle's og PL/SQL's natur.

Har derfor ikke en konkret eksempel.

Tak for de gode eksempler, der har givet mig en lidt bedre forståelse.

Hvis du vil kigge på en konkret problemstilling kan du kigge hér: http://www.eksperten.dk/spm/779081
Avatar billede miqe Nybegynder
19. maj 2007 - 10:34 #10
Hov, jeg var lidt for hurtig.
Jeg oprettet er poinst til joern_h spørgsmål her:
http://www.eksperten.dk/spm/779082
så du kan få de sidste 30 points også
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