我的代码出现了这个错误,我不知道可能是什么。我刚开始使用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()
答案 0 :(得分:1)
尝试更改以下内容:
DECLARE CURSOR reg_notif FOR SELECT Field1, Field2 FROM sv_notificacao;
使用FOR
代替IS
不要在*
列表中使用SELECT
,因为我们在单个字段中提取CURSOR
值,即&#34; rn_linha&#34;在我们的例子中。由于*
可以返回超过1个与FETCH
值不匹配的字段。
如果问题在更改后仍然存在,请立即使用。