Hola, tengo una tabla llamada CITY en Oracle SQL Developer, mi problema es cómo ejecutar el procedimiento

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

creando el procedimiento

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

y ahora, ¿cómo ejecutar el procedimiento?

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

Intenté ambos pero con suerte.

Recibí el siguiente error

 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 

Responder

Primero, si está creando un procedimiento en un paquete, el nombre del paquete deberá incluirse cuando llame al procedimiento.

begin hotel.fill_city(10000); end; / 

debería invocar correctamente su procedimiento.

En segundo lugar, tiene problemas con el nombre de sus variables locales. Normalmente, no crearía variables locales como city y postal_number que sean los mismos que los nombres de las columnas en las tablas de su base de datos. Eso hace que sea demasiado fácil introducir errores en su código donde pretende hacer referencia a la variable local, pero las reglas de resolución de alcance significan que realmente se está refiriendo al nombre de la columna. Por ejemplo, si escribe la función perfectamente válida

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; 

en su cláusula WHERE, ambas referencias a deptno se resolverá en la columna de la tabla dept, no en el parámetro deptno. Eso significa que no importa qué valor le pase a la función, la instrucción SELECT devolverá cada fila de la tabla y, por lo tanto, arrojará un too_many_rows error. Normalmente, se le ocurriría una convención sobre cómo nombrar variables y parámetros que no entrarían en conflicto con las convenciones de nomenclatura de su tabla. Prefijar los parámetros con p_ y las variables locales con l_ es una convención común. Eso convierte nuestra función en algo como esto

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; 

La otra opción sería usar prefijos de alcance explícitos cuando se hace referencia a variables locales (es decir, get_dname.dname y get_dname.deptno) en lugar de alterar los nombres de sus variables locales.

Deja una respuesta

Tu dirección de correo electrónico no será publicada. Los campos obligatorios están marcados con *