Avatar billede dad Nybegynder
15. juni 2001 - 09:47 Der er 15 kommentarer og
1 løsning

PL/SQL

Jeg er begynder i det her shit. Nu kunne jeg godt tænke mig at kunne ændre nedenstående script så det er muligt at den spørger om prodnr der skal opdateres og det antal der skal ind på lager. Hvordan gør jeg?

declare
gl_lagerbeh produkter.lagerbeh%type;
ny_lagerbeh produkter.lagerbeh%type;
begin
select lagerbeh into gl_lagerbeh
from produkter
where prodnr = 100870;
ny_lagerbeh := gl_lagerbeh + 125;
update produkter set lagerbeh = ny_lagerbeh where prodnr = 100870;
commit;
end;
/
Avatar billede netsrac Praktikant
15. juni 2001 - 09:53 #1
declare
gl_lagerbeh produkter.lagerbeh%type;
ny_lagerbeh produkter.lagerbeh%type;
begin
select lagerbeh into gl_lagerbeh
from produkter
where prodnr = 100870;
ny_lagerbeh := gl_lagerbeh + &antal;
update produkter set lagerbeh = ny_lagerbeh where prodnr = &prodnr;
commit;
end;
Avatar billede netsrac Praktikant
15. juni 2001 - 09:53 #2
Et gæt...
Avatar billede dad Nybegynder
15. juni 2001 - 09:59 #3
Den går ikke;-)
Angiv værdien for antal: gammel  8: ny_lagerbeh := gl_lagerbeh + &antal;
ny  8: ny_lagerbeh := gl_lagerbeh + OEM_sqlplus_input_finished;
ny_lagerbeh := gl_lagerbeh + OEM_sqlplus_input_finished;
                            *
FEJL i linie 8:
ORA-06550: linje 8, kolonne 30:
PLS-00201: identifikatoren \'OEM_SQLPLUS_INPUT_FINISHED\' skal erklæres
ORA-06550: linje 8, kolonne 1:
PL/SQL: Statement ignored
Avatar billede ehf Nybegynder
15. juni 2001 - 09:59 #4
netsrac har ret. Man bruger &.

Men var det ikke nemmere at skrive

update produkter
    set lagerbeh = lagerbeh + &antal
where prodnr = &prodnr;
commit;

Der vil så i prompt blive spurgt om antal og prodnr
Avatar billede ehf Nybegynder
15. juni 2001 - 10:01 #5
& er defineret i sqlplus ved
set define &
Avatar billede dad Nybegynder
15. juni 2001 - 10:03 #6
-ehf, jo det da nemmere, men spørgsmålet går mere på hvordan/kan man bruge &antal, &prodnr i en procedure. Jeg har nemlig ikke kunne finde noget om det i de bøger jeg har.
Avatar billede pgroen Nybegynder
15. juni 2001 - 10:12 #7
declare
  gl_lagerbeh produkter.lagerbeh%type;
  ny_lagerbeh produkter.lagerbeh%type;
  pnr pls_integer;
  ant pls_integer;
begin
  pnr := &prodnr;
  ant := &antal;

  select lagerbeh into gl_lagerbeh
    from produkter
  where prodnr = pnr;

  ny_lagerbeh := gl_lagerbeh + ant;
  update produkter set lagerbeh = ny_lagerbeh where prodnr = pnr;
  commit;
end;
/
Avatar billede pgroen Nybegynder
15. juni 2001 - 10:16 #8
Hov !

Jeg sov vist lidt i timen.

Hvordan kalder du dit script ?
- OEM_SQLPLUS_INPUT_FINISHED kommer vel ikke ud af den blå luft...
Avatar billede teepee Nybegynder
15. juni 2001 - 10:19 #9
accept prodnr prompt \'Prodnr:\'
accept antal prompt \'Antal:\'

declare
gl_lagerbeh produkter.lagerbeh%type;
ny_lagerbeh produkter.lagerbeh%type;
begin
select lagerbeh into gl_lagerbeh
from produkter
where prodnr = &prodnr;
ny_lagerbeh := gl_lagerbeh + &antal;
update produkter set lagerbeh = ny_lagerbeh where prodnr = &prodnr;
commit;
end;
/
Avatar billede pgroen Nybegynder
15. juni 2001 - 10:21 #10
Hvorom alting er, så vil det nok være lidt kønnere
at lave en \'rigtig\' procedure á la

CREATE OR REPLACE PROCEDURE update_lager (
  p_antal PLS_INTEGER,
  p_prodnr PLS_INTEGER)
BEGIN
.
.
.
END;
Avatar billede teepee Nybegynder
15. juni 2001 - 10:26 #11
Enig, men så er det jo ikke længere et script :-)
Avatar billede dad Nybegynder
15. juni 2001 - 11:01 #12
-pgroen,jeg arbejder i sql*plus worksheet og starter mit script med @add_lagerbeh; Herunder er outputtet på dit forslag.

Angiv værdien for prodnr: gammel  7:  pnr := &prodnr;
ny  7:  pnr := ;
Angiv værdien for antal: gammel  8:  ant := &antal;
ny  8:  ant := OEM_sqlplus_input_finished;
  pnr := ;
        *
FEJL i linie 7:
ORA-06550: linje 7, kolonne 10:
PLS-00103: Traf symbolet \";\", hvor en af følgende var forventet:
( - +
mod not null <an identifier>
<a double-quoted delimited-identifier> <a bind variable> avg
count current exists max min prior sql stddev sum variance
execute forall time timestamp interval date
<a string literal with character set specification>
<a number> <a single-quoted SQL string>
Symbolet \"null\" erstattede \";\" for at fortsætte.
Avatar billede dad Nybegynder
15. juni 2001 - 11:04 #13
-teepee, her er outputtet:

Prodnr:Angiv værdien for prodnr: gammel  7: where prodnr = &prodnr;
ny  7: where prodnr = OEM_sqlplus_input_finished;
Angiv værdien for antal: gammel  8: ny_lagerbeh := gl_lagerbeh + &antal;
ny  8: ny_lagerbeh := gl_lagerbeh + 125;
Angiv værdien for prodnr: gammel  9: update produkter set lagerbeh = ny_lagerbeh where prodnr = &prodnr;
ny  9: update produkter set lagerbeh = ny_lagerbeh where prodnr = ;
update produkter set lagerbeh = ny_lagerbeh where prodnr = ;
                                                          *
FEJL i linie 9:
ORA-06550: linje 9, kolonne 60:
PLS-00103: Traf symbolet \";\", hvor en af følgende var forventet:
( - +
all mod null <an identifier>
<a double-quoted delimited-identifier> <a bind variable> any
avg count current max min prior some sql stddev sum variance
execute forall time timestamp interval date
<a string literal with character set specification>
<a number> <a single-quoted SQL string>
Symbolet \"null\" erstattede \";\" for at fortsætte.
Avatar billede teepee Nybegynder
15. juni 2001 - 13:56 #14
Har du prøvet en alm. sql*plus session?
Jeg kender ikke lige sql*plus worksheet, men den kunne måske have sat define variable mv. anderledes.
Avatar billede teepee Nybegynder
15. juni 2001 - 13:57 #15
Scriptet virker perfekt i sql*plus
Avatar billede dad Nybegynder
15. juni 2001 - 14:14 #16
Du har ret, det virker i sql*plus.1000 tak, nu kan jeg hovere over for bossen.
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