erro PLS-00313 : usando cursores explicitos

Dúvidas, dicas e truques de PL/SQL. Aqui também vão assuntos relacionados a pacotes, triggers, funções, Java-Stored Procedures, etc
Responder
YAMAZAK1
Rank: Estagiário Pleno
Rank: Estagiário Pleno
Mensagens: 3
Registrado em: Sex, 11 Dez 2009 1:32 pm
Localização: Niteroi-RJ

Fala galera, sou novo no forum e estou penando para fazer um trabalho da faculdade.
Utilizo o Oracle 9.2, e o SQL PLUS

Preciso fazer um procedimento usando cursores explicitos que pega os percentuais de comissao de cada empregado, arredonda seus valores e coloca uma estrela "*" para cada 1% de comissao do empregado.

abaixo segue o codigo:

Selecionar tudo

CREATE  OR  REPLACE 
PROCEDURE  ATRIBUI_ESTRELAS 
IS
	V_ESTRELAS	EMPREGADOS.ESTRELAS%TYPE  :=  NULL;
	CURSOR  EMP_CURSOR  IS
	     SELECT  NVL(ROUND(PERC_COMISSAO), 0) COMISSAO
	     FROM  EMPREGADOS
	     FOR  UPDATE;

BEGIN
	FOR  EMP_RECORD IN EMP_CURSOR LOOP
	          FOR  I  IN EMP_RECORD.COMISSAO  LOOP
	                    V_ESTRELAS  :=  V_ESTRELAS  ||  '*';
                      END  LOOP;

	          UPDATE  EMPREGADOS
				SET ESTRELAS = V_ESTRELAS
				WHERE CURRENT OF EMP_CURSOR;
				
	END  LOOP;
	COMMIT;

END; 
a tabela de empregados é criado com:

Selecionar tudo

CREATE TABLE EMPREGADOS 
(NUMERO              NUMBER(4)
    CONSTRAINT EMPREGADOS_NUMERO_PK  PRIMARY KEY,
NOME        	VARCHAR2(10),
SOBRENOME     	VARCHAR2(10),
CPF          	CHAR(11)
    CONSTRAINT EMPREGADOS_CPF_UK  UNIQUE,
CARGO       	VARCHAR2(10),
NUM_SUPERVISOR 	NUMBER(4)
    CONSTRAINT  EMP_EMP_NUM_SUPERVISOR_FK    
    REFERENCES  EMPREGADOS (NUMERO),
DT_ADMISSAO 	DATE,
SALARIO     	NUMBER(7,2),
PERC_COMISSAO  	NUMBER(4,2)
    CONSTRAINT  EMPREGADOS_PERC_COMISSAO_CK
    CHECK (PERC_COMISSAO  IN  (10, 12.5, 15, 17.5, 20)),
NUMERO_DEPT	NUMBER(2)
    CONSTRAINT  EMPREG_DEPARTAMENTOS_NUMERO_FK   
    REFERENCES  DEPARTAMENTOS (NUMERO));

Selecionar tudo


	ALTER  TABLE  EMPREGADOS
	ADD  ESTRELAS   VARCHAR2(30);
victorhugomuniz
Moderador
Moderador
Mensagens: 1396
Registrado em: Sex, 01 Fev 2008 2:06 pm
Localização: Rio de Janeiro - RJ
Contato:
:D

Selecionar tudo


Oracle Error :: PLS-00313

"string" not declared in this scope
Cause

There is no declaration for the given identifier within the scope of reference. The identifier might be 
misspelled, its declaration might be faulty, or the declaration might be placed incorrectly in the block structure.
Action

Check the spelling and declaration of the identifier. Also confirm that the declaration is placed correctly in the 
block structure.

você não esta declarando alguma coisa...


ps.: Qual é seu nome? Felipe?
YAMAZAK1
Rank: Estagiário Pleno
Rank: Estagiário Pleno
Mensagens: 3
Registrado em: Sex, 11 Dez 2009 1:32 pm
Localização: Niteroi-RJ

meu nome não é felipe não.

parece que o EMP_RECORD.COMISSAO não esta associado aquele COMISSAO do select.

