Hei, jeg har en tabell som heter CITY i oracle SQL-utvikler, mitt problem er hvordan man kjører prosedyren

-- start the script SET SERVEROUTPUT ON SET LINESIZE 400 SET TIMING ON CREATE OR REPLACE PACKAGE BODY hotel AS -- ----------------------------------------------------- -- Table city -- ----------------------------------------------------- PROCEDURE fill_city(number_city NUMBER) IS city VARCHAR2(100); postna_st VARCHAR2(4); BEGIN FOR st IN 1..number_city LOOP city:= dbms_random.string("a",100); postal_number:= dbms_random.value(1000,9000); INSERT INTO CITY(city, postal_number) VALUES (city, postal_number); END LOOP; END; BEGIN NULL; END hotel; / SHOW ERRORS; 

oppretter prosedyren

CREATE OR REPLACE PACKAGE hotel AS PROCEDURE fill_city(number_city NUMBER) END hotel; / SHOW ERRORS; 

og hvordan skal du utføre prosedyren nå?

--EXECUTE fill_city(10000) ; Begin fill_city(10000); End; 

Jeg prøvde begge deler, men med hell.

Jeg fikk følgende feil

 Error report: ORA-06550: line 2, column 2: PLS-00201: identifier "fill_city" must be declared ORA-06550: line 2, column 2: PL/SQL: Statement ignored 06550. 00000 - "line %s, column %s:\n%s" *Cause: Usually a PL/SQL compilation error. *Action: Elapsed: 00:00:00.018 

Svar

Hvis du oppretter en prosedyre i en pakke, må pakkenavnet inkluderes når du ringer til prosedyren.

begin hotel.fill_city(10000); end; / 

skal påkalle prosedyren din riktig.

For det andre har du problemer med navngivningen av de lokale variablene. Normalt vil du ikke opprette lokale variabler som city og postal_number som er de samme som navnene på kolonnene i tabellene i databasen din. Det gjør det altfor enkelt å introdusere feil i koden din der du har tenkt å referere til den lokale variabelen, men regler for omfangsoppløsning betyr at du virkelig refererer til kolonnenavnet. Hvis du for eksempel skriver den perfekt gyldige funksjonen

CREATE OR REPLACE FUNCTION get_dname( deptno IN NUMBER ) RETURN VARCHAR2 IS dname VARCHAR2(30); BEGIN SELECT dname INTO dname FROM dept WHERE deptno = deptno; RETURN dname; END; 

i WHERE -satsen, begge referanser til deptno vil løse kolonnen i dept tabellen, ikke til parameteren deptno. Det betyr at uansett hvilken verdi du overfører til funksjonen, vil SELECT -uttalelsen returnere hver rad fra bordet og dermed kaste en too_many_rows feil. Normalt vil du komme med en konvensjon om hvordan du skal navngi variabler og parametere som ikke vil være i konflikt med konvensjonene for navngivning av tabeller. Forhåndsinnstilling av parametere med p_ og lokale variabler med l_ er en vanlig konvensjon. Det gjør vår funksjon til noe sånt som dette

CREATE OR REPLACE FUNCTION get_dname( p_deptno IN NUMBER ) RETURN VARCHAR2 IS l_dname VARCHAR2(30); BEGIN SELECT dname INTO l_dname FROM dept WHERE deptno = p_deptno; RETURN l_dname; END; 

Det andre alternativet vil være å bruke eksplisitte scoping-prefikser når det refereres til lokale variabler (dvs. get_dname.dname og get_dname.deptno) i stedet for å endre navnene på de lokale variablene.

Legg igjen en kommentar

Din e-postadresse vil ikke bli publisert. Obligatoriske felt er merket med *