在firebird中使用“from”里面的变量

时间:2017-10-02 14:43:25

标签: sql firebird

我尝试在“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 ; ^

1 个答案:

答案 0 :(得分:3)

您无法参数化对象名称。您需要动态构建查询(如果您不小心,可能会让您对SQL注入开放)。

具体而言,您需要使用:

...
BEGIN
    EXECUTE STATEMENT 'select count(*) from "' || T_NAME || '"'
        INTO :NUM_RECORDS;
    SUSPEND;
END

除了包含双引号的表名外,这应该是安全的。我没有在对象名称中用单引号显式检查行为,这在技术上是可行的。如果在实际生产代码中使用它,则可能需要采取额外步骤来防止这些形式的SQL注入。