Dynamic SQL Error expression evaluation not supported

06/12/2023

0

SQL

Olá a todos!

Gostaria que alguém pudesse me ajudar com o erro acima. Quando clico em OK no IBConsole na criação de Stored Procedures, ele devolve este erro, mas não aponta a linha nem nada. Segue abaixo o código:

BEGIN
     /*DECLARE VARIABLE
        Contador_1 INT,
        Contador_2 INT,
        Digito_1 INT,
        Digito_2 INT,
        Nr_Documento_Aux VARCHAR(11)*/
 
    -- Remove espaços em branco
    Nr_Documento_Aux = LTRIM(RTRIM("Nr_Documento"));
    Digito_1 = 0;
 
 
    -- Remove os números que funcionam como validação para CPF, pois eles "passam" pela regra de validação
    IF (Nr_Documento_Aux IN (''''00000000000'''', ''''11111111111'''', ''''22222222222'''', ''''33333333333'''', ''''44444444444'''', ''''55555555555'''', ''''66666666666'''', ''''77777777777'''', ''''88888888888'''', ''''99999999999'''', ''''12345678909'''')) THEN
        cValido = ''''0'''';
 
    -- Verifica se possui apenas 11 caracteres
    IF (STRLEN(Nr_Documento_Aux) <> 11) THEN
        cValido = ''''0'''';
    ELSE 
    BEGIN
 
        -- Cálculo do segundo dígito
        Nr_Documento_Aux = SUBSTR(Nr_Documento_Aux, 1, 9);
 
        Contador_1 = 2;
 
        WHILE (Contador_1 <= 10) DO
        BEGIN 
            Digito_1 = Digito_1 + (Contador_1 * CAST(SUBSTR(Nr_Documento_Aux, 11 - Contador_1, 1) as int));
            Contador_1 = Contador_1 + 1;
        end 
 
        Digito_1 = Digito_1 - (Digito_1/11)*11;
 
        IF (Digito_1 <= 1) THEN
            Digito_1 = 0;
        ELSE 
            Digito_1 = 11 - Digito_1;
 
        Nr_Documento_Aux = Nr_Documento_Aux + CAST(Digito_1 AS VARCHAR(1));
 
        IF (Nr_Documento_Aux <> SUBSTR("Nr_Documento", 1, 10)) THEN
            cValido = ''''0'''';
        ELSE
        BEGIN 
        
            -- Cálculo do segundo dígito
            Digito_2 = 0;
            Contador_2 = 2;
 
            WHILE (Contador_2 <= 11) DO
            BEGIN 
                Digito_2 = Digito_2 + (Contador_2 * CAST(SUBSTR(Nr_Documento_Aux, 12 - Contador_2, 1) AS INT));
                Contador_2 = Contador_2 + 1;
            end 
 
            Digito_2 = Digito_2 - (Digito_2/11)*11;
 
            IF (Digito_2 < 2) THEN
                Digito_2 = 0;
            ELSE 
                Digito_2 = 11 - Digito_2;
 
            Nr_Documento_Aux = Nr_Documento_Aux + CAST(Digito_2 AS VARCHAR(1));
 
            IF (Nr_Documento_Aux <> "Nr_Documento") THEN
                cValido = ''''0'''';
                
        END
    END 
    
    cValido = ''''1'''';
    
END


Obrigado desde já,

Rogério
Rogério Monteiro

Rogério Monteiro

Responder

Post mais votado

08/12/2023

outra coisa: concatenações de strings devem ser efetuadas com || no lugar de + [sinal de adição]

Nr_Documento_Aux = Nr_Documento_Aux || CAST(Digito_2 AS VARCHAR(1));

Emerson Nascimento

Emerson Nascimento
Responder

Mais Posts

08/12/2023

Emerson Nascimento

não deveriam ser aspas duplas:

Nr_Documento_Aux = LTRIM(RTRIM("Nr_Documento"));

há mais de um comando assim
Responder

09/12/2023

Rogério Monteiro

outra coisa: concatenações de strings devem ser efetuadas com || no lugar de + [sinal de adição]

Nr_Documento_Aux = Nr_Documento_Aux || CAST(Digito_2 AS VARCHAR(1));


Muito obrigado, Emerson! Eu não tinha me atentado ao sinal de concatenação. Agora funcionou. Boas vibrações!!!
Responder

11/12/2023

Arthur Heinrich

Só para ficar claro o erro, ao utilizar o símbolo "+" para "tentar" concatenar, o banco entendeu que você queria fazer uma soma. Então, tentou converter de forma implícita as expressões a serem somadas. Como elas não representavam valores numéricos, houve erro de conversão.
Responder

13/12/2023

Emerson Nascimento

Arthur Heinrich, aparentemente ele está usando Firebird.
Se for esse o caso, não há tentativa de conversão. O mecanismo do banco vai tentar somar as strings mesmo. Mesmo que você faça '2'+'2' não vai funcionar.
Responder

14/12/2023

Arthur Heinrich

Arthur Heinrich, aparentemente ele está usando Firebird.
Se for esse o caso, não há tentativa de conversão. O mecanismo do banco vai tentar somar as strings mesmo. Mesmo que você faça '2'+'2' não vai funcionar.


Segundo o documento: https://firebirdsql.org/file/documentation/chunk/en/refdocs/fblangref30/fblangref30-datatypes-conversion.html

In Dialect 1, mixing integer data and numeric strings is usually possible because the parser will try to cast the string implicitly. For example,

2 + '1'
will be executed correctly.

Porém, parece que funciona só para valores numéricos.
Responder

Utilizamos cookies para fornecer uma melhor experiência para nossos usuários, consulte nossa política de privacidade.

Aceitar