Tokene unknown 创建具有动态 table 名称的存储过程
Tokene unknown creating a stored procedure with dynamic table name
我尝试在插入 table 之前检查记录是否存在。
SET TERM ^ ;
CREATE PROCEDURE add_videorecord(tab_name varchar(31), col_name varchar(31),
col_value varchar(100))
RETURNS (status int)
AS
BEGIN
status=1;
if (not exists(
select * from :tab_name where :col_name = :col_value))
then
execute statement 'insert into "'||:tab_name||'" ("'||:col_name||'") values("'||:col_value||'")';
else
status=0;
END^
SET TERM ; ^
并得到 FlameRobin 错误:
Message: isc_dsql_prepare failed
SQL Message : -104
Invalid token
Engine Code : 335544569
Engine Message :
Dynamic SQL Error
SQL error code = -104
Token unknown - line 10, column 15
:
为什么是未知令牌?我尝试使用输入参数。
您不能像在 select 中那样直接参数化对象名称(如 table 名称、列名称等)。参数只能用于值。
如果你想参数化一个对象名称,你需要将它连接成一个查询字符串,就像你已经为你的插入语句所做的那样。您只需要注意 SQL 注入(例如,根据一组已知的已接受对象名称检查名称)。
举个例子(不检查有效的 table 和列名!):
CREATE PROCEDURE ADD_RECORD (
TAB_NAME VARCHAR(31),
COL_NAME VARCHAR(31),
COL_VALUE VARCHAR(100) )
RETURNS (
STATUS INTEGER )
AS
DECLARE temp INTEGER;
BEGIN
status=1;
execute statement
('select 1 from "' || tab_name || '" where "' || col_name || '" = ?') (:col_value)
into :temp;
if (temp is null)
then
execute statement
('insert into "'|| tab_name||'" ("' || col_name|| '") values(?)') (:col_value);
else
status=0;
END
使用单个(动态创建的)MERGE
statement,您也许可以进一步简化它。
我尝试在插入 table 之前检查记录是否存在。
SET TERM ^ ;
CREATE PROCEDURE add_videorecord(tab_name varchar(31), col_name varchar(31),
col_value varchar(100))
RETURNS (status int)
AS
BEGIN
status=1;
if (not exists(
select * from :tab_name where :col_name = :col_value))
then
execute statement 'insert into "'||:tab_name||'" ("'||:col_name||'") values("'||:col_value||'")';
else
status=0;
END^
SET TERM ; ^
并得到 FlameRobin 错误:
Message: isc_dsql_prepare failed
SQL Message : -104
Invalid token
Engine Code : 335544569
Engine Message :
Dynamic SQL Error
SQL error code = -104
Token unknown - line 10, column 15
:
为什么是未知令牌?我尝试使用输入参数。
您不能像在 select 中那样直接参数化对象名称(如 table 名称、列名称等)。参数只能用于值。
如果你想参数化一个对象名称,你需要将它连接成一个查询字符串,就像你已经为你的插入语句所做的那样。您只需要注意 SQL 注入(例如,根据一组已知的已接受对象名称检查名称)。
举个例子(不检查有效的 table 和列名!):
CREATE PROCEDURE ADD_RECORD (
TAB_NAME VARCHAR(31),
COL_NAME VARCHAR(31),
COL_VALUE VARCHAR(100) )
RETURNS (
STATUS INTEGER )
AS
DECLARE temp INTEGER;
BEGIN
status=1;
execute statement
('select 1 from "' || tab_name || '" where "' || col_name || '" = ?') (:col_value)
into :temp;
if (temp is null)
then
execute statement
('insert into "'|| tab_name||'" ("' || col_name|| '") values(?)') (:col_value);
else
status=0;
END
使用单个(动态创建的)MERGE
statement,您也许可以进一步简化它。