Ir para conteúdo

POWERED BY:

Arquivado

Este tópico foi arquivado e está fechado para novas respostas.

murilo oliveira

erro em função com postgres + plpgsql

Recommended Posts

estou com problemas em uma function abaixo segue o erro e a function.

se alguém puder me ajudar.

 

ERROR: query has no destination for result data

SQL state: 42601

Dica: If you want to discard the results of a SELECT, use PERFORM instead.

Contexto: PL/pgSQL function "FIU_VENDA" line 206 at SQL statement

 

CREATE OR REPLACE FUNCTION "FIU_VENDA"

(VENDA.VEN_CODIGO%TYPE,

VENDA.VEN_COMANDA%TYPE,

VENDA.VEN_DATA_INICIO%TYPE,

VENDA.VEN_TIPO%TYPE,

VENDA.VEN_TOTAL%TYPE,

VENDA.CLI_CODIGO%TYPE,

VENDA.USU_CODIGO_VENDA%TYPE,

VENDA.USU_CODIGO_BAIXA%TYPE,

VENDA.VEN_STATUS%TYPE,

VENDA.VEN_DATA_FINAL%TYPE,

VENDA.VEN_VALOR_FINAL%TYPE,

VENDA.VEN_VALOR_PAGO%TYPE)

RETURNS VARCHAR

AS

$$

DECLARE

V_VEN_CODIGO ALIAS FOR $1;

V_VEN_COMANDA ALIAS FOR $2;

V_VEN_DATA_INICIO ALIAS FOR $3;

V_VEN_TIPO ALIAS FOR $4;

V_VEN_TOTAL ALIAS FOR $5;

V_CLI_CODIGO ALIAS FOR $6;

V_USU_CODIGO_VENDA ALIAS FOR $7;

V_USU_CODIGO_BAIXA ALIAS FOR $8;

V_VEN_STATUS ALIAS FOR $9;

V_VEN_DATA_FINAL ALIAS FOR $10;

V_VEN_VALOR_FINAL ALIAS FOR $11;

V_VEN_VALOR_PAGO ALIAS FOR $12;

 

V_USUV_NOME VARCHAR(120);

V_USUB_NOME VARCHAR(120);

V_CLI_NOME VARCHAR(240);

V_COD INTEGER;

V_CONT INTEGER;

V_VEN_STATUS_BEFORE VARCHAR(1);

V_CON_VALOR NUMERIC;

V_CON_CREDITO NUMERIC;

V_CON_DEBITO NUMERIC;

V_CAI_SALDO NUMERIC;

V_NEW_SALDO NUMERIC;

V_LIMIT NUMERIC;

MSG VARCHAR(200);

 

BEGIN

 

MSG := 'FALHA NA OPERAÇÃO';

 

IF V_VEN_CODIGO = 0 THEN/*se entrar é porque está inserindo produtos na comanda*/

 

SELECT VEN_CODIGO, COUNT(VEN_CODIGO) INTO V_COD, V_CONT

FROM VENDA

WHERE VEN_COMANDA = V_VEN_COMANDA AND

VEN_STATUS = 'A'

GROUP BY VEN_CODIGO;

 

SELECT USU_NOME INTO V_USUV_NOME

FROM USUARIOS

WHERE USU_CODIGO = V_USU_CODIGO_VENDA;

 

IF V_CONT IS NOT NULL THEN/*se entrar é porque a comanda esta recebendo mais pedidos, ex: o cara tinha comprado uma coca e depois mais um picolé*/

 

SELECT USU_NOME INTO V_USUB_NOME

FROM USUARIOS

WHERE USU_CODIGO = V_USU_CODIGO_BAIXA;

 

BEGIN

UPDATE VENDA

SET VEN_TOTAL = V_VEN_TOTAL,

USU_CODIGO_VENDA = V_USU_CODIGO_VENDA,

VEN_USUV_NOME = V_USUV_NOME

WHERE VEN_COMANDA = V_VEN_COMANDA AND

