05. april 2001 - 14:11Der er
5 kommentarer og 1 løsning
Stored Procedure
Nå, joern_h, du plejer at være god for et svar til mine spørgsmål ;-) Lad os se om ikke du har er svar her osse. Andre må selvfølgelig også gerne være med :-)
CREATE OR REPLACE procedure insertLibrary( libid OUT NUMBER, libtitel IN VARCHAR2, libtype IN VARCHAR2, libdate IN DATE, libmeta IN VARCHAR2, libproddate IN DATE, libcontact IN VARCHAR2, libdepartment IN VARCHAR2, liblink IN VARCHAR2, libhandle IN VARCHAR2) is CURSOR cs_get_id IS SELECT seq_library.NEXTVAL FROM dual; begin OPEN cs_get_id; FETCH cs_get_id INTO libid; CLOSE cs_get_id;
INSERT INTO library VALUES ( libid, libtitel, libtype, libdate, libmeta, libproddate, libcontact, libdepartment, liblink, libhandle); end insertLibrary;
LINE/COL ERROR -------- -------------------------------------- 21/3 PL/SQL: SQL Statement ignored 24/3 PLS-00382: expression is of wrong type
Jeg mangler lidt at se pointen i det du gør her.. Skal denne procedure kun bruges til at indsætte den næste nummer fra din sequence i LIBID? Eller vil du oprette en ny række i tabellen med de i forvejen eksisterende værdier og blot opdatere LIBID?
Når du bruger sekvenser så kan du både i INSERT og UPDATE gøre således: INSERT INTO library(libid) values (seq_library.NEXTVAL); eller UPDATE library set LIBID = seq_library.NEXTVAL where .... (hvad kriterie din update nu skal have). Du behøver altså ikke at hente nextval fra dual. Når du laver dine IN og OUT parametre så skriv CREATE OR REPLACE procedure insertLibrary( libid_out OUT library.libid%type, libtitel_in IN library.libtitel%type, libtype_in IN library.libtype%type, libdate_in IN library.libdate%type, libmeta_in IN library.libmeta%type, libproddate_in IN library.libproddate%type, libcontact_in IN library.libcontact%type, libdepartment_in IN library.libdepartment%type, liblink_in IN library.liblink%type, libhandle_in IN library.libhandle%type)
Pas på med at kalde dine parametre fuldstændig det samme som kolonnerne det er forvirrende. Ved at definere dine parametre med %type så er du sikker på at de får den rigtige datatype.
Umiddelbart så mangler jeg at vide hvad du vil med proceduren få at kunne komme med et alternativ eller en rettelse, så dette er kun et par pointers til hvordan de ting du har gjort kan gøres anderledes. Og hvordan ser tabellen du arbejder på ud?
OK- finten er at jeg sidder og arbejder videre på nogle eksisterende Procedures der alle er lavet sådan her. Jeg er ikke den store ekspert i det selv... Det handler om er, at jeg har en tabel med de kolonner der er defineret i starten fra libid - libhandle. Det proceduren skal, er at oprette en ny row og med alle kolonner og indsætte de variable i felterne, som jeg får fra et webinterface. Selve sekvensen, som jeg forstår det, skal lave en auto increment til libid i den nye row. Det jeg ikke forstår er sådan set bare at det virker fint på denne måde, på alt andet der er lavet - men ikke med denne her...
Så havde du nok bare fået sat en forkert datatype på en af dine IN el. OUT i forhold til Library tabellen... Og så er det snedige med %type jo netop at du ikke behøver at tænke på hvilken datatype de eksisterende kolonner er for det finder proceduren selv ud af. Godt at det virker nu. God weekend.
Synes godt om
Ny brugerNybegynder
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.