【问题标题】:Using a parameter as a table name in a DB2 SQL cursor and adding two cursors在 DB2 SQL 游标中使用参数作为表名并添加两个游标
【发布时间】:2014-10-13 13:29:10
【问题描述】:

我正在尝试参数化存储过程并将参数用作表名。第二部分是添加到返回的数字并将它们分配给另一个变量:

CREATE or replace PROCEDURE TEST
(IN tab1 CHAR(20), IN tab2 CHAR(20), OUT MSG INTEGER)

RESULT SETS 1
LANGUAGE SQL

BEGIN

DECLARE C1 CURSOR WITH RETURN FOR
SELECT count(*)
FROM tab1;

DECLARE C2 CURSOR WITH RETURN FOR
SELECT count(*)
FROM tab2;

OPEN C1;
OPEN C2;

SET MSG= C1 + C2;
CALL DBMS_OUTPUT.PUT_LINE( msg );

END @

问题是,参数没有设置为表名,导致tab1不是已知表的错误。 我不知道添加是否有效,还没有走到那一步,也许你已经看到了一个错误。

我希望你能帮助我,因为这让我发疯。

提前致谢。

流浪汉

【问题讨论】:

  • 一个 CURSOR 是在一个特定的表上定义的。为了让 SQL 在 CREATE PROCEDURE 运行时创建游标定义,它需要知道使用了哪个表。创建过程后,不能将游标的表名发送到过程中,因为 SQL 不知道如何定义游标,因此无法创建过程。

标签: sql stored-procedures parameters cursor db2


【解决方案1】:

表名是不能使用参数的地方。

您需要使用动态 SQL 以及 PREPARE/EXECUTE 或 EXECUTE IMMEDIATE。请注意,这为 SQL 注入攻击打开了大门。

此外,您还混淆了游标和主机变量。您不能一起添加游标,您可以从它们中获取或将它们作为结果集返回。

改为查看 SELECT INTO。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2020-06-19
    • 2016-01-05
    • 1970-01-01
    • 1970-01-01
    • 2022-11-28
    • 1970-01-01
    • 1970-01-01
    • 2013-09-20
    相关资源
    最近更新 更多