当X是一个变量时,DB2是否创建表X?

当X是一个变量时,DB2是否创建表X?,db2,db2-luw,Db2,Db2 Luw,在Oracle中,我们执行以下操作: def TNAME=&1 create table &TNAME (foo varchar(10)); 如何对DB2执行等效操作?制约因素包括: 1. The create table statement is generated when TNAME is unknown 2. The create table statement is in a file which cannot be modified 3. Cannot create

在Oracle中,我们执行以下操作:

def TNAME=&1
create table &TNAME (foo varchar(10));
如何对DB2执行等效操作?制约因素包括:

1. The create table statement is generated when TNAME is unknown
2. The create table statement is in a file which cannot be modified
3. Cannot create a temporary file with TNAME substituted by awk
4. Essentially we want to pass in the table name at run time as an argument

可能吗?

我创建了一个包含以下内容的文件
abc

create table TNAME (foo varchar(10))
然后我在Unix命令行上执行了以下操作:

sed s/TNAME/xyz/g abc | db2
它根据我的需要在DB2中创建了一个名为
xyz
的表。谢谢

该语句几乎可以用于任何被BEGIN和END包围的SQL块,例如存储过程或匿名复合语句

CREATE PROCEDURE create_table_from_file( IN fileDir VARCHAR( 1024 ), 
                                         IN fileName VARCHAR( 128 ),
                                         IN tabSchema VARCHAR( 128 ),
                                         IN tabName VARCHAR( 128 )
                                        )
BEGIN
DECLARE fh UTL_FILE.FILE_TYPE;
DECLARE sqlStmt VARCHAR( 32672 );
DECLARE currentLine VARCHAR( 32672 );
DECLARE SQLCODE INTEGER DEFAULT 0;
DECLARE SQLSTATE CHAR(5) DEFAULT '00000';
DECLARE SQLSTATE1 CHAR(5) DEFAULT '00000';
DECLARE CONTINUE HANDLER FOR SQLSTATE 'ORANF' SET SQLSTATE1 = SQLSTATE;

SET sqlStmt = 'CREATE TABLE ' 
    || CASE WHEN ( NULLIF( tabSchema, '' ) IS NOT NULL ) 
       THEN RTRIM( tabSchema ) || '.'
       ELSE '' END || tabName;
CALL UTL_DIR.CREATE_OR_REPLACE_DIRECTORY( 'createTablePath', fileDir );
SET fh = UTL_FILE.FOPEN( 'createTablePath', fileName, 'r' );
loop1: LOOP
    CALL UTL_FILE.GET_LINE( fh, currentLine );
    IF SQLSTATE1 = 'ORANF' THEN -- NO DATA FOUND
        LEAVE loop1;
    END IF;
    SET sqlStmt = sqlStmt || ' ' || currentLine ;
END LOOP;
EXECUTE IMMEDIATE sqlStmt;
END
@

这是否解决了4个约束条件?特别是关于将文件名作为变量传入的部分?我能找到的唯一方法是下面我自己的答案,我不确定execute immediate是解决方案还是更好的解决方案。如果这确实是一个解决办法,我很乐意接受你的回答。谢谢:)我编辑了我的答案,以展示存储过程如何将表名和DDL文件作为参数处理。嗯。。。这很复杂。这个答案比我的答案更为积极,它不依赖于“sed”或Unix环境。它依赖于DB2文件i/o,而我的则将文件机制置于DB2的范围之外。尽管如此,我还是喜欢我自己的答案,但由于存在利益冲突,我接受你的答案,因为它肯定是有效的:)本说明主要是让读者在决定实际操作之前(取决于他们是否有Unix环境)将其与我下面的答案进行比较。谢谢。只要DDL是在Linux/UNIX操作系统上从适当的DB2客户机解释器运行的,sed方法就非常优雅。我发布的示例演示了DB29.7forLinux、UNIX和Windows中引入的文件读取功能?许多DB2安装都在z/OS上运行,因为它们都是IBM首选的平台。如果这适用于z/OS,那将是理想的方式!再次感谢!