Fórum O que está errado nesta SP? #52223

15/08/2005

0

Input

:Tipo
:ID_Marca
:Marca

OutPut

:Resposta

begin
if (:Tipo = 1 ) then
if (not exists (select * from Tab_Marca where :Marca = Marca)) then
insert into Tab_marca values (:Marca)
else
select :Resposta = ´X´
else
if (:Tipo = 2) then
if (not exists (select * from Tab_modelo where :ID_marca = ID_Marca))
delete from Tab_marca :ID_marca = ID_marca
else
select @Resposta = ´X´
else
if (:Tipo = 3) then
update Tab_marca set Marca = :Marca
where :ID_Marca = ID_Marca
suspend;
end



Sempre ocorre este erro:

Invalid token.
Dynamic SQL Error.
SQL error code = -104.
Token unknown - line 12, char 7.
else.

O que devo fazer?


Ullrich

Ullrich

Responder

Posts

15/08/2005

Afarias

Tá faltando todos os ponto-e-vírgula, e use BEGIN END (e atenção em vários outros erros de sintaxe!)::

if (:Tipo = 1 ) then 
begin
  if (not exists (select * from Tab_Marca where Marca = :Marca)) then 
    insert into Tab_marca values (:Marca) ;
  else 
    Resposta = ´X´ ;
end else 
if (:Tipo = 2) then 
begin
  if (not exists (select * from Tab_modelo where ID_marca = :ID_Marca)) then
   delete from Tab_marca where ID_marca = :ID_marca ;
  else 
    Resposta = ´X´ ;
end else 
if (:Tipo = 3) then 
  update Tab_marca set Marca = :Marca 
  where ID_Marca = :ID_Marca ;
suspend; 



T+


Responder

Gostei + 0

15/08/2005

Ullrich

Fiz desta forma e o erro está indicado pela seta <===

erro:
Invalid token.
Dynamic SQL Error.
SQL error code = -104.
Token unknown - line 13, char 28.
=.

No InterBase como faço para atribuir um valor em uma variavel de retorno?
?? Select :Resposta = ´X´ ??

CREATE PROCEDURE NEW_PROCEDURE (
´:TIPO´ INTEGER,
´:ID_MARCA´ INTEGER,
´:MARCA´ VARCHAR(150))
RETURNS (
´:RESPOSTA´ VARCHAR(1))
AS
begin
if (:Tipo = 1 ) then
if (not exists (select * from Tab_Marca where :Marca = Marca)) then
insert into Tab_marca values (:Marca);
else
select :Resposta = ´X´ <===
end
else
if (:Tipo = 2) then
if (not exists (select * from Tab_modelo where :ID_marca = ID_Marca))
delete from Tab_marca :ID_marca = ID_marca
else
select @Resposta = ´X´
else
if (:Tipo = 3) then
update Tab_marca set Marca = :Marca
where :ID_Marca = ID_Marca
suspend;
end


Responder

Gostei + 0

15/08/2005

Afarias

não existe isso:

select :Resposta = ´X´

nem isso:

select @Resposta = ´X´

se quer dizer q a variável Resposta recebe o valor ´X´ faça apenas:

Resposta = ´X´ ;


T+


Responder

Gostei + 0

15/08/2005

Ullrich

Obrigado afarias, em SqlServer eu faço assim select variavel = ´valor´

porem não sabia em InterBase.

valeu mesmo...


Responder

Gostei + 0

15/08/2005

Ullrich

Deu certo, mas gerou outro erro, vc pode me ajudar é o meu primeiro procedimento em Interbase.

Esta seta indica a linha do erro <===
obs: com ou sem os : gerra o mesmo erro
:Tipo
Tipo
-----
Column does not belong to referenced table.
Dynamic SQL Error.
SQL error code = -206.
Column unknown.
-----

CREATE PROCEDURE GER_MARCA (
´:TIPO´ INTEGER,
´:ID_MARCA´ INTEGER,
´:MARCA´ VARCHAR(175))
RETURNS (
´:RESPOSTA´ VARCHAR(1))
AS
begin
if (:TIPO = 1 ) then <===

