Olá, tenho uma tabela chamada CITY no desenvolvedor Oracle SQL, meu problema é como executar o procedimento

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

criando o procedimento

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

e agora como executar o procedimento?

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

Tentei os dois, mas com sorte.

Recebi o seguinte erro

 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 

Resposta

Primeiro, se você estiver criando um procedimento em um pacote, o nome do pacote precisará ser incluído quando você chamar o procedimento.

begin hotel.fill_city(10000); end; / 

deve invocar corretamente seu procedimento.

Segundo, você tem problemas com a nomenclatura de suas variáveis locais. Normalmente, você não criaria variáveis locais como city e postal_number, que são iguais aos nomes das colunas nas tabelas do seu banco de dados. Isso torna muito fácil introduzir erros em seu código onde você pretende se referir à variável local, mas as regras de resolução de escopo significam que você está realmente se referindo ao nome da coluna. Por exemplo, se você escrever a função perfeitamente 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; 

em sua WHERE cláusula, ambas as referências a deptno será resolvido para a coluna na tabela dept, não para o parâmetro deptno. Isso significa que independentemente do valor que você passar para a função, a instrução SELECT retornará todas as linhas da tabela e, assim, lançará um too_many_rows erro. Normalmente, você criaria uma convenção sobre como nomear variáveis e parâmetros que não entrariam em conflito com as convenções de nomenclatura de sua tabela. A prefixação de parâmetros com p_ e variáveis locais com l_ é uma convenção comum. Isso transforma nossa função em algo assim

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 outra opção seria usar prefixos de escopo explícitos ao se referir a variáveis locais (ou seja, get_dname.dname e get_dname.deptno) em vez de alterar os nomes de suas variáveis locais.

Deixe uma resposta

O seu endereço de email não será publicado. Campos obrigatórios marcados com *