如何使用匿名块中的DB2游标中的变量替换tablename

时间:2013-06-13 11:05:49

标签: db2 db2-luw

我想用从另一个游标派生的变量替换表名,但无论我尝试使用什么逻辑,我都无法正确使用它,我看到了几个Oracle和SQL Server的例子但是我没能将该代码解释为DB2 SQL。请帮忙。

Declare
    v_user VarCHAR(100);
    v_schema VARCHAR(1000);
    V_Studio_svr VARCHAR(1000);
    v_db2_schema VARCHAR(1000);
    v_oracle_string varchar(5000) ;
    v_db2_string varchar(5000) := '(' ;
    v_sys_columns varchar(2000);
    v_sys_values  varchar(2000);
    V_UID iNTEGER := 41;



begin
-- Main Table to Get Table Name From 
    FOR v In ( Select app_id,Upper(alias) ALIAS 
               From FREEDOM.FORMS where app_id = '5e988af8-ef0f-48c7-9794-9bc4f1134c80' ) Loop
      v_schema := 'S__'||V.app_ID||'_1';
      v_schema := replace(v_schema,'-','_');
      v_studio_svr := 'PTU'||SUBSTR(v.alias,2,LENGTH(v.alias));
      v_db2_schema := 'TF'||SUBSTR(v.alias,2,LENGTH(v.alias));
    -- This is where I want to use Table Name as Variable Coming From Cursor V
      For P in 
        (Select * from studio_svr||'.'||v_studio_svr) loop  
     -- Table to get Data Type Mappings 
         For i in 
            (Select * From fREEDOM.DB2_DT_MAPPING
             Where Table_Name = v.alias )  Loop

                   IF I.DB2_DATATYPE LIKE 'DECIMAL%' THEN
                    v_ORACLE_STRING := Nvl(v_ORACLE_STRING,'')||'CAST('||'INTEGER('||I.STUDIO_SVR_COLUMN||') AS DECIMAL(22,6)),';
               ELSE
                 v_ORACLE_STRING := Nvl(v_ORACLE_STRING,'')||I.STUDIO_SVR_COLUMN||',';
               END IF;
                     v_DB2_STRING := v_DB2_STRING||I.DB2_COLUMN||',';

         End Loop;  

         v_DB2_STRING := SUBSTR(v_DB2_STRING,1,LENGTH(v_DB2_STRING)-1)||')';

  execute immediate 'Insert Into ' || v_schema || '.' || v_db2_schema || '  '|| v_db2_string ||' SELECT '|| v_oracle_string ||' FROM Studio_svr.' || v_studio_svr || 'where S__recordid ='||p.s__recordid ;

   v_db2_string := '(';
   v_oracle_string := '';
   v_uid := v_uid + 1;
   commit;
   End loop;
  END lOOP;

END

1 个答案:

答案 0 :(得分:1)

显然,您需要为该游标使用动态SQL,如下所示:

  Declare
      v_user VarCHAR(100);
      ...
      V_UID iNTEGER := 41;

    --->
      v_cursor_studio SYS_REFCURSOR;

  begin
  -- Main Table to Get Table Name From 
      FOR v In ( Select app_id,Upper(alias) ALIAS 
                 From FREEDOM.FORMS where app_id = '5e988af8-ef0f-48c7-9794-9bc4f1134c80' ) Loop
        v_schema := 'S__'||V.app_ID||'_1';
        v_schema := replace(v_schema,'-','_');
        v_studio_svr := 'PTU'||SUBSTR(v.alias,2,LENGTH(v.alias));
        v_db2_schema := 'TF'||SUBSTR(v.alias,2,LENGTH(v.alias));
      -- This is where I want to use Table Name as Variable Coming From Cursor V

      --->
        OPEN v_cursor_studio for 'Select * from ' || studio_svr||'.'||v_studio_svr;
        For P in v_cursor_studio
           ...

代码未经过测试,但我希望你明白这一点。