Selecionar tudo

ATRIBUI_ESTRELAS
PLS-00313: 'COMISSAO' not declared in this scope

ATRIBUI_ESTRELAS
PL/SQL: Statement ignored
Avatar do usuário
fsitja
Rank: OraSauro
Rank: OraSauro
Mensagens: 611
Registrado em: Seg, 19 Jan 2009 4:29 pm
Localização: Gaúcho no Rio de Janeiro - RJ
"The scars exist to remind us that the past was real"
Campanha: Como fazer uma pergunta e obter uma resposta.
http://tkyte.blogspot.com/2005/06/how-t ... tions.html

OCA & OCP Developer — OCE SQL Expert — OCS Data Warehousing Specialist

A comissão de cada um que define a sua quantidade individual de estrelas, certo? Se for, então pode ser assim:

Selecionar tudo

SQL> insert into empregados (numero, nome, sobrenome, cpf, cargo, salario, perc_comissao)
  2      select 1, 'PEDRO', 'SILVA', 111, 'PEAO', 1000, 10 from dual
  3      union all select 2, 'MARIA', 'PEREIRA', 222, 'SECRETARIA', 2000, 12.5 from dual
  4      union all select 3, 'CHUCK', 'NORRIS', 333, 'DEUS', 10000, 20 from dual
  5      union all select 4, 'JACK', 'BAUER', 444, 'ASPIRA', 7000, null from dual;

4 linhas criadas.

SQL> select e.nome, e.sobrenome, e.cargo, e.perc_comissao, rpad('*', trunc(e.perc_comissao), '*') es
trelas from empregados e;

NOME       SOBRENOME  CARGO      PERC_COMISSAO ESTRELAS
---------- ---------- ---------- ------------- ------------------------------
PEDRO      SILVA      PEAO                  10 **********
MARIA      PEREIRA    SECRETARIA          12,5 ************
CHUCK      NORRIS     DEUS                  20 ********************
JACK       BAUER      ASPIRA

SQL> 
YAMAZAK1
Rank: Estagiário Pleno
Rank: Estagiário Pleno
Mensagens: 3
Registrado em: Sex, 11 Dez 2009 1:32 pm
Localização: Niteroi-RJ

é isso ai mesmo que eu tenho que fazer, mas utilizando cursores, o professor deu um procedimento e tinhamos que completa-lo para que o procedimento fizesse isso:

Selecionar tudo

CREATE  OR  REPLACE 
PROCEDURE  ATRIBUI_ESTRELAS 
IS
	V_ESTRELAS	EMPREGADOS.ESTRELAS%TYPE  :=  NULL;

	CURSOR  EMP_CURSOR  IS
	     SELECT  NVL(ROUND(PERC_COMISSAO), 0)  COMISSAO
	     FROM  EMPREGADOS
	     FOR  UPDATE;

BEGIN
	FOR  ...
	          FOR  I  IN  1..EMP_RECORD.COMISSAO  LOOP
	                    V_ESTRELAS  :=  V_ESTRELAS  ||  ‘*’;
                      END  LOOP;

	          UPDATE  ...

END;
Avatar do usuário
fsitja
Rank: OraSauro
Rank: OraSauro
Mensagens: 611
Registrado em: Seg, 19 Jan 2009 4:29 pm
Localização: Gaúcho no Rio de Janeiro - RJ
"The scars exist to remind us that the past was real"
Campanha: Como fazer uma pergunta e obter uma resposta.
http://tkyte.blogspot.com/2005/06/how-t ... tions.html

OCA & OCP Developer — OCE SQL Expert — OCS Data Warehousing Specialist

Creio que você não precise calcular o campo estrelas no próprio loop. O que iria dentro do loop seria apenas o update.

E na vida real, seria apenas um update, sem loop, sem PL/SQL, nada:

Selecionar tudo

update empregados
       set estrelas = rpad('*', trunc(e.perc_comissao), '*')
Responder
  • Informação
  • Quem está online

    Usuários navegando neste fórum: Nenhum usuário registrado e 23 visitantes