VEN_CODIGO = V_COD AND

VEN_STATUS = 'A';

 

MSG := 'OPERAÇÃO DE ATUALIZAÇÃO CONCLUÍDAº' || V_COD;

 

EXCEPTION

WHEN unique_violation THEN

MSG := 'CHAVE PRIMÁRIA VIOLADA - UPDATE TERMINAL |=> STATE OF SQL => ' || SQLERRM || ' - ERROR OF SQL => ' || SQLSTATE;

WHEN integrity_constraint_violation THEN

MSG := 'CHAVE ESTRANGEIRA VIOLADA - UPDATE TERMINAL |=> STATE OF SQL => ' || SQLERRM || ' - ERROR OF SQL => ' || SQLSTATE;

END;

 

ELSE/*se entrar é porque a comanda ainda não tem nenhum produto gravado*/

 

BEGIN

 

INSERT INTO VENDA

(VEN_COMANDA, VEN_TIPO, VEN_DATA_INICIO, VEN_TOTAL, USU_CODIGO_VENDA, VEN_USUV_NOME, VEN_STATUS)

VALUES

(V_VEN_COMANDA, 'V', V_VEN_DATA_INICIO, V_VEN_TOTAL, V_USU_CODIGO_VENDA, V_USUV_NOME, V_VEN_STATUS);

 

SELECT MAX(VEN_CODIGO) INTO V_CONT

FROM VENDA;

 

MSG := 'OPERAÇÃO DE GRAVAÇÃO CONCLUÍDA 10º' || V_CONT;

 

EXCEPTION

WHEN unique_violation THEN

MSG := 'CHAVE PRIMÁRIA VIOLADA - INSERT |=> STATE OF SQL => ' || SQLERRM || ' - ERROR OF SQL => ' || SQLSTATE;

WHEN integrity_constraint_violation THEN

MSG := 'CHAVE ESTRANGEIRA VIOLADA - INSERT |=> STATE OF SQL => ' || SQLERRM || ' - ERROR OF SQL => ' || SQLSTATE;

 

END;

END IF;

 

ELSE

 

SELECT COUNT(VEN_CODIGO), VEN_STATUS INTO V_CONT, V_VEN_STATUS_BEFORE

FROM VENDA

WHERE VEN_CODIGO = V_VEN_CODIGO

GROUP BY VEN_CODIGO, VEN_STATUS;

 

IF V_CONT IS NULL THEN

MSG := 'CÓDIGO DA VENDA NÃO ENCONTRADO';

ELSE

SELECT USU_NOME INTO V_USUB_NOME

FROM USUARIOS

WHERE USU_CODIGO = V_USU_CODIGO_BAIXA;

SELECT USU_NOME INTO V_USUV_NOME

FROM USUARIOS

WHERE USU_CODIGO = V_USU_CODIGO_VENDA;

 

IF V_VEN_STATUS = 'A' THEN

 

BEGIN

UPDATE VENDA

SET /*VEN_COMANDA = V_VEN_COMANDA,*/

/*VEN_DATA_INICIO = VEN_DATE_INICIO,*/

/*VEN_TIPO = V_VEN_TIPO,*/

VEN_TOTAL = V_VEN_TOTAL,

CLI_CODIGO = V_CLI_CODIGO,

USU_CODIGO_VENDA = V_USU_CODIGO_VENDA,

/*VEN_USUV_NOME = V_USUV_NOME,*/

/*USU_CODIGO_BAIXA = V_USU_CODIGO_BAIXA,*/

/*VEN_STATUS = V_VEN_STATUS,*/

/*VEN_DATA_FINAL = V_VEN_DATA_FINAL,*/

/*VEN_VALOR_FINAL = V_VEN_VALOR_FINAL,*/

VEN_VALOR_PAGO = V_VEN_VALOR_PAGO

WHERE VEN_CODIGO = V_VEN_CODIGO;

 

MSG := 'OPERAÇÃO DE ATUALIZAÇÃO CONCLUÍDAº' || V_VEN_CODIGO;

 

