“CURSOR”或其附近的语法错误

时间:2015-10-30 04:17:34

标签: postgresql plpgsql pgadmin

我的代码出现了这个错误,我不知道可能是什么。我刚开始使用PL / pgSQL。对不起,如果这是一个愚蠢的问题。

错误:“CURSOR”或附近的语法错误 第9行:CURSOR reg_notif IS SELECT * FROM sv_notificacao;          ^ **********错误**********

我的代码:

CREATE OR REPLACE FUNCTION checa_multa()
RETURNS INT AS 
$$
DECLARE 
CURSOR reg_notif IS SELECT * FROM sv_notificacao;


BEGIN
OPEN reg_notif;
LOOP
    FETCH reg_notif INTO rn_linha

    IF rn_linha.placa_veiculo IN (SELECT sv_veiculo.placa FROM sv_veiculo) --A placa informada na notificação deverá existir no cadastro de veículos;
    AND rn_linha.nro_cnh IN (SELECT sv_condutor.nro_cnh FROM sv_condutor) --O número da CNH deverá ser existir no cadastro de condu
    AND rn_linha.data_hora IS NOT NULL --A dtaa informada deve estar preenchida
    AND rn_linha.data_hora <= CURRENT_DATE -- A nada informada não deverá ser futura
    AND rn_linha.velocidade_inf> 0 --velocidade apurada superior a zero
    AND rn_linha.velocidade_via > 0 --valocidade da via superior a zero

    THEN
        CREATE TABLE sv_infracao
        (
            cod_infracao SERIAL PRIMARY KEY,

            cod_cpf BIGINT,
            cnh_condutor VARCHAR(11),
            placa_veiculo VARCHAR(7),
            data_hora TIMESTAMP DEFAULT NULL,
            velocidade_inf INT DEFAULT NULL,
            velocidade_via INT DEFAULT NULL,

            CONSTRAINT sv_infracao_sv_condutor FOREIGN KEY (cnh_condutor) REFERENCES sv_condutor (nro_cnh),
            CONSTRAINT sv_infracao_sv_veiculo FOREIGN KEY (placa_veiculo) REFERENCES sv_veiculo (placa)
        );

        INSERT INTO sv_infracao (cod_cpf, cnh_condutor, placa_veiculo, data_hora, velocidade_inf, velocidade_via) 
        VALUES rn_linha.cod_cpf, rn_linha.cnh_condutor, rn_linha.placa_veiculo, rn_linha.data_hora, rn_linha.velocidade_inf, rn_linha.velocidade_via) ;


    ELSE
        CREATE TABLE sv_log_erro
        (
            cod_log SERIAL PRIMARY KEY,

            notificacao INT,
            descricao_problema TEXT,

            CONSTRAINT sv_log_erro_sv_notificacao FOREIGN KEY (notificacao) REFERENCES sv_notificacao (cod_notif)
        );

        --Placa nao esta cadastrada no cadaastro de veiculos
        IF placa NOT IN (SELECT sv_veiculo.placa FROM sv_veiculo) THEN
            INSERT INTO sv_log_erro (notificacao, descricao_problema)
            VALUES (rn_linha.cod_notif, 'A Placa: ' || rn_linha.placa_veiculo || ' não foi localizada');
        END IF;

        --Condutor não localizado
        IF cnh NOT IN (SELECT sv_condutor.nro_cnh FROM sv_condutor) THEN
            INSERT INTO sv_log_erro (notificacao, descricao_problema)
            VALUES (rn_linha.cod_notif, 'A CNH: ' || rn_linha.nro_cnh || ' do Condutor informado não foi localizada');
        END IF;

        --Data não informada
        IF data IS NULL THEN
            INSERT INTO sv_log_erro (notificacao, descricao_problema)
            VALUES (rn_linha.cod_notif, 'Data não preenchida');
        END IF;

        --Data do futuro
        IF data > CURRENT_DATE THEN
            INSERT INTO sv_log_erro (notificacao, descricao_problema)
            VALUES (rn_linha.cod_notif, 'Data de notificação informada é do futuro '||data);
        END IF;

        --Velocidade nao informada
        IF velocidadeInf <= 0 THEN
            INSERT INTO sv_log_erro (notificacao, descricao_problema)
            VALUES (rn_linha.cod_notif, 'Velocidade apurada do veiculo '|| rn_linha.placa_veiculo ||' não informada');
        END IF;

        --Velocidade nao informada
        IF velocidadeVia <= 0 THEN
            INSERT INTO sv_log_erro (notificacao, descricao_problema)
            VALUES (rn_linha.cod_notif, 'Velocidade da via do veículo '|| placarn_linha.placa_veiculo ||' não informada');
        END IF;
    END IF;
END LOOP;
CLOSE reg_notif;
RETURN retorno;
END;
$$ LANGUAGE plpgsql;
SELECT checa_multa()

1 个答案:

答案 0 :(得分:1)

尝试更改以下内容: DECLARE CURSOR reg_notif FOR SELECT Field1, Field2 FROM sv_notificacao;
使用FOR代替IS
不要在*列表中使用SELECT,因为我们在单个字段中提取CURSOR值,即&#34; rn_linha&#34;在我们的例子中。由于*可以返回超过1个与FETCH值不匹配的字段。 如果问题在更改后仍然存在,请立即使用。