if (not exists (select * from Tab_Marca where :Marca = Marca)) then
insert into Tab_marca values (:Marca);
else
RESPOSTA = ´X´;
else
if (:Tipo = 2) then
if (not exists (select * from Tab_modelo where :ID_marca = ID_Marca)) then
delete from Tab_marca where:id_marca = ID_marca;
else
RESPOSTA = ´X´;
else
if (:Tipo = 3) then
update Tab_marca set Marca = :Marca where :ID_Marca = ID_Marca;
suspend;
end


Responder

Gostei + 0

16/08/2005

Ullrich

Bom descobri o problema anterior, acho que este é o ultimo erro.


O erro está na linha:

select :Resposta = ´X´

No SQL server funciona assim, como faço para incluir um valor na variavel :Resposta no InterBase


CREATE PROCEDURE Ger_Marca (
´:TIPO´ INTEGER,
´:ID_MARCA´ INTEGER,
´:MARCA´ VARCHAR(175))
RETURNS (
´:RESPOSTA´ VARCHAR(1))
AS
begin
if (:Tipo = 1 ) then

if (not exists (select * from Tab_Marca where :Marca = Marca)) then
insert into Tab_marca values (:Marca)
else
select :Resposta = ´X´
else
if (:Tipo = 2) then

if (not exists (select * from Tab_modelo where :ID_marca = ID_Marca))
delete from Tab_marca :ID_marca = ID_marca
else
select :Resposta = ´X´
else
if (:Tipo = 3) then

update Tab_marca set Marca = :Marca
where :ID_Marca = ID_Marca

suspend;
end


Responder

Gostei + 0

16/08/2005

Beppe

No SQL server funciona assim, como faço para incluir um valor na variavel :Resposta no InterBase

Tu esqueceu o que o afarias te escreveu? É assim somente:

Resposta = ´X´


Responder

Gostei + 0

16/08/2005

Gandalf.nho

Só uma coisa, porque vc usa : na declaração das variáveis?


Responder

Gostei + 0

16/08/2005

Ullrich

Uso ´:´ para diferenciar as variaveis da procedure das colunas da tabela, essa era a idéia, porem não tive boms resultados com ´:´ refis a procedure e em vez de ´:´ coloquei ´V_´ de Variavel, porem ocorreu novoes erros, veja:

CREATE PROCEDURE GER_MARCA (
V_TIPO INTEGER,
V_ID_MARCA INTEGER,
V_MARCA VARCHAR(175))
RETURNS (
V_RESPOSTA VARCHAR(1))
AS
begin
if (V_TIPO = 1 ) then
if (not exists (select * from Tab_Marca where V_MARCA = MARCA)) then
insert into Tab_marca values (V_MARCA);
else
V_RESPOSTA = ´X´;
else
if (V_TIPO = 2) then
if (not exists (select * from Tab_modelo where V_ID_MARCA = ID_MARCA)) then
delete from Tab_marca where V_ID_MARCA = ID_MARCA;
else
V_RESPOSTA = ´X´;
else
if (V_TIPO = 3) then
update Tab_marca set MARCA = V_MARCA where V_ID_MARCA = ID_MARCA;
suspend;
end

Novos erros:

Column does not belong to referenced table.
Dynamic SQL Error.
SQL error code = -206.
Column unknown.
V_MARCA.

Não entendi, o que ele quer dizer com ´Column unknown.´Coluna Desconhecida.

Alguem pode me ajudar, ficaria grato.


Responder

Gostei + 0

16/08/2005

Afarias

Nos procedimentos no IB/FB, todas as variáveis e parâmetros de entrada ou saída quando USADOS EM UM SQL (select, insert, update, delete) devem ser precedidos de dois-pontos ( : ).

Ex:

if (not exists (select * from Tab_modelo where ID_MARCA = :V_ID_MARCA)) then
delete from Tab_marca where ID_MARCA = :V_ID_MARCA;


T+


Responder

Gostei + 0

16/08/2005

Ullrich

Quando mudei o procedimento e acrecentei os ´:´ gerou o seguinte
Erro:
--------------------------------
Invalid token.
Dynamic SQL Error.
SQL error code = -104.
Token unknown - line 13, char 10.
:.
--------------------------------