EXCEPTION

WHEN unique_violation THEN

MSG := 'CHAVE PRIMÁRIA VIOLADA - UPADATE CAIXA |=> STATE OF SQL => ' || SQLERRM || ' - ERROR OF SQL => ' || SQLSTATE;

WHEN integrity_constraint_violation THEN

MSG := 'CHAVE ESTRANGEIRA VIOLADA - UPDATE CAIXA |=> STATE OF SQL => ' || SQLERRM || ' - ERROR OF SQL => ' || SQLSTATE;

END;

 

ELSE

 

IF V_VEN_STATUS = 'F' AND V_VEN_STATUS_BEFORE = 'A' THEN

BEGIN

 

SELECT CON_CREDITO, CON_DEBITO INTO V_CON_CREDITO, V_CON_DEBITO

FROM SALDO_CLIENTE

WHERE CON_CODIGO = (SELECT CON_CODIGO

FROM SALDO_CLIENTE

WHERE CLI_CODIGO = V_CLI_CODIGO

ORDER BY CON_CODIGO DESC

LIMIT 1);

 

SELECT CLI_LIMITE INTO V_LIMIT

FROM CLIENTE

WHERE CLI_CODIGO = V_CLI_CODIGO;

 

IF V_VEN_VALOR_PAGO < V_VEN_VALOR_FINAL THEN/*SE A VENDA FOI A PRAZO*/

V_CON_VALOR = V_VEN_VALOR_FINAL - V_VEN_VALOR_PAGO;/*V_CON_VALOR RECEBE O VALOR A SER DEBITADO OU CREDITADO DA CONTA*/

IF V_CLI_CODIGO IS NOT NULL AND V_CLI_CODIGO > 0 THEN/**/

BEGIN

IF V_CON_CREDITO IS NOT NULL AND V_CON_CREDITO > 0.00 THEN/*SE O CARA TEM CREDITO*/

 

IF V_CON_VALOR <= V_CON_CREDITO THEN/*SE O CREDITO DO CARA NÃO FOR ACABAR*/

V_CON_CREDITO = V_CON_CREDITO - V_CON_VALOR;/*SÓ DECREMENTA*/

V_CON_DEBITO = 0.00;

ELSE

V_CON_DEBITO = V_CON_VALOR - V_CON_CREDITO;/*SE O CREDITO DO CARA FOR ACABAR, INCREMENTA O DEBITO*/

V_CON_CREDITO = 0.00;

END IF;

 

ELSE/*SE O CARA NÃO TEM CREDITO*/

IF V_CON_DEBITO IS NULL OR V_CON_DEBITO = 0.00 THEN/*SE O CARA NÃO TEM DEBITO*/

V_CON_CREDITO = 0.00;

V_CON_DEBITO = V_CON_VALOR;

ELSE

V_CON_CREDITO = 0.00;

V_CON_DEBITO = V_CON_DEBITO + V_CON_VALOR;

END IF;

 

END IF;

 

IF V_CON_DEBITO <= V_LIMIT THEN

 

UPDATE VENDA

SET /*VEN_COMANDA = V_VEN_COMANDA,*/

VEN_DATA_INICIO = V_VEN_DATA_INICIO,

VEN_TIPO = V_VEN_TIPO,

VEN_TOTAL = V_VEN_TOTAL,

CLI_CODIGO = V_CLI_CODIGO,

USU_CODIGO_VENDA = V_USU_CODIGO_VENDA,

USU_CODIGO_BAIXA = V_USU_CODIGO_BAIXA,

VEN_USUB_NOME = V_USUB_NOME,

VEN_STATUS = V_VEN_STATUS,

VEN_DATA_FINAL = V_VEN_DATA_FINAL,

VEN_VALOR_FINAL = V_VEN_VALOR_FINAL,

VEN_VALOR_PAGO = V_VEN_VALOR_PAGO

WHERE VEN_CODIGO = V_VEN_CODIGO;

 

