Helló, van egy CITY nevű táblám az oracle SQL fejlesztőben, a problémám az eljárás futtatása

-- 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; 

az eljárás létrehozása

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

és most az eljárás végrehajtása?

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

Mindkettőt megpróbáltam, de szerencsével.

A következő hibát kaptam

 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 

Válasz

Először is, ha eljárást hoz létre egy csomagban, akkor az eljárás meghívásakor meg kell adni a csomag nevét.

begin hotel.fill_city(10000); end; / 

helyesen kell meghívnia az eljárást.

Másodszor, problémái vannak a helyi változók elnevezésével. Normál esetben nem hozhat létre olyan helyi változókat, mint a city és a postal_number, amelyek megegyeznek az adatbázis tábláinak oszlopainak nevével. Ez túlságosan megkönnyíti a hibák bevezetését a kódba, ahol a helyi változóra kíván hivatkozni, de a hatókör-felbontási szabályok azt jelentik, hogy valóban az oszlop nevére hivatkozik. Például, ha a tökéletesen érvényes függvényt

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; 

írja be a WHERE záradékba, mindkét hivatkozás a deptno a dept tábla oszlopához, és nem a deptno paraméterhez fog oldódni. Ez azt jelenti, hogy függetlenül attól, hogy milyen értéket ad át a függvénynek, az SELECT utasítás visszatér a táblázat minden sorára, és így egy too_many_rows hiba. Normális esetben kidolgozna egy megállapodást a változók és paraméterek megnevezéséről, amelyek nem ütköznek a táblák elnevezési szokásaival. A paraméterek előtagja a p_ és a helyi változók előhívása a l_ kifejezéssel egy közös szokás. Ez a funkciónkat ilyenné alakítja

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; 

A másik lehetőség az lenne, ha explicit hatókörű előtagokat használnánk a helyi változókra való hivatkozáskor (azaz get_dname.dname és get_dname.deptno) ahelyett, hogy megváltoztatná a helyi változók nevét.

Vélemény, hozzászólás?

Az email címet nem tesszük közzé. A kötelező mezőket * karakterrel jelöltük