Avatar billede jacobve Nybegynder
26. november 2000 - 22:33 Der er 4 kommentarer og
1 løsning

problemer med FUNCTION i SQL*Plus 3.3.2.0.1

Jeg opretter en funktion således:

CREATE OR REPLACE FUNCTION ascii_str (str IN VARCHAR2)
RETURN NUMBER
IS
var_samlet NUMBER;
var_ascii_vaerdi NUMBER(3);
var_laengde NUMBER(LENGTH(str)) := LENGTH(str);
var_enkelt_tegn CHAR(1);
BEGIN
IF str := NULL THEN
    RETURN 0;
END IF;
   
var_samlet := 0;
FOR i IN var_laengde
LOOP
    var_enkelt_tegn := SUBSTR(str,i,var_laengde);
    var_ascii_vaerdi := ASCII(var_enkelt_tegn);
    var_samlet := var_samlet + var_ascii_vaerdi;
END LOOP;

RETURN var_samlet;

END;
/
commit;
som svar skriver den:

Warning: Function created with compilation errors.

Derefter forsøger jeg at teste denne funktion, ved hjælp af denne kode:

DROP TABLE uddata;

CREATE TABLE uddata (data VARCHAR2(300));
DECLARE
var_et VARCHAR2(300);
var_input VARCHAR(300);
BEGIN
var_input := \'&skriv_her\';
var_et := ascii_str(var_input);
INSERT INTO uddata VALUES (var_et);
END;
/
SELECT * FROM uddata;

Så giver den mig følgende svar:

---(her intaster jeg bare en test værdi)
Enter value for skriv_her: hejsa

old  5: var_input := \'&skriv_her\';
new  5: var_input := \'hejsa\';
var_et := ascii_str(var_input);
          *
ERROR at line 6:
ORA-06550: line 6, column 11:
PLS-00905: object SCOTT.ASCII_STR is invalid
ORA-06550: line 6, column 1:
PL/SQL: Statement ignored

no rows selected

Hvor scott er mit bruger navn....Hvad gør jeg galt? den vil ikke kendes ved min funktion?
Avatar billede pnielsen Nybegynder
27. november 2000 - 01:28 #1
Du skal kigge på din function.

Brug \"show error\" og ret fejlen indtil du får en fejlfri compilering!

Umiddelbart vil jeg sige at din:
IF str := NULL THEN
skal rettes til
IF str = NULL THEN

og så ser din var_laengde definition ikke helt rigtig ud.

Jeg kan desværre ikke logge på min base herfra.... prøv lige selv at rette til!
Avatar billede jacobve Nybegynder
27. november 2000 - 07:03 #2
hmmm.... Er stadigvæk lidt ny indenfor Oracle, og har kun arbejdet med det i kort tid.

Men det vil sige at jeg ikke kan bruge min funktion før den er compileret fejlfrit? - og \'show error\', hvordan bruger jeg den?

Avatar billede jacobve Nybegynder
27. november 2000 - 09:52 #3
Nu har jeg ændret min kode til:

CREATE OR REPLACE FUNCTION ascii_str (str IN VARCHAR2)
RETURN NUMBER
IS
var_samlet NUMBER(10);
var_ascii_vaerdi NUMBER(3);
var_laengde NUMBER(2);
var_enkelt_tegn CHAR(1);
BEGIN
IF str = NULL THEN
RETURN 0;
END IF;

var_laengde := LENGTH(str);
var_samlet := 0;
FOR i IN var_laengde
LOOP
    var_enkelt_tegn := SUBSTR(str,i,1);
    var_ascii_vaerdi := ASCII(var_enkelt_tegn);
    var_samlet := var_samlet + var_ascii_vaerdi;
END LOOP;

RETURN var_samlet;

END;
/

Og den giver følgende fejl:

LINE/COL ERROR
-------- -----------------------------------------------------------------
14/1    PL/SQL: Statement ignored
14/10    PLS-00306: wrong number or types of arguments in call to
        \'VAR_LAENGDE\'

hvad gør jeg galt?
Avatar billede pnielsen Nybegynder
27. november 2000 - 10:18 #4
CREATE OR REPLACE FUNCTION ascii_str (str IN VARCHAR2)
RETURN NUMBER
IS
var_samlet NUMBER(10);
var_ascii_vaerdi NUMBER(3);
var_laengde NUMBER(2);
var_enkelt_tegn CHAR(1);
BEGIN
IF str = NULL THEN
RETURN 0;
END IF;
var_laengde := LENGTH(str);
var_samlet := 0;
FOR i IN 1..var_laengde
LOOP
var_enkelt_tegn := SUBSTR(str,i,1);
var_ascii_vaerdi := ASCII(var_enkelt_tegn);
var_samlet := var_samlet + var_ascii_vaerdi;
END LOOP;
RETURN var_samlet;
END;

Avatar billede jacobve Nybegynder
27. november 2000 - 18:42 #5
Jeg fandt selv fejlen senere her i dag, efter at have brugt show error m.m. som du fortalte om....

Du skal have mange tak for hjælpen.
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