我有一个存储过程,可以在表中执行插入和更新。创建它的需要是在插入或更新记录之前尝试集中所有扫描功能。今天需要返回表的字段ID
的值,以便我的应用程序可以找到注册表并执行其他存储过程。
存储过程
SET TERM ^ ;
CREATE OR ALTER procedure sp_insupd (
iaction varchar(3),
iusuario varchar(20),
iip varchar(15),
imodulo varchar(30),
ifieldsvalues varchar(2000),
iwhere varchar(1000),
idesclogs varchar(200))
returns (
oid integer)
as
declare variable vdesc varchar(10000);
begin
if (iaction = 'ins') then
begin
vdesc = idesclogs;
/*** the error is on the line below ***/
execute statement 'insert into '||:imodulo||' '||:ifieldsvalues||' returning ID into '||:oid||';';
end else
if (iaction = 'upd') then
begin
execute statement 'select '||:idesclogs||' from '||:imodulo||' where '||:iwhere into :vdesc;
execute statement 'execute procedure SP_CREATE_AUDIT('''||:imodulo||''');';
execute statement 'update '||:imodulo||' set '||:ifieldsvalues||' where '||:iwhere||';';
end
insert into LOGS(USUARIO, IP, MODULO, TIPO, DESCRICAO) values (
:iusuario, :iip, :imodulo, (case :iaction when 'ins' then 1 when 'upd' then 2 end), :vdesc);
end^
SET TERM ; ^
由于语法错误,上述行中出现错误。该过程是正常编译的,也就是说,编译中不会发生错误,因为有问题的行是通过" execute语句"执行的。当不需要返回ID
字段的值时,该过程正常工作,如下所示:
...
execute statement 'insert into '||:imodulo||' '||:ifieldsvalues||';';
...
将ID
字段的值存储在OID
变量中的正确方法是什么?
答案 0 :(得分:2)
ifieldsvalues
中的REAL VALUE是什么?
你不能同时拥有


'插入'| |:imodulo ||” '||:ifieldsvalues
'update'||:imodulo ||'设置'||:ifieldsvalues
因为在 INSERT中指定列名和列值的方法
和 UPDATE
语句根本不同!!!你要么破坏update-stmt,要么破坏insert-stmt!



上述行中的错误是由于语法错误而发生的


这还不够。显示真实的错误文本,所有这些。
它包含您生成的实际命令,而且似乎您生成的方式非常错误。





插入或更新记录之前的所有扫描功能


将这些功能移出SQL服务器并移入应用程序服务器。 #xA;那么你就不必以“字符串拼接”方式进行插入/更新,这非常脆弱且“SQL注入”友好。你走进了地狱之路。





编译中没有出现错误


完全正确。这只适用于初学者。您正在删除应该帮助您进行应用程序开发的所有安全检查。


在现代Firebird版本上 EXECUTE STATEMENT
命令可以具有相同的<代码> INTO 子句作为PSQL SELECT
命令。
使用 http://translate.ru 阅读 http://www.firebirdsql.su/doku.php?id=execute_statement
&#xA;&#xA;或者只是看那里的SQL示例。但请注意,这些示例都使用 SELECT
动态命令,而不是 INSERT
。所以我不确定它会那样工作。
这适用于Firebird 2.5(但不适用于Firebird 2.1)PSQL块。
&#xA;& #xA; 执行语句'插入Z(有效载荷)值(2)将id'返回到:i;&#xA;
&#xA;&#xA; < p>从IBExpert / FlameRobin / iSQL交互式shell运行它添加那个明显的样板:&#xA;&#xA; 执行块返回(i整数)为&#xA;开始&#xA ;执行语句'插入Z(有效载荷)值(2)将id'返回到:i;&#xA;暂停;&#XA末端&#XA; 代码>
&#XA;