Dynamic SQL Error expression evaluation not supported
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:
Obrigado desde já,
Rogério
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
Curtidas 0
Melhor post
Emerson Nascimento
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));
Nr_Documento_Aux = Nr_Documento_Aux || CAST(Digito_2 AS VARCHAR(1));
GOSTEI 1
Mais Respostas
Emerson Nascimento
06/12/2023
não deveriam ser aspas duplas:
Nr_Documento_Aux = LTRIM(RTRIM("Nr_Documento"));
há mais de um comando assim
Nr_Documento_Aux = LTRIM(RTRIM("Nr_Documento"));
há mais de um comando assim
GOSTEI 0
Rogério Monteiro
06/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));
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!!!
GOSTEI 0
Arthur Heinrich
06/12/2023
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.
GOSTEI 1
Emerson Nascimento
06/12/2023
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.
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.
GOSTEI 0
Arthur Heinrich
06/12/2023
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.
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.
GOSTEI 0