动态地将表名传递给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。