Ir para conteúdo
Fórum CódigoFonte.net

Tiago Maia

Membros
  • Total de itens

    8
  • Registro em

  • Última visita

  1. Tiago Maia

    TRIGGER

    O tipo de retorno é "trigger". Segue um exemplo: -- Exemplo de FUNÇÃO DE TRIGGER. CREATE OR REPLACE FUNCTION ftri_orcamentoanual() RETURNS "trigger" AS $$ BEGIN IF NEW.id IS NULL THEN NEW.id := nextval('seq_orcamentoAnual'); END IF; RETURN NEW; END; $$ LANGUAGE 'plpgsql'; -- Exemplo de TRIGGER. CREATE TRIGGER tri_orcamentoanual BEFORE INSERT ON tab_orcamentoanual FOR EACH ROW EXECUTE PROCEDURE ftri_orcamentoanual(); - Tiago Maia.
  2. Mais um exemplo legal de funções. Neste exemplo vou mostrar uma FUNÇÃO que monta dinâmicamente uma QUERY e retorna o seu resultado em várias colunas. Atenção aos parâmetros de entrada e saída. Atenção com o tipo de retorno da FUNÇÃO. A QUERY é montada dentro de uma variável VARCHAR, portanto devemos ter atenção com a palavra reservada EXECUTE no FOR da FUNÇÃO antes de referenciar a variável com a QUERY. Segue o código de exemplo: CREATE OR REPLACE FUNCTION func_consultar_orcamentoanual(IN p_id INTEGER, IN p_estado VARCHAR, IN p_diretoria VARCHAR, IN p_ano INTEGER, OUT id INTEGER, OUT estado VARCHAR, OUT diretoria VARCHAR, OUT ano INTEGER) RETURNS SETOF record AS $$ DECLARE v_cont INTEGER = 0; v_totalParametros INTEGER = 0; v_sql VARCHAR = ''; v_condicao VARCHAR = ''; resultado RECORD; BEGIN ----- Conta os parâmetros ----- IF p_id IS NOT NULL THEN v_totalParametros := v_totalParametros + 1; END IF; IF p_estado IS NOT NULL THEN v_totalParametros := v_totalParametros + 1; END IF; IF p_diretoria IS NOT NULL THEN v_totalParametros := v_totalParametros + 1; END IF; IF p_ano IS NOT NULL THEN v_totalParametros := v_totalParametros + 1; END IF; ----- Monta o WHERE da QUERY ----- WHILE v_cont < v_totalParametros LOOP IF v_cont > 1 THEN v_condicao := v_condicao || ' AND '; END IF; IF p_id IS NOT NULL THEN v_condicao := v_condicao || 'id = ' || p_id; v_cont := v_cont + 1; IF v_cont < v_totalParametros THEN v_condicao := v_condicao || ' AND '; END IF; END IF; IF p_estado IS NOT NULL THEN v_condicao := v_condicao || 'estado = ' || '\'' || p_estado || '\''; v_cont := v_cont + 1; IF v_cont < v_totalParametros THEN v_condicao := v_condicao || ' AND '; END IF; END IF; IF p_diretoria IS NOT NULL THEN v_condicao := v_condicao || 'diretoria = ' || '\'' || p_diretoria || '\''; v_cont := v_cont + 1; IF v_cont < v_totalParametros THEN v_condicao := v_condicao || ' AND '; END IF; END IF; IF p_ano IS NOT NULL THEN v_condicao := v_condicao || 'ano = ' || p_ano; v_cont := v_cont + 1; IF v_cont < v_totalParametros THEN v_condicao := v_condicao || ' AND '; END IF; END IF; END LOOP; ----- Inicia a QUERY ----- v_sql := 'SELECT * FROM tab_orcamentoAnual'; ----- Tendo UM ou mais parâmetros, insere a cláusula WHERE na QUERY ----- IF v_totalParametros > 0 THEN v_sql := v_sql || ' WHERE '; END IF; ----- Finaliza a QUERY ----- v_sql := v_sql || v_condicao; ----- Executa a QUERY ----- FOR resultado IN EXECUTE v_sql LOOP id := resultado.id; estado := resultado.estado; diretoria := resultado.diretoria; ano := resultado.ano; RETURN NEXT; END LOOP; END; $$ LANGUAGE 'plpgsql'; Abraço a todos! - Tiago Maia
  3. Como o código acima ficou meio estranho devido ao anuncio, estou disponibilizando novamente! CREATE OR REPLACE FUNCTION func_listar_orcamentoanual(OUT id INTEGER, OUT estado VARCHAR, OUT diretoria VARCHAR, OUT ano INTEGER) RETURNS SETOF record AS $$ DECLARE resultado RECORD; BEGIN FOR resultado IN SELECT * FROM tab_orcamentoAnual LOOP id := resultado.id; estado := resultado.estado; diretoria := resultado.diretoria; ano := resultado.ano; RETURN NEXT; END LOOP; END; $$ LANGUAGE 'plpgsql';
  4. Bom dia galera! Deixarei aqui como exemplo uma FUNÇÃO que retorna mais de uma coluna como resultado. Atenção ao tipo de retorno da função e aos parâmetros de saída. Segue o exemplo: CREATE OR REPLACE FUNCTION func_listar_orcamentoanual(OUT id INTEGER, OUT estado VARCHAR, OUT diretoria VARCHAR, OUT ano INTEGER) RETURNS SETOF record AS $$ DECLARE resultado RECORD; BEGIN FOR resultado IN SELECT * FROM tab_orcamentoAnual LOOP id := resultado.id; estado := resultado.estado; diretoria := resultado.diretoria; ano := resultado.ano; RETURN NEXT; END LOOP; END; $$ LANGUAGE 'plpgsql'; Até a próxima! - Tiago Maia
  5. Tiago Maia

    Exemplo de PROCEDURE

    Senhores, bom dia! Deixo aqui um exemplo de PROCEDURE. Esta PROCEDURE utiliza uma SEQUENCE, então coloquei também o código de criação da mesma. -- Cria a SEQUENCE CREATE SEQUENCE seq_orcamentoanual INCREMENT 1 MINVALUE 1 NO MAXVALUE START 1 CACHE 1; -- Cria a PROCEDURE CREATE OR REPLACE FUNCTION proc_cadastrar_orcamentoanual(p_estado character varying, p_diretoria character varying, p_ano integer) RETURNS void AS $$ BEGIN INSERT INTO Tab_orcamentoAnual( id, estado, diretoria, ano ) VALUES( nextval('seq_orcamentoAnual'), p_estado, p_diretoria, p_ano ); END; $$ LANGUAGE 'plpgsql'; - Tiago Maia
  6. Foi mal gente! Esqueci de corrigir o FOR da função completa. É assim que deve ficar: ----- Executa a QUERY ----- FOR resultado IN EXECUTE v_sql LOOP id := resultado.id; estado := resultado.estado; diretoria := resultado.diretoria; ano := resultado.ano; RETURN NEXT; END LOOP; Vlw!
  7. SOLUCIONADO!!! Foi só colocar a palavra reservada EXECUTE depois do IN no FOR. O FOR ficou assim: FOR resultado IN EXECUTE v_sql LOOP id := resultado.id; estado := resultado.estado; diretoria := resultado.diretoria; ano := resultado.ano; RETURN NEXT; END LOOP; Quando a query é informada direto no LOOP, não precisa do EXECUTE, mas quando ela esta em uma variável VARCHAR, é necessário colocar o EXECUTE. Aqui esta a função completa que monta uma query dinâmica: CREATE OR REPLACE FUNCTION func_consultar_orcamentoanual(IN p_id INTEGER, IN p_estado VARCHAR, IN p_diretoria VARCHAR, IN p_ano INTEGER, OUT id INTEGER, OUT estado VARCHAR, OUT diretoria VARCHAR, OUT ano INTEGER) RETURNS SETOF record AS $$ DECLARE v_cont INTEGER = 0; v_totalParametros INTEGER = 0; v_sql VARCHAR = ''; v_condicao VARCHAR = ''; resultado RECORD; BEGIN ----- Preenche as Variáveis e conta os parâmetros ----- IF p_id IS NOT NULL THEN v_totalParametros := v_totalParametros + 1; END IF; IF p_estado IS NOT NULL THEN v_totalParametros := v_totalParametros + 1; END IF; IF p_diretoria IS NOT NULL THEN v_totalParametros := v_totalParametros + 1; END IF; IF p_ano IS NOT NULL THEN v_totalParametros := v_totalParametros + 1; END IF; ----- Monta o WHERE da QUERY ----- WHILE v_cont < v_totalParametros LOOP IF v_cont > 1 THEN v_condicao := v_condicao || ' AND '; END IF; IF p_id IS NOT NULL THEN v_condicao := v_condicao || 'id = ' || p_id; v_cont := v_cont + 1; IF v_cont < v_totalParametros THEN v_condicao := v_condicao || ' AND '; END IF; END IF; IF p_estado IS NOT NULL THEN v_condicao := v_condicao || 'estado = ' || '\'' || p_estado || '\''; v_cont := v_cont + 1; IF v_cont < v_totalParametros THEN v_condicao := v_condicao || ' AND '; END IF; END IF; IF p_diretoria IS NOT NULL THEN v_condicao := v_condicao || 'diretoria = ' || '\'' || p_diretoria || '\''; v_cont := v_cont + 1; IF v_cont < v_totalParametros THEN v_condicao := v_condicao || ' AND '; END IF; END IF; IF p_ano IS NOT NULL THEN v_condicao := v_condicao || 'ano = ' || p_ano; v_cont := v_cont + 1; IF v_cont < v_totalParametros THEN v_condicao := v_condicao || ' AND '; END IF; END IF; END LOOP; ----- Inicia a QUERY ----- v_sql := 'SELECT * FROM tab_orcamentoAnual'; ----- Tendo UM ou mais parâmetros, insere a cláusula WHERE na QUERY ----- IF v_totalParametros > 0 THEN v_sql := v_sql || ' WHERE '; END IF; ----- Finaliza a QUERY ----- v_sql := v_sql || v_condicao; ----- Executa a QUERY ----- FOR resultado IN SELECT * FROM tab_orcamentoAnual LOOP id := resultado.id; estado := resultado.estado; diretoria := resultado.diretoria; ano := resultado.ano; RETURN NEXT; END LOOP; END; $$ LANGUAGE 'plpgsql'; Facinho né?! Abraço a todos e até a próxima!
  8. Pessoal, boa tarde! Sou novo aqui! :D Tenho uma dúvida! Como converter uma variável VARCHAR em uma QUERY em plpgsql? Tenho uma FUNÇÃO e nela eu preciso executar um FOR que usa uma query. DECLARE resultado RECORD; v_sql VARCHAR = ''; BEGIN v_sql := 'SELECT * FROM tab_orcamentoAnual'; FOR resultado IN v_sqlLOOP id := resultado.id; estado := resultado.estado; diretoria := resultado.diretoria; ano := resultado.ano; RETURN NEXT; END LOOP; END; Dentro do FOR no lugar da variável v_sql deve ser inserido uma QUERY, mas eu preciso montar esta QUERY dinamicamente, e eu faço isso através de uma VARCHAR. Só que, ao informar a variável VARCHAR no FOR, ele da o seguinte erro: ERROR: syntax error at or near "$1" LINE 1: $1 ^ QUERY: $1 CONTEXT: SQL statement in PL/PgSQL function "func_consultar_orcamentoanual" near line 81 Tem como alguém me ajudar? Obrigado!
×
×
  • Criar Novo...