MSG := 'OPERAÇÃO DE ATUALIZAÇÃO CONCLUÍD' || V_VEN_CODIGO || '\n' || V_VEN_COMANDA || '\n' || V_VEN_DATA_INICIO || '\n' || V_VEN_TIPO || '\n' ||V_VEN_TOTAL || '\n' ||

V_CLI_CODIGO || '\n' || V_USU_CODIGO_VENDA ||'\n' || V_USU_CODIGO_BAIXA || '\n' || V_VEN_STATUS || '\n' || V_VEN_DATA_FINAL || '\n' ||V_VEN_VALOR_FINAL || '\n' ||

V_VEN_VALOR_PAGO || '\n' || V_USUV_NOME || '\n' || V_USUB_NOME;

 

INSERT INTO VENSAL_CLIENTE

(VEN_CODIGO, VEN_COMANDA, VEN_DATA_INICIO, VEN_TIPO, VEN_TOTAL, CLI_CODIGO, USU_CODIGO_VENDA,

USU_CODIGO_BAIXA, VEN_STATUS, VEN_DATA_FINAL, VEN_VALOR_FINAL, VEN_VALOR_PAGO, VEN_USUV_NOME, VEN_USUB_NOME)

VALUES

(V_VEN_CODIGO, V_VEN_COMANDA, V_VEN_DATA_INICIO, V_VEN_TIPO, V_VEN_TOTAL, V_CLI_CODIGO, V_USU_CODIGO_VENDA,

V_USU_CODIGO_BAIXA, V_VEN_STATUS, V_VEN_DATA_FINAL, V_VEN_VALOR_FINAL, V_VEN_VALOR_PAGO, V_USUV_NOME, V_USUB_NOME);

 

SELECT * FROM VENDA

WHERE VEN_CODIGO = V_VEN_CODIGO;

 

INSERT INTO SALDO_CLIENTE

(CLI_CODIGO, VEN_CODIGO, CON_TIPO, CON_DATA, CON_VALOR, CON_CREDITO, CON_DEBITO, USU_CODIGO)

VALUES (V_CLI_CODIGO, V_VEN_CODIGO, 'D', V_VEN_DATA_FINAL, V_CON_VALOR, V_CON_CREDITO, V_CON_DEBITO, V_USU_CODIGO_BAIXA);

 

ELSE

MSG := 'O CLIENTE ESTOUROU SEU LIMITE DE DÉBITO DE '|| REPLACE(REPLACE(TO_CHAR(V_LIMIT, 'L9G999G999G999D99'), ' ',''), 'R$', 'R$ ') ||

' PARA ' || REPLACE(REPLACE(TO_CHAR(V_CON_DEBITO, 'L9G999G999G999D99'), ' ',''), 'R$', 'R$ ') ||

'\nESTA VENDA NÃO PODE SER FINALIZADA COMO UMA VENDA À PRAZO.\nO CLIENTE DEVE FAZER O PAGAMENTO À VISTA DESTA VENDA!';

END IF;

 

EXCEPTION

WHEN unique_violation THEN

MSG := 'CHAVE PRIMÁRIA VIOLADA - VENDA À PRAZO |=> STATE OF SQL => ' || SQLERRM || ' - ERROR OF SQL => ' || SQLSTATE;

WHEN integrity_constraint_violation THEN

MSG := 'CHAVE ESTRANGEIRA VIOLADA - VENDA À PRAZO |=> STATE OF SQL => ' || SQLERRM || ' - ERROR OF SQL => ' || SQLSTATE;

END;

 

ELSE

MSG := 'A VENDA A PRAZO EXIGE QUE SEJA INFORMADO O CLIENTE!\nINFORME O CLIENTE PARA A FINALIZAÇÃO DESTA VENDA.';

END IF;

 

ELSE

V_CON_VALOR = V_VEN_VALOR_PAGO - V_VEN_VALOR_FINAL;

 

BEGIN

