如何从动态生成的"插入"中返回值命令?

时间:2017-11-15 16:10:08

标签: firebird

我有一个存储过程,可以在表中执行插入和更新。创建它的需要是在插入或更新记录之前尝试集中所有扫描功能。今天需要返回表的字段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变量中的正确方法是什么?

1 个答案:

答案 0 :(得分:2)

ifieldsvalues 中的REAL VALUE是什么?





你不能同时拥有




    

  • '插入'| |:imodulo ||” '||:ifieldsvalues
  • 

  • 'update'||:imodulo ||'设置'||:ifieldsvalues
  • 





因为在 INSERT中指定列名和列值的方法 UPDATE 语句根本不同!!!你要么破坏update-stmt,要么破坏insert-stmt!







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







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




&#xA ;




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







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







编译中没有出现错误







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



 






在现代Firebird版本上 EXECUTE STATEMENT 命令可以具有相同的<代码> INTO 子句作为PSQL SELECT 命令。

&#xA;&#xA;

https://www.firebirdsql.org/file/documentation/reference_manuals/fblangref25-en/html/fblangref25-psql-coding.html#fblangref25-psql-execstmt

&#xA;&#xA;

使用 http://translate.ru 阅读 http://www.firebirdsql.su/doku.php?id=execute_statement

&#xA;&#xA;

或者只是看那里的SQL示例。但请注意,这些示例都使用 SELECT 动态命令,而不是 INSERT 。所以我不确定它会那样工作。

&#xA;&#xA;

这适用于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;