Criar Procedure com parâmetros de retorno dinamicamente
Olá, estou tentando criar dinamicamente (via código) a procedure abaixo, mas retorna o erro: token unknow - line 19, column 7 ?, ou seja, acusa erro daquilo que vem logo depois dos dois pontos.
Fiz a mesma execução via ibExpert e funcionou, mas preciso criar via código.
O que estou fazendo errado?
D2010 - Firebird 2.1.
1: VInstrucao := CREATE OR ALTER procedure CamposNotNullComValorNull returns ( +
2: tabela varchar(100), +
3: campo varchar(100), +
4: total INTEGER) +
5: as +
6: declare variable SQL varchar(1000); +
7: declare variable QTDENULL integer; +
8: begin +
9: for select rdb$field_name, +
10: rdb$relation_name +
11: from rdb$relation_fields +
12: where rdb$relation_name in +
13: ( +
14: select rdb$relation_name +
15: from rdb$relations +
16: where rdb$system_flag = 0 +
17: ) +
18: and rdb$null_flag = 1 +
19: into :campo, :tabela +
20: do begin +
21: sql = select count(*) from || :tabela || where || :campo || is +
22: null; +
23: execute statement :sql into :qtdenull; +
24: total = qtdenull; +
25: if (qtdenull > 0) then suspend; +
26: end +
27: end;
SQLQuery1.SQL.Clear; SQLQuery1.Close;
SQLQuery1.SQL.add(VInstrucao);
SQLQuery1.ExecSQL;
Obrigado.
Valdir
Fiz a mesma execução via ibExpert e funcionou, mas preciso criar via código.
O que estou fazendo errado?
D2010 - Firebird 2.1.
1: VInstrucao := CREATE OR ALTER procedure CamposNotNullComValorNull returns ( +
2: tabela varchar(100), +
3: campo varchar(100), +
4: total INTEGER) +
5: as +
6: declare variable SQL varchar(1000); +
7: declare variable QTDENULL integer; +
8: begin +
9: for select rdb$field_name, +
10: rdb$relation_name +
11: from rdb$relation_fields +
12: where rdb$relation_name in +
13: ( +
14: select rdb$relation_name +
15: from rdb$relations +
16: where rdb$system_flag = 0 +
17: ) +
18: and rdb$null_flag = 1 +
19: into :campo, :tabela +
20: do begin +
21: sql = select count(*) from || :tabela || where || :campo || is +
22: null; +
23: execute statement :sql into :qtdenull; +
24: total = qtdenull; +
25: if (qtdenull > 0) then suspend; +
26: end +
27: end;
SQLQuery1.SQL.Clear; SQLQuery1.Close;
SQLQuery1.SQL.add(VInstrucao);
SQLQuery1.ExecSQL;
Obrigado.
Valdir
Valdir Dill
Curtidas 0
Respostas
Gustavo Bretas
16/12/2011
Valdir, aqui no Help do Delphi diz que se vc setar a propriedade ParamsCheck para False, ele deixa de interpretar o : como precursor de parâmetros permitindo assim executar instruções DDL no banco.
GOSTEI 0
Valdir Dill
16/12/2011
Valdir, aqui no Help do Delphi diz que se vc setar a propriedade ParamsCheck para False, ele deixa de interpretar o : como precursor de parâmetros permitindo assim executar instruções DDL no banco.
Perfeito Bretas. Funcionou belezinha!
Vivendo e aprendendo, rs...
Obrigadão.
GOSTEI 0
Gustavo Bretas
16/12/2011
Muito bom, agora não esquece de concluir o post! Abraço!
GOSTEI 0