/*IF V_CON_CREDITO IS NOT NULL AND V_CON_CREDITO > 0.00 THEN

 

V_CON_CREDITO = V_CON_CREDITO + V_CON_VALOR;

V_CON_DEBITO = 0.00;

 

ELSE

IF V_CON_DEBITO IS NULL OR V_CON_DEBITO = 0.00 THEN

V_CON_CREDITO = V_CON_VALOR;

V_CON_DEBITO = 0.00;

 

ELSEIF V_CON_DEBITO > V_CON_VALOR THEN

 

V_CON_CREDITO = 0.00;

V_CON_DEBITO = V_CON_DEBITO - V_CON_VALOR;

 

ELSEIF V_CON_DEBITO < V_CON_VALOR THEN

 

V_CON_CREDITO = V_CON_VALOR - V_CON_DEBITO;

V_CON_DEBITO = 0.00;

 

END IF;

 

END IF;*/

 

UPDATE VENDA

SET /*VEN_COMANDA = V_VEN_COMANDA,*/

VEN_DATA_INICIO = V_VEN_DATA_INICIO,

VEN_TIPO = 'V',

VEN_TOTAL = V_VEN_TOTAL,

/*CLI_CODIGO = V_CLI_CODIGO,*/

USU_CODIGO_VENDA = V_USU_CODIGO_VENDA,

USU_CODIGO_BAIXA = V_USU_CODIGO_BAIXA,

VEN_USUB_NOME = V_USUB_NOME,

VEN_STATUS = V_VEN_STATUS,

VEN_DATA_FINAL = V_VEN_DATA_FINAL,

VEN_VALOR_FINAL = V_VEN_VALOR_FINAL,

VEN_VALOR_PAGO = V_VEN_VALOR_PAGO

WHERE VEN_CODIGO = V_VEN_CODIGO;

 

SELECT CAI_SALDO INTO V_CAI_SALDO

FROM SALDO_CAIXA

ORDER BY CAI_CODIGO DESC

LIMIT 1;

/*

IF V_CLI_CODIGO IS NULL THEN

*/

IF V_CAI_SALDO IS NOT NULL THEN/*SE JÁ TEM ALGUM VALOR NO CAIXA*/

SELECT (V_CAI_SALDO + V_VEN_VALOR_PAGO) INTO V_NEW_SALDO;/*SOMA O VALOR DO CAIXA MAIS O VALOR PAGO*/

ELSE

V_NEW_SALDO = V_VEN_VALOR_PAGO;

END IF;

 

INSERT INTO SALDO_CAIXA

(CAI_TIPO, CAI_DATA, CAI_DESCRICAO, CAI_VALOR, CAI_SALDO, CON_CODIGO, VEN_CODIGO, VEN_COMANDA, USU_CODIGO)

VALUES

('C',CURRENT_TIMESTAMP(0),'FINALIZAÇÃO DA COMANDA '|| V_VEN_COMANDA ||' - '|| REPLACE(REPLACE(TO_CHAR(V_VEN_VALOR_FINAL, 'L9G999G999G999D99'), ' ',''), 'R$', 'R$ '),

V_VEN_VALOR_PAGO, V_NEW_SALDO, NULL, V_VEN_CODIGO, V_VEN_COMANDA, V_USU_CODIGO_BAIXA);

/*

ELSE

 

IF V_CAI_SALDO IS NOT NULL THEN

SELECT (V_CAI_SALDO + V_VEN_VALOR_FINAL) INTO V_NEW_SALDO;

ELSE

V_CAI_SALDO = V_VEN_VALOR_FINAL;

END IF;

 

END IF;

*/

IF V_CON_VALOR > 0 THEN/*SE TEVE TROCO*/

/*

IF V_CLI_CODIGO IS NULL THEN

*/

SELECT (V_NEW_SALDO - V_CON_VALOR) INTO V_NEW_SALDO;

INSERT INTO SALDO_CAIXA

(CAI_TIPO, CAI_DATA, CAI_DESCRICAO, CAI_VALOR, CAI_SALDO, CON_CODIGO, VEN_CODIGO, VEN_COMANDA, USU_CODIGO)

