在db2中使用动态表名

2024-02-29

目前,在我的项目开发中,需要根据某些条件生成记录计数,其中表名存储在单独的表中。例如,xx表存储表名,列名是tableInfo。

我以这样的方式编写了存储过程

DECLARE FGCURSOR CURSOR FOR SELECT tableInfo FROM xx WHERE col1='PO';

OPEN FGCURSOR;

FETCH FROM FGCURSOR INTO FILEGROUPMEM;

WHILE SQLCODE <> 100
DO

SET COUNTVal =   'SELECT COUNT(*)  FROM  ' ||  FILEGROUPMEM || '  WHERE ICLS=  '  || CLASS  || '  AND  IVEN=  ' || VENDOR  || ' AND ISTY=  ' || STYLE || '  AND ICLR= ' || COLOR || ' AND ISIZ=  ' || SIZE   ; 


IF(COUNTVal  >= 1) THEN 
RETURN 1;
END IF;

FETCH FROM FGCURSOR INTO FILEGROUPMEM;

END WHILE;

CLOSE FGCURSOR;

执行过程时出现异常

消息:[SQL0420] CAST 参数中的字符无效。原因 。 。 。 。 。 :CAST 函数的参数中的字符不是 正确的。恢复 。 。 。 :将结果数据类型更改为 识别 CAST 参数中的字符,或更改参数 包含结果数据类型值的有效表示。 再次尝试该请求。


这行不正确:

SET COUNTVal =   'SELECT COUNT(*)  FROM  ' ||  FILEGROUPMEM || '  WHERE ICLS=  '  || CLASS  || '  AND  IVEN=  ' || VENDOR  || ' AND ISTY=  ' || STYLE || '  AND ICLR= ' || COLOR || ' AND ISIZ=  ' || SIZE   ; 

要按照您尝试的方式使用它,您必须使用静态 SQL 语句,如下所示

exec sql SELECT COUNT(*) INTO :COUNTVal  
  FROM  MYTBL 
 WHERE ICLS=  :CLASS  AND  IVEN=  :VENDOR  AND ISTY=  :STYLE 
       AND ICLR= :COLOR  AND ISIZ=  :SIZE;

然而,虽然静态语句可以使用变量,但静态语句中的表名FROM子句不能是变量。

因此,您必须准备并使用动态语句。很遗憾,SELECT INTO不能在动态语句中使用。VALUES INTO可以动态使用。

set wSqlStmt = 'VALUES ( SELECT COUNT(*)  FROM  ' ||  FILEGROUPMEM 
                || '  WHERE ICLS=  '  || CLASS  || '  AND  IVEN=  ' 
                || VENDOR  || ' AND ISTY=  ' || STYLE || '  AND ICLR= ' 
                || COLOR || ' AND ISIZ=  ' || SIZE ||') INTO ?';

exec sql PREPARE S1 FROM :wSqlStmt;

exec sql EXECUTE S1 USING COUNTVal;

WARNING上面的代码可能会受到 SQL 注入攻击。为了防止 SQL 注入,动态 SQL 应使用参数标记,而不是将输入直接连接到语句。虽然您不能对表名称使用参数标记,但您可以对其余变量使用参数标记,如下所示:

set wSqlStmt = 'VALUES ( SELECT COUNT(*)  FROM  ' ||  FILEGROUPMEM 
                || '  WHERE ICLS=  ?  AND  IVEN=  ? ' 
                || '  AND ISTY= ? AND ICLR= ?' 
                || '  AND ISIZ= ?) INTO ?';

exec SQL PREPARE S1 FROM :wSqlStmt;

exec SQL EXECUTE S1 USING :CLASS, :VENDOR, :STYLE, :COLOR, :SIZE, :COUNTVal;
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

