Stored procedures 将过程从Oracle转换为DB2,尝试在运行时更新表时出错

Stored procedures 将过程从Oracle转换为DB2,尝试在运行时更新表时出错,stored-procedures,plsql,db2,sql-pl,Stored Procedures,Plsql,Db2,Sql Pl,您好,DB2专家,我需要您的帮助,将下面的过程转换为更动态的过程。 我们必须为每个表更新多个具有max of id列的序列 CREATE PROCEDURE mySchema.UPDATE_SEQUENCE ( ) DYNAMIC RESULT SETS 1 MODIFIES SQL DATA ---------------------------------------------------------------------- -- SQL Stored Procedure -----

您好,DB2专家,我需要您的帮助,将下面的过程转换为更动态的过程。 我们必须为每个表更新多个具有max of id列的序列

CREATE PROCEDURE mySchema.UPDATE_SEQUENCE ( )
 DYNAMIC RESULT SETS 1
 MODIFIES SQL DATA
----------------------------------------------------------------------
-- SQL Stored Procedure
----------------------------------------------------------------------
P1: BEGIN
 DECLARE counter BIGINT;
 DECLARE q VARCHAR(500);
set (counter) = (select max(N_PRI_KEY) from mySchema.myTable);
set q = 'alter sequence mySchema.mySequence RESTART WITH ' || counter;
 EXECUTE IMMEDIATE q;

END P1
@
这是我从上述代码中编写的: 这里我希望N_PRI_键是动态的,mySchema.myTable在运行时使用表中的值进行更新

CREATE OR REPLACE PROCEDURE getText ()
LANGUAGE SQL
DYNAMIC RESULT SETS 1
  BEGIN
  DECLARE maxval  INTEGER DEFAULT 0;

  CALL DBMS_OUTPUT.PUT( 'a' );

  FOR vrows AS 
      SELECT NAME, SEQUENCENAME, TBNAME FROM MAXSEQUENCE WHERE SEQUENCENAME='ASSETSEQ'
    DO 

      SELECT MAX(vrows.NAME) INTO maxval FROM vrow.TBNAME; -- This is where I am getting error.

    EXECUTE IMMEDIATE 'ALTER SEQUENCE '||vrows.SEQUENCENAME||' RESTART WITH '|| maxval;

  END FOR;      
END@
这是我在尝试创建过程时遇到的错误

DB21034E  The command was processed as an SQL statement because it was not a
valid Command Line Processor command.  During SQL processing it returned:
SQL0204N  "VROW.TBNAME" is an undefined name.  LINE NUMBER=18.  SQLSTATE=42704
当我运行这一行时,它工作并在TEMPOUTPUT表中插入max值

execute immediate  'INSERT INTO TEMPOUTPUT VALUES (select max('||vrow.NAME||') from '||vrow.TBNAME||')';
我试过这样做,但没有成功

execute immediate  'ALTER SEQUENCE '||SEQUENCENAME||' RESTART WITH select max('||vrow.NAME||') from '||vrow.TBNAME;
仅供参考-这是一个用Oralce编写的过程,它正在做类似的事情


declare
    maxval int;
    seqval int;
  begin
  for i in ( select ucc.column_name, s.sequence_name, uc.table_name
             from   user_cons_columns ucc,
                    user_constraints uc,
                    user_sequences s
             where  uc.constraint_name = ucc.constraint_name
             and    uc.constraint_type = 'P'
             and    ucc.position = 1
             and    s.sequence_name = 'SEQ_'||uc.table_name
           )
  loop
    execute immediate  'select max('||i.column_name||') from '||i.table_name into maxval;
    execute immediate 'select '||i.sequence_name||'.nextval from dual' into seqval;

    dbms_output.put_line(maxval||','||seqval);

     if maxval > seqval then
        execute immediate  'alter sequence '||i.sequence_name||' increment by '|| ( maxval - seqval );
        execute immediate 'select '||i.sequence_name||'.nextval from dual' into seqval;
        execute immediate  'alter sequence '||i.sequence_name||' increment by 1';
        execute immediate 'select '||i.sequence_name||'.nextval from dual' into seqval;
        dbms_output.put_line(maxval||','||seqval);
     end if;
  end loop;
  end;

请尝试以下操作,而不是使用出现错误的
选择MAX(…)
行:

PREPARE S1 FROM 'SET ? = (SELECT MAX(' || vrows.NAME || ') FROM ' || vrows.TBNAME || ')';
EXECUTE S1 INTO maxval;