VALUES

('D',CURRENT_TIMESTAMP(0),'TROCO DA COMANDA '|| V_VEN_COMANDA, V_CON_VALOR, V_NEW_SALDO, NULL, V_VEN_CODIGO, V_VEN_COMANDA, V_USU_CODIGO_BAIXA);

/*

ELSE

 

INSERT INTO VENSAL_CLIENTE

(VEN_CODIGO, VEN_COMANDA, VEN_DATA_INICIO, VEN_TIPO, VEN_TOTAL, CLI_CODIGO, USU_CODIGO_VENDA,

USU_CODIGO_BAIXA, VEN_STATUS, VEN_DATA_FINAL, VEN_VALOR_FINAL, VEN_VALOR_PAGO, VEN_USUV_NOME, VEN_USUB_NOME)

SELECT * FROM VENDA

WHERE VEN_CODIGO = V_VEN_CODIGO;

 

INSERT INTO SALDO_CLIENTE

(CON_CODIGO, CLI_CODIGO, VEN_CODIGO, CON_TIPO, CON_VALOR, CON_CREDITO, CON_DEBITO)

VALUES (CURRENT_TIMESTAMP(0), V_CLI_CODIGO, V_VEN_CODIGO, 'C', V_CON_VALOR, V_CON_CREDITO, V_CON_DEBITO);

 

SELECT CLI_NOME ||' '|| CLI_SOBRENOME INTO V_CLI_NOME

FROM CLIENTES

WHERE CLI_CODIGO = V_CLI_CODIGO;

 

INSERT INTO SALDO_CAIXA

(CAI_CODIGO, CAI_TIPO, CAI_DESCRICAO, CAI_VALOR, CAI_SALDO, CON_CODIGO, CLI_CODIGO, VEN_CODIGO, USU_CODIGO)

VALUES (CURRENT_TIMESTAMP(0),'C','INSERÇÃO DE CRÉDITOS DO CLIENTE '|| V_CLI_NOME, V_CON_VALOR, V_NEW_SALDO, V_VEN_CODIGO, V_CLI_CODIGO, V_VEN_CODIGO, V_VEN_COMANDA, V_USU_CODIGO_BAIXA);

 

END IF;

*/

END IF;

 

MSG := 'OPERAÇÃO DE ATUALIZAÇÃO CONCLUÍDAº' || V_VEN_CODIGO;/*qdo coloco a venda sem ser fiado é daqui q mostra a msg*/

 

EXCEPTION

WHEN unique_violation THEN

MSG := 'CHAVE PRIMÁRIA VIOLADA - VENDA À VISTA |=> STATE OF SQL => ' || SQLERRM || ' - ERROR OF SQL => ' || SQLSTATE;

WHEN integrity_constraint_violation THEN

MSG := 'CHAVE ESTRANGEIRA VIOLADA - VENDA À VISTA |=> STATE OF SQL => ' || SQLERRM || ' - ERROR OF SQL => ' || SQLSTATE;

END;

 

END IF;

 

END;

 

ELSE

MSG := 'AS OPERAÇÕES PARA ESTA VENDA FORAM BLOQUEADAS!\nESTA VENDA SE ENCONTRA FINALIZADA.';

END IF;

 

END IF;

 

END IF;

 

END IF;

 

RETURN (MSG);

 

END;

$$ LANGUAGE plpgsql;

Compartilhar este post


Link para o post
Compartilhar em outros sites

O mais provável é que você deu um SELECT em alguma parte do código sem o INTO. Por isso ele sugere o você usar o perform para descartar as linhas ^^.

 

Nessa linha, por exemplo, não tem o INTO, causando o erro.

 

SELECT * FROM VENDA

WHERE VEN_CODIGO = V_VEN_CODIGO;

Compartilhar este post


Link para o post
Compartilhar em outros sites

×

Informação importante

Ao usar o fórum, você concorda com nossos Termos e condições.