当X是一个变量时,DB2是否创建表X?
在Oracle中,我们执行以下操作:当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
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,那将是理想的方式!再次感谢!