› Fóruns › SQL e PL/SQL › Problem Procedure › Problem Procedure
Salve Amigos.. boa noite..
Desculpe me intrometer.. Mas vamos la..
A dúvida que mais tenho sobre esta procedure.. O que a procedure ira fazer?
1 – Somente utiliza INTO “PARAMETRO” quando for realizar um insert em algum lugar… ou para comparar alguma coisa..
2 – Se vc precisar retornar estes valores para algum lugar.. tipo trazer o resultado para a tela.. vc precisa de um CURSOR conforme o DAVID falou..
Se vc for trazer as informações para TELA… vc precisa fazer assim…
CREATE OR REPLACE PROCEDURE REL_REEMBOLSO(dtINICIO IN DATE,
dtFIM IN DATE,
fORNEC IN NUMBER,
cCursor OUT TYPE%TYPE_CURSOR) AS
BEGIN
CURSOR cCursor IS
--CAMPO A SEREM BUSCADOS
SELECT MOV.NUMNOTA AS "NOTA FISCAL",
NF.DTSAIDA AS "DATA DE EMISSAO",
NF.CONDVENDA AS "COD VENDA",
MOV.CODCLI AS "COD CLIENTE",
CLI.CLIENTE AS "CLIENTE",
MOV.CODFORNEC AS "COD FORNECEDOR",
FORNEC.FORNECEDOR AS "FORNECEDOR",
MOV.CODSEC AS "COD SEÇÃO",
SEC.DESCRICAO AS "DESCRIÇÃO SEÇÃO",
MOV.CODPROD AS "COD PRODUTO",
PRO.DESCRICAO AS "PRODUTO",
MOV.QT AS "QUANTIDADE VENDIDA",
MOV.PTABELA AS "PREÇO UNITARIO",
RCA.CODUSUR AS "CODIGO RCA",
RCA.NOME AS "RCA"
--TABELAS COM ALIAS
FROM PCNFSAID NF,
PCMOV MOV,
PCPRODUT PRO,
PCCLIENT CLI,
PCFORNEC FORNEC,
PCSECAO SEC,
PCUSUARI RCA
--"JOIN"
WHERE NF.NUMNOTA = MOV.NUMNOTA
AND MOV.CODPROD = PRO.CODPROD
AND MOV.CODCLI = CLI.CODCLI
AND FORNEC.CODFORNEC = MOV.CODFORNEC
AND SEC.CODSEC = MOV.CODSEC
AND RCA.CODUSUR = MOV.CODUSUR
--CONDIÇOES
AND NF.DTSAIDA BETWEEN dtINICIO AND dtFIM
AND NF.CONDVENDA IN (1, 5)
AND MOV.CODFORNEC = fORNEC
AND MOV.CODCLI IN
-- POR DESCARGO DE CONCIENCIA.. MUDANDO OS "ALIAS" DAS TABELAS...
-- VERIFICAR A REAL NECESSIDADE DE REALIZAR O SELECT ABAIXO...
-- AJUSTANDO PODE-SE OBTER O MESMO RESULTADO APENAS COM O SELECT ACIMA...
(SELECT NF2.CODCLI
FROM PCNFSAID NF2,
PCMOV MOV2,
PCPRODUT PRO2,
PCCLIENT CLI2
WHERE NF2.NUMNOTA = MOV2.NUMNOTA
AND MOV2.CODPROD = PRO2.CODPROD
AND MOV2.CODCLI = CLI2.CODCLI
AND NF2.CONDVENDA||MOV.CODFORNEC = 51 -- AJUSTANDO PARA MELHORAR SEU SELECT...
-- AND NF2.CONDVENDA = 5
-- AND MOV2.CODFORNEC = 1
AND NF2.DTSAIDA BETWEEN dtINICIO AND dtFIM)
ORDER BY MOV.CODCLI;
END REL_REEMBOLSO;
E o erro é que vc não pode declarar um TYPE apenas com o ALIAS da tabela do select abaixo…
Assim…
FORMA ERRADA
CREATE OR REPLACE PROCEDURE REL_REEMBOLSO(dtINICIO IN DATE,
dtFIM IN DATE,
fORNEC IN NUMBER) AS
v_NUMNOTA MOV.NUMNOTA%TYPE;
v_DTSAIDA NF.DTSAIDA%TYPE;
v_CONDVENDA NF.CONDVENDA%TYPE;
v_CODCLI MOV.CODCLI%TYPE;
v_CLIENTE CLI.CLIENTE%TYPE;
v_CODFORNEC MOV.CODFORNEC%TYPE;
v_FORNECEDOR FORNEC.FORNECEDOR%TYPE;
v_CODSEC MOV.CODSEC%TYPE;
v_DESCRICAO SEC.DESCRICAO%TYPE;
v_CODPROD MOV.CODPROD%TYPE;
v_DESCRICAO PRO.DESCRICAO%TYPE;
v_QT MOV.QT%TYPE;
v_PTABELA MOV.PTABELA%TYPE;
v_CODUSUR RCA.CODUSUR%TYPE;
v_NOME RCA.NOME%TYPE;
FORMA CORRETA
CREATE OR REPLACE PROCEDURE REL_REEMBOLSO(dtINICIO IN DATE,
dtFIM IN DATE,
fORNEC IN NUMBER) AS
v_NUMNOTA OWNER.NOMETABELA.NUMNOTA%TYPE;
v_DTSAIDA OWNER.NOMETABELA.DTSAIDA%TYPE;
v_CONDVENDA OWNER.NOMETABELA.CONDVENDA%TYPE;
v_CODCLI OWNER.NOMETABELA.CODCLI%TYPE;
v_CLIENTE OWNER.NOMETABELA.CLIENTE%TYPE;
v_CODFORNEC OWNER.NOMETABELA.CODFORNEC%TYPE;
v_FORNECEDOR OWNER.NOMETABELA.FORNECEDOR%TYPE;
v_CODSEC OWNER.NOMETABELA.CODSEC%TYPE;
v_DESCRICAO OWNER.NOMETABELA.DESCRICAO%TYPE;
v_CODPROD OWNER.NOMETABELA.CODPROD%TYPE;
v_DESCRICAO OWNER.NOMETABELA.DESCRICAO%TYPE;
v_QT OWNER.NOMETABELA.QT%TYPE;
v_PTABELA OWNER.NOMETABELA.PTABELA%TYPE;
v_CODUSUR OWNER.NOMETABELA.CODUSUR%TYPE;
v_NOME OWNER.NOMETABELA.NOME%TYPE;
Qualquer coisa.. Posta como vc precisa da procedure que lhe ajudamos…
Bom.. Espero ter ajudado..
Ps.: David.. Muito bom seu Avatar… Muito bom mesmo…
Abraços..