2013-06-13 15 views
0

我想用从另一个游标派生的变量替换表名,但不管我尝试使用什么逻辑我都无法获取它对,我看到几个Oracle和SQL Server的例子,但是我没有把这些代码解释成DB2 SQL。请帮忙。如何用匿名块中的DB2游标中的变量替换tablename

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

显然,你需要使用动态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 
      ... 

的代码没有进行测试,但我希望你的想法。

+0

是的,谢谢它为我工作。 –