CRIAR CURSOR POSTGRES
Boa tarde, à Todos!
Venho por meio deste fórum, pedir um HELP para criação de um cursor que execute no PostGres 9.1.
Estou começando a trabalhar com Banco de Dados POSTGRES 9.1, pois tenho conhecimento de banco de dados Oracle.
Preciso criar um cursor para que a partir de uma data X e um valor inicial X, o cursor CALCULE o valor da coluna INICIAL (menos) o valor da coluna VENDAS, e se a caso tiver valor na coluna COMPRA some o valor e insira este valor na próxima coluna (dia seguinte)
((INICIAL – VENDAS) + COMPRA)
No ORACLE criei o cursor da seguinte forma:
DECLARE
/** VALOR INICIAL DA VARIAVEL**/
v_SALDO TBESTOQUETANQUES.INICIAL%TYPE := 4319.74;
BEGIN
FOR TESTE IN (
SELECT CODIGO,DATA,DESCRICAO,INICIAL,COMPRAS,VENDAS,PERIODO FROM TBESTOQUETANQUES ORDER BY PERIODO)
LOOP
/** IRAR ALTERAR O INICIAL DE ACORDO COM O VALOR QUE ESTÁ NA MINHA VARIAVEL**/
UPDATE TBESTOQUETANQUES SET INICIAL=v_SALDO WHERE CODIGO=TESTE.CODIGO;
/** MOSTRAR COMO ESTÁ INDO**/
DBMS_OUTPUT.PUT_LINE(TESTE.CODIGO||' ---- '||TESTE.DATA||' ---- '||
TESTE.DESCRICAO||' ---- '||TESTE.INICIAL||' ---- '||TESTE.COMPRAS||' ---- '||TESTE.VENDAS||' ---- '||TESTE.PERIODO);
/** EFETUO O CALCULO PARA IDENTIFICAR O VALOR DO PROXIMO REGISTRO DO INICIAL**/
SELECT ((INICIAL-VENDAS)+COMPRAS) INTO v_SALDO FROM TBESTOQUETANQUES
WHERE CODIGO=TESTE.CODIGO;
COMMIT;
END LOOP;
END;
No POSTGRES criei o FUNCTION/CURSOR da seguinte forma:
Alguém saberia me dizer como montar este cursor de forma correta, para que não apresente a mensagem de erro abaixo?
CREATE OR REPLACE FUNCTION cursor_inicial()
RETURNS integer AS $$
DECLARE
v_SALDO TBESTOQUETANQUES.INICIAL%TYPE:= 4319.74; --Digite o valor inicial do estoque
cursor_teste CURSOR FOR (
SELECT CODIGO, DATA, DESCRICAO, INICIAL, COMPRAS, VENDAS, PERIODO
FROM TBESTOQUETANQUES ORDER BY PERIODO);
BEGIN
OPEN cursor_teste;
LOOP
UPDATE TBESTOQUETANQUES SET INICIAL=v_SALDO
WHERE DATA >= '2015-02-01'; -- Data inicial para o calculo
RAISE NOTICE 'Codigo %', TBESTOQUETANQUES.CODIGO,
'Data %', TBESTOQUETANQUES.DATA,
'Descricao %', TBESTOQUETANQUES.DESCRICAO,
'Inicial %', TBESTOQUETANQUES.INICIAL,
'Compras %', TBESTOQUETANQUES.COMPRAS,
'Vendas %', TBESTOQUETANQUES.VENDAS,
'Periodo %', TBESTOQUETANQUES.PERIODO;
SELECT ((INICIAL-VENDAS)+COMPRAS)
INTO v_SALDO
FROM TBESTOQUETANQUES
WHERE TBESTOQUETANQUES.DATA >='2015-02-01'; --Digite a DATA inicial para o ajuste
COMMIT;
END LOOP;
CLOSE cursor_teste;
END;
$$ LANGUAGE 'plpgsql';
SELECT cursor_inicial(); --SELECT Q EXECUTA À FUNÇÃO/CURSOR
/** MENSAGEM DE ERRO AO EXECUTAR A FUNCTION */
ERRO: faltando entrada para tabela "tbestoquetanques" na cláusula FROM
LINE 1: SELECT TBESTOQUETANQUES.CODIGO
^
QUERY: SELECT TBESTOQUETANQUES.CODIGO
CONTEXT: função PL/pgSQL cursor_inicial6() linha 19 em RAISE
********** Error **********
ERRO: faltando entrada para tabela "tbestoquetanques" na cláusula FROM
SQL state: 42P01
Venho por meio deste fórum, pedir um HELP para criação de um cursor que execute no PostGres 9.1.
Estou começando a trabalhar com Banco de Dados POSTGRES 9.1, pois tenho conhecimento de banco de dados Oracle.
Preciso criar um cursor para que a partir de uma data X e um valor inicial X, o cursor CALCULE o valor da coluna INICIAL (menos) o valor da coluna VENDAS, e se a caso tiver valor na coluna COMPRA some o valor e insira este valor na próxima coluna (dia seguinte)
((INICIAL – VENDAS) + COMPRA)
No ORACLE criei o cursor da seguinte forma:
DECLARE
/** VALOR INICIAL DA VARIAVEL**/
v_SALDO TBESTOQUETANQUES.INICIAL%TYPE := 4319.74;
BEGIN
FOR TESTE IN (
SELECT CODIGO,DATA,DESCRICAO,INICIAL,COMPRAS,VENDAS,PERIODO FROM TBESTOQUETANQUES ORDER BY PERIODO)
LOOP
/** IRAR ALTERAR O INICIAL DE ACORDO COM O VALOR QUE ESTÁ NA MINHA VARIAVEL**/
UPDATE TBESTOQUETANQUES SET INICIAL=v_SALDO WHERE CODIGO=TESTE.CODIGO;
/** MOSTRAR COMO ESTÁ INDO**/
DBMS_OUTPUT.PUT_LINE(TESTE.CODIGO||' ---- '||TESTE.DATA||' ---- '||
TESTE.DESCRICAO||' ---- '||TESTE.INICIAL||' ---- '||TESTE.COMPRAS||' ---- '||TESTE.VENDAS||' ---- '||TESTE.PERIODO);
/** EFETUO O CALCULO PARA IDENTIFICAR O VALOR DO PROXIMO REGISTRO DO INICIAL**/
SELECT ((INICIAL-VENDAS)+COMPRAS) INTO v_SALDO FROM TBESTOQUETANQUES
WHERE CODIGO=TESTE.CODIGO;
COMMIT;
END LOOP;
END;
No POSTGRES criei o FUNCTION/CURSOR da seguinte forma:
Alguém saberia me dizer como montar este cursor de forma correta, para que não apresente a mensagem de erro abaixo?
CREATE OR REPLACE FUNCTION cursor_inicial()
RETURNS integer AS $$
DECLARE
v_SALDO TBESTOQUETANQUES.INICIAL%TYPE:= 4319.74; --Digite o valor inicial do estoque
cursor_teste CURSOR FOR (
SELECT CODIGO, DATA, DESCRICAO, INICIAL, COMPRAS, VENDAS, PERIODO
FROM TBESTOQUETANQUES ORDER BY PERIODO);
BEGIN
OPEN cursor_teste;
LOOP
UPDATE TBESTOQUETANQUES SET INICIAL=v_SALDO
WHERE DATA >= '2015-02-01'; -- Data inicial para o calculo
RAISE NOTICE 'Codigo %', TBESTOQUETANQUES.CODIGO,
'Data %', TBESTOQUETANQUES.DATA,
'Descricao %', TBESTOQUETANQUES.DESCRICAO,
'Inicial %', TBESTOQUETANQUES.INICIAL,
'Compras %', TBESTOQUETANQUES.COMPRAS,
'Vendas %', TBESTOQUETANQUES.VENDAS,
'Periodo %', TBESTOQUETANQUES.PERIODO;
SELECT ((INICIAL-VENDAS)+COMPRAS)
INTO v_SALDO
FROM TBESTOQUETANQUES
WHERE TBESTOQUETANQUES.DATA >='2015-02-01'; --Digite a DATA inicial para o ajuste
COMMIT;
END LOOP;
CLOSE cursor_teste;
END;
$$ LANGUAGE 'plpgsql';
SELECT cursor_inicial(); --SELECT Q EXECUTA À FUNÇÃO/CURSOR
/** MENSAGEM DE ERRO AO EXECUTAR A FUNCTION */
ERRO: faltando entrada para tabela "tbestoquetanques" na cláusula FROM
LINE 1: SELECT TBESTOQUETANQUES.CODIGO
^
QUERY: SELECT TBESTOQUETANQUES.CODIGO
CONTEXT: função PL/pgSQL cursor_inicial6() linha 19 em RAISE
********** Error **********
ERRO: faltando entrada para tabela "tbestoquetanques" na cláusula FROM
SQL state: 42P01
Vinicius Redorat
Curtidas 0
Respostas
Ronaldo Lanhellas
13/02/2015
Tente mudar o seu DECLARE para:
v_SALDO NUMERIC(15,2) := 4319.74; --Digite o valor inicial do estoque
GOSTEI 0
Ronaldo Lanhellas
13/02/2015
Tente mudar o seu DECLARE para:
v_SALDO NUMERIC(15,2) := 4319.74; --Digite o valor inicial do estoque
GOSTEI 0
Vinicius Redorat
13/02/2015
Ronaldo, boa tarde!
primeiramente obrigado pela ajuda.
Apliquei alteração, conforme mostra na imagem e a mensagem em anexo e o erro persiste!
[img]http://arquivo.devmedia.com.br/forum/imagem/387430-20150213-173615.jpg[/img]
primeiramente obrigado pela ajuda.
Apliquei alteração, conforme mostra na imagem e a mensagem em anexo e o erro persiste!
[img]http://arquivo.devmedia.com.br/forum/imagem/387430-20150213-173615.jpg[/img]
GOSTEI 0