动态地将表名传递给db2查询

动态地将表名传递给db2查询,db2,Db2,我需要从表中进行计数,表的名称是动态构建并存储值 尝试了两种方法,但均未成功: SET COUNT = (SELECT COUNT(*) FROM BUILD_FUNCTION_NAME(a,b)) SET NAME = BUILD_FUNCTION_NAME(a,b) SET COUNT = ( SELECT COUNT(*) FROM NAME) 如果是DB2 for LUW,请尝试以下方法: --#SET TERMINATOR @ CREATE OR REPLACE FUNCTI

我需要从表中进行计数,表的名称是动态构建并存储值

尝试了两种方法,但均未成功:

SET COUNT = (SELECT COUNT(*) FROM BUILD_FUNCTION_NAME(a,b))


SET NAME  = BUILD_FUNCTION_NAME(a,b)
SET COUNT = ( SELECT COUNT(*) FROM NAME)

如果是DB2 for LUW,请尝试以下方法:

--#SET TERMINATOR @

CREATE OR REPLACE FUNCTION GET_COUNT(P_TABNAME VARCHAR(256))
RETURNS BIGINT
BEGIN
  DECLARE V_RC BIGINT;
  PREPARE S1 FROM 'SET ? = (SELECT COUNT(1) FROM '||P_TABNAME||')';
  EXECUTE S1 INTO V_RC;
  RETURN V_RC;
END@

VALUES GET_COUNT('SYSCAT.TABLES')@
VALUES GET_COUNT('SYSCAT.COLUMNS')@
VALUES GET_COUNT('(SELECT 1 FROM SYSCAT.TABLES WHERE TABSCHEMA LIKE ''SYS%'')')@

您甚至可以将任意SELECT语句作为参数传递到此类函数中。

您需要使用动态SQL,即:在运行时生成一个包含SQL语句的变量,然后对该语句使用PREPARE+EXECUTE,或者更方便的EXECUTE\u IMMEDIATE。文档中有很多例子。我在文档中看到,PREPARE+EXECUTE和EXECUTE\u IMMEDIATE都只用于非SELECT语句,而EXECUTE IMMEDIATE则用于非SELECT语句。先看Prepare,然后看execute。