【问题标题】:How to replace tablename with a variable in a DB2 cursor in an anonymous block如何用匿名块中 DB2 游标中的变量替换表名
【发布时间】:2014-12-20 23:12:39
【问题描述】:

我想用从另一个游标派生的变量替换表名,但是无论我尝试使用什么逻辑,我都无法正确使用,我看到了几个 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;

结束

【问题讨论】:

    标签: db2 db2-luw


    【解决方案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
               ...
    

    代码未经测试,但我希望你明白。

    【讨论】:

      猜你喜欢
      • 2012-03-15
      • 1970-01-01
      • 2016-07-19
      • 2022-01-04
      • 2014-05-14
      • 1970-01-01
      • 1970-01-01
      • 2021-08-17
      • 1970-01-01
      相关资源
      最近更新 更多