Avatar billede capital Nybegynder
27. marts 2003 - 18:25 Der er 2 kommentarer og
2 løsninger

Dynamisk PL/SQL

Hej

Tabelstruktur: Tabelnavn1
Tabel består af følgende felter:
felt1(varchar2), felt2(varchar2), mon1(number), mon2(number) , mon3(number) , tue1(number), tue2(number), tue3...

(1 record pr. uge - 21 timeregistreringer)

Nuvel - jeg ønsker at opbygge noget dynamisk SQL som følger:

Kodeeksempel:

vFieldName varchar2(4);
vCommand varchar2(100);

for i in 1 ..7 loop
 
  if i = 1 then
    vFieldName := 'mon';
  elsif
    vFieldName := 'tue';
  .
  .
  .
  end if; 

  for j in 1 .. 3 loop
    vFieldName := vFieldName || to_char(j);
  end loop;
 
  vCommand := 'insert into tabelnavn1(vFieldname) values(10)
  execute immidiate vCommand;

end loop;

Ovenstående resulterer i en fejl - formodentlig da vFieldName  bliver opfattet som en varchar og derfor ej stemmer overens med datatypen i fx. tabelnavn1.mon1.

Er der nogen der kan være behjælpelige med en løsning på mit problem?
Avatar billede albeck Nybegynder
28. marts 2003 - 07:34 #1
Dit vCommand skal se nogenlunde sådan ud :
VCommand := 'insert into tablenavn1(' || vFieldName || ')' || values(10)';
Avatar billede capital Nybegynder
28. marts 2003 - 08:19 #2
Hej Albeck

Tak for dit svar - men desværre viser det sig, at der er indsneget sig en lille fejl i min beskrivelse - rettelse er som følger:

VCommand := 'insert into tablenavn2(testfield)' || values(' || vFieldName || ')';

Men dette ændrer vel ikke sagen (vFieldName hentes fra en cursor)?
Avatar billede larildsen Nybegynder
02. april 2003 - 13:18 #3
Du bør anvende "Bind variable" i denne forbindelse.
F. eks.

VCommand := 'insert into tablenavn2(testfield) values (:1)';
Execute IMMEDIATE VCommand USING vFieldName;

Her vil :1 (eller hvad du vælger at kalde din bind variabel) blive erstattet med vFieldName, eller rettere værdien af vFieldName.
Du kan kalde dine binds hvad du end lyster, og 1. bind variabel bliver erstattet med indholdet af 1. element efter using osv.
Avatar billede capital Nybegynder
04. april 2003 - 13:00 #4
Hej

Jeg har nu fundet en anden løsning på mit problem, men jeg takker for inputs og spltter point mellem svarene.

Håber dette er OK med jer.
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