O que está errado nesta SP?
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?
: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
Curtidas 0
Respostas
Afarias
15/08/2005
Tá faltando todos os ponto-e-vírgula, e use BEGIN END (e atenção em vários outros erros de sintaxe!)::
T+
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+
GOSTEI 0
Ullrich
15/08/2005
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
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
GOSTEI 0
Afarias
15/08/2005
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+
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+
GOSTEI 0
Ullrich
15/08/2005
Obrigado afarias, em SqlServer eu faço assim select variavel = ´valor´
porem não sabia em InterBase.
valeu mesmo...
porem não sabia em InterBase.
valeu mesmo...
GOSTEI 0
Ullrich
15/08/2005
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
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
GOSTEI 0
Ullrich
15/08/2005
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
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
GOSTEI 0
Beppe
15/08/2005
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´
GOSTEI 0
Gandalf.nho
15/08/2005
Só uma coisa, porque vc usa : na declaração das variáveis?
GOSTEI 0
Ullrich
15/08/2005
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.
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.
GOSTEI 0
Afarias
15/08/2005
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+
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+
GOSTEI 0
Ullrich
15/08/2005
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
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
GOSTEI 0
Afarias
15/08/2005
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::
T+
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+
GOSTEI 0
Ullrich
15/08/2005
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.
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.
GOSTEI 0
Afarias
15/08/2005
|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+
|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+
GOSTEI 0
Ullrich
15/08/2005
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
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
GOSTEI 0
Ullrich
15/08/2005
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
Este é o 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.
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
Este é o 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.
GOSTEI 0
Afarias
15/08/2005
|insert into Tab_marca values (:MARCA);
tab_marca tem apenas 1 campo?? vc tem q especificar o campo q está inserindo, ex:
insert into Tab_marca (campo_marca) values (:MARCA);
T+
tab_marca tem apenas 1 campo?? vc tem q especificar o campo q está inserindo, ex:
insert into Tab_marca (campo_marca) values (:MARCA);
T+
GOSTEI 0
Ullrich
15/08/2005
:D Até que emfim ! ! Compilou....
Muito obrigado a todos especialmente a afarias, que teve muita paciência em responder todas as mensagens, obrigadão . . .
Sei que não é muito, mas se precisar de alguma coisa é só mandar uma mensagem particular.... T+
Muito obrigado a todos especialmente a afarias, que teve muita paciência em responder todas as mensagens, obrigadão . . .
Sei que não é muito, mas se precisar de alguma coisa é só mandar uma mensagem particular.... T+
GOSTEI 0