在db2中使用动态表名 的相关文章

  • 如何将存储过程结果映射到自定义类?

    我在用entity framework 5我已经添加了两个存储过程到我的 edmx model 第一个存储过程返回一个字符串 如果我在 Visual Studio 中打开模型浏览器 我可以更改Returns a Collection Of节
  • 仅具有存储过程的实体框架

    我对在我们的场景中仅使用实体框架与存储过程的合理性有疑问 我们计划拥有一个 N 层架构 包括 UI BusinessLayer BLL DataAccessLayer DAL 和 BusinessObjectDefinitions BOD
  • Dapper 或 MySql 未找到包含句号“.”的存储过程。

    我有一个简单的 C 控制台 它使用 Dapper ORM 调用本地 MySql 数据库 以执行名为的存储过程users UserCreate 但是 当运行查询时 我收到一个异常 在数据库 用户 中找不到过程或函数 UserCreate Bu
  • 我可以使用 Order by 对存储过程结果进行排序吗?

    简单来说 我有这样的SQL语句 EXEC xp cmdshell tasklist 我们可以使用以下命令对结果进行排序或过滤吗order by or where Thanks 我检查了 jamietre 链接 这是完整的答案 Create
  • 如何避免连接两个表时重复

    Student Table SID Name 1 A 2 B 3 C Marks Table id mark subject 1 50 physics 2 40 biology 1 50 chemistry 3 30 mathematics
  • 无法将 CLOB 数据存储到 DB2 中的 CLOB 定义的列中

    我猜这是一个重复的问题 但尚未找到合适的解决方案 基本上 我试图通过以下方式将大一点的 XML 即 32000 个字符 插入到 CLOB 列中 DB2程序 插入失败并出现以下错误 看起来 DB2 正在将输入视为 String 而不是 CLO
  • 将数据表传递到存储过程。有没有更好的办法?

    数据表可以以某种方式传递到 SQL Server 2005 或 2008 中吗 我知道标准方法似乎是将 XML 传递给 SP 并且可以通过某种方式轻松地将数据表转换为 XML 来实现这一点 将 NET 对象传递到 SP 怎么样 那可能吗 我
  • 如何从使用 exec() 的存储过程创建复杂类型?

    我想通过动态构造并执行的查询创建一个复杂类型 以便在实体管理器中使用exec 是否可以 既然我正在写一个过滤器 如果不可能的话你会做什么 另外 我正在使用 linq 进行评估 但过滤器需要许多表及其寄存器 因此效率是一个问题 谢谢 是的 您
  • 更新或插入 SQL Server 时忽略错误行

    我的项目必须处理巨大的数据库 在最坏的情况下 它可能是超过8000万行 现在 我有 2 张桌子T1 and T2 我必须从表中复制数据T1到餐桌T2 如果表中的一行T1表中已存在T2 相同主键 然后更新该行其他列的数据T1 to T2 否则
  • 为表多次指定了 xxx 列

    我正在尝试将 db2 简单查询调整为 SQL SERVER 该查询在 db2 上运行良好 select from pb console users u join select from pb console users user role
  • 在 WHERE 子句中使用可选参数

    我有一个SP ALTER PROCEDURE dbo sp Compare lst varchar 100 frst varchar 100 NULL passportNo varchar 50 NULL AS SELECT FROM db
  • MSSQL:如何使用代码编写存储过程创建脚本?

    我正在尝试使用一个数据库中存在但另一个数据库中不存在的 information schema routines 查询存储过程定义列表 SELECT t1 Routine Definition FROM server1 MyDatabase
  • 版本控制存储过程/PLSQL?

    有没有一种有效的方法来对用 PL SQL 编写的存储过程进行版本控制 我只提到 PL SQL 因为可能存在特定的工具 任何针对存储过程版本控制的答案都是理想的 在我目前的工作中 团队现在使用以下方法对PL SQL进行版本控制 编译PL SQ
  • 使用 t-sql 检索已过滤的存储过程列表

    我正在尝试获取 t sql 中的存储过程列表 我正在使用该行 exec sys sp stored procedures 我想过滤回结果 所以我只获取用户创建的存储过程 我想过滤掉 sp dt fn xp 以及其他所有我不感兴趣的系统存储过
  • SQL Server 'FETCH FIRST 1 ROWS ONLY' 无效使用

    我正在尝试将 Db2 查询转换为 SQL Server 我遇到了一个我不熟悉的构造 仅 FETCH FIRST 1 ROWS 这是在 db2 上运行的查询 select from products series where state xx
  • 如何返回调用不同数据库中的存储过程的远程数据库名称?

    我在一个 SQL Server 2008 R2 上有许多不同的数据库 为了便于论证 我们将它们称为 DB A DB B 和 DB C 我被要求开发一个将存在于 DB A 上的存储过程 该存储过程将用于删除和创建索引 并在 DB A 的表中存
  • 我们可以在 Azure 上的 T-SQL 过程中创建数据库范围的凭据吗

    我们可以在 Azure SQL 上的 T SQL 过程中为共享访问签名创建数据库范围的凭据吗 我们正在尝试从存储在 Azure blob 上的 csv 文件批量插入数据 以下是步骤 使用 JAVA 创建 SAS 凭证 Java将调用存储过程
  • 如何从 Windows 命令提示符调用 AS400 程序?

    I am trying to call a program using command prompt using command QUOTE RCMD CALL PGM LIB MyPGM I am getting this error 如
  • 如何调试 MySQL 存储过程?

    我当前的调试存储过程的过程非常简单 我创建一个名为 debug 的表 在存储过程运行时从其中插入变量值 这允许我查看脚本中给定点的任何变量的值 但是有没有更好的方法来调试 MySQL 存储过程 下列debug msg可以调用过程来简单地将调
  • Oracle 中的函数与过程

    Oracle 中函数和过程的主要区别是什么 如果我可以用函数完成所有事情 为什么我必须使用过程 如果我无法在sql语句中调用过程 好吧 我会编写一个函数来完成相同的工作 过程不返回值 好的 在任何 dml 操作后我将仅返回 sql rowc

随机推荐