2015-10-30 99 views
-1

我在代碼中收到此錯誤,我不知道可能是什麼。我剛剛開始使用PL/pgSQL。對不起,如果這是一個愚蠢的問題。在「CURSOR」處或附近出現語法錯誤

錯誤:在「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

我從來沒有見過關於語法的PL/SQL錯誤消息,該消息沒有包含比* SYNTAX ERROR更接近*的信息。什麼是你得到的具體(和完整)的錯誤信息? –

回答

1

試着改變一些事情,如: DECLARE CURSOR reg_notif FOR SELECT Field1, Field2 FROM sv_notificacao;
使用FOR而不是IS
請勿在SELECT列表中使用*列表,因爲我們在單個字段中獲取CURSOR值,即我們的情況下爲「rn_linha」。由於*可能會返回多於1個與FETCH值不匹配的字段。 現在,如果問題在更改後仍然存在,請立即使用。

相關問題