REATE PROCEDURE GER_MARCA (
´:TIPO´ INTEGER,
´:ID_MARCA´ INTEGER,
´:MARCA´ VARCHAR(175))
RETURNS (
´:RESPOSTA´ VARCHAR(1))
AS
begin
if (:TIPO = 1 ) then
if (not exists (select * from Tab_Marca where :MARCA = MARCA)) then
insert into Tab_marca values (:MARCA);
else
:RESPOSTA = ´X´;
else
if (:TIPO = 2) then
if (not exists (select * from Tab_modelo where :ID_MARCA = ID_MARCA)) then
delete from Tab_marca where :ID_MARCA = ID_MARCA;
else
:RESPOSTA = ´X´;
else
if (:TIPO = 3) then
update Tab_marca set MARCA = :MARCA where :ID_MARCA = ID_MARCA;
suspend;
end


Responder

Gostei + 0

17/08/2005

Afarias

1) Vc não deve criar (declarar) as variáveis com ´:´ (dois-pontos)

2) Evite declarar variáveis, parâmentros, etc .. usando aspas

3) Vc só deve usar os ´:´ quando está EM UM COMANDO SQL!!!


ex::

CREATE PROCEDURE GER_MARCA ( 
  TIPO INTEGER, 
  ID_MARCA INTEGER, 
  MARCA VARCHAR(175) 
) RETURNS ( 
  RESPOSTA VARCHAR(1)
) AS 
begin 
  if (TIPO = 1) then 
    if (not exists (select * from Tab_Marca where MARCA = :MARCA)) then 
      insert into Tab_marca values (:MARCA); 
    else 
      RESPOSTA = ´X´; 
  else 
    if (TIPO = 2) then 
      if (not exists (select * from Tab_modelo 
                          where ID_MARCA = :ID_MARCA)) then 
        delete from Tab_marca where ID_MARCA = :ID_MARCA; 
      else 
        RESPOSTA = ´X´; 
    else 
      if (TIPO = 3) then 
        update Tab_marca set MARCA = :MARCA 
        where ID_MARCA = :ID_MARCA; 
  suspend; 
end



T+


Responder

Gostei + 0

18/08/2005

Ullrich

3) Vc só deve usar os ´:´ quando está EM UM COMANDO SQL!!!

Este procedimento é uma Stored Procedure que estou fazendo no IBexpert, e não um procedimento em Delphi, OK. Então todo procedimento é em SQL.

Retirei os ´:´ das declarações de variaveis, e o erro presisti. Se puder me ajudar facarei grato.


Responder

Gostei + 0

18/08/2005

Afarias

|Este procedimento é uma Stored Procedure que estou fazendo no
|IBexpert, e não um procedimento em Delphi,

sei disso...


|OK. Então todo procedimento é em SQL.

NÃO. O procedimento é cosntruído usando PSQL (Procedural SQL) que é uma extensão do SQL para procedimentos e triggers apenas...

...quando falo de comandos SQL estou me referindo a SELECT, INSERT, UPDATE e DELETE (comandos DML, já que DDL não pode ser usados em Stored Procedures no IB/FB)


|Retirei os ´:´ das declarações de variaveis, e o erro presisti. Se puder
|me ajudar facarei grato.

para ver o erro na sintaxe preciso ver o código q está tentando compilar (além do erro retornado).


T+


Responder

Gostei + 0

19/08/2005

Ullrich

Erro:
An error was found in the application program input parameters for the SQL statement.
Dynamic SQL Error.
SQL error code = -804.
Count of columns does not equal count of values.



REATE PROCEDURE GER_MARCA (
TIPO INTEGER,
ID_MARCA INTEGER,
MARCA VARCHAR(175))
RETURNS (
RESPOSTA VARCHAR(1))
AS
begin
if (:TIPO = 1 ) then
if (not exists (select * from Tab_Marca where :MARCA = MARCA)) then
insert into Tab_marca values (:MARCA);
else
RESPOSTA = ´X´;
else
if (:TIPO = 2) then
if (not exists (select * from Tab_modelo where :ID_MARCA = ID_MARCA)) then
delete from Tab_marca where :ID_MARCA = ID_MARCA;
else
RESPOSTA = ´X´;
else
if (:TIPO = 3) then
update Tab_marca set MARCA = :MARCA where :ID_MARCA = ID_MARCA;
suspend;
end


Responder

Gostei + 0

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

Aceitar