我尝试在“from”SELECT COUNT(*) FROM :T_NAME
中使用变量,但是不起作用。我怎样才能解决这个问题?这是我的代码:
SET TERM ^ ;
CREATE OR ALTER PROCEDURE Myfunction
RETURNS(
T_NAME varchar(100),
NUM_RECORDS integer
)
AS
BEGIN
FOR SELECT RDB$RELATION_NAME FROM RDB$RELATIONS
WHERE (RDB$SYSTEM_FLAG <> 1 OR RDB$SYSTEM_FLAG IS NULL) AND RDB$VIEW_BLR IS NULL
ORDER BY RDB$RELATION_NAME
INTO :T_NAME
DO
BEGIN
SELECT COUNT(*) FROM :T_NAME
INTO :NUM_RECORDS;
SUSPEND;
END
END^
SET TERM ; ^
答案 0 :(得分:3)
您无法参数化对象名称。您需要动态构建查询(如果您不小心,可能会让您对SQL注入开放)。
具体而言,您需要使用:
...
BEGIN
EXECUTE STATEMENT 'select count(*) from "' || T_NAME || '"'
INTO :NUM_RECORDS;
SUSPEND;
END
除了包含双引号的表名外,这应该是安全的。我没有在对象名称中用单引号显式检查行为,这在技术上是可行的。如果在实际生产代码中使用它,则可能需要采取额外步骤来防止这些形式的SQL注入。