Estou depurando isso nas últimas 2 horas, mas não consigo encontrar a solução. Por favor, me ajude...
Aqui está o problema...
EU CRIEI 1 TABELA CHAMADA "EMPP"
`CREATE TABLE EMPP(
EMPNO NUMBER PRIMARY KEY,
ENAME VARCHAR2(15),
JOB VARCHAR2(15),
SAL NUMBER(7,2)
)`
AGORA EU INSERI 1 REGISTRO NELE...
INSERT INTO EMPP VALUES(1, 'A','B',2850);
E SE EU OBTER TODOS OS REGISTROS DO QUE O ESPERADO, VOU OBTER APENAS 1 REGISTRO...
AGORA PRECISO RESOLVER ESTA QUESTÃO: "Criar um bloco PL/SQL que imprima detalhes dos funcionários para um determinado salário de funcionário. Se houver vários funcionários ganhando salários semelhantes, imprimir mensagem definida pelo usuário apropriada antes de encerrar o bloco."
AQUI ESTÁ A MINHA SOLUÇÃO PARA ESSA QUESTÃO
`DECLARE
same_sal EXCEPTION;
sal EMPP.SAL%TYPE := :Enter_Salary;
no EMPP.EMPNO%TYPE;
ename EMPP.ENAME%TYPE;
job EMPP.JOB%TYPE;
total_row NUMBER;
BEGIN
SELECT COUNT(*) INTO total_row FROM EMPP WHERE SAL = sal;
dbms_output.put_line(sal);
IF (total_row > 1) THEN
raise same_sal;
ELSE
SELECT EMPNO, ENAME, JOB INTO no, ename, job FROM EMPP WHERE SAL = sal;
dbms_output.put_line('No : ' || no);
dbms_output.put_line('Emp Name : ' || ename);
dbms_output.put_line('Job : ' || job);
END IF;
EXCEPTION
WHEN same_sal THEN
dbms_output.put_line('There are more than 1 employee with same salary');
END;`
Agora, o problema principal começa aqui. Não importa o que eu insira na variável de vinculação "sal", ela retornará o registro. Por exemplo, se eu adicionar "100" na variável sal, ela ainda retornará o registro com um salário de 2.850.
Não sei o que estou fazendo errado, tentei executar a consulta diretamente...
`SELECT COUNT(*) FROM EMPP WHERE SAL = 2850; -- returns 1
SELECT COUNT(*) FROM EMPP WHERE SAL = 100; -- returns 0
SELECT COUNT(*) FROM EMPP WHERE SAL = 1000; -- returns 0`
PS: Estou usando Oracle 10g
Não nomeie variáveis com o mesmo nome da coluna.
Quando você usa
WHERE SAL = sal
thenSAL
em ambos os lados da comparação é tirado do escopo SQL local e não é tirado do escopo PL/SQL externo. Você precisa ter certeza de que a variável PL/SQL tem um nome diferente para que ela possa ser lida do escopo externo.violino