0

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

可能?

4

2 に答える 2

1

EXECUTE IMMEDIATEステートメントは、ストアド プロシージャや無名複合ステートメントなど、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
@
于 2012-01-08T06:24:53.547 に答える
0

abc以下を含むファイルを作成しました。

create table TNAME (foo varchar(10))

次に、Unix コマンドラインで次のようにしました。

sed s/TNAME/xyz/g abc | db2

xyz必要に応じてDB2で呼び出されるテーブルを作成しました。ありがとう。

于 2012-01-02T00:00:27.193 に答える