-1

您好 DB2 专家,我需要您的帮助来将下面的过程转换为更动态的东西。我们必须为每个表更新具有最大 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_KEY 是动态的,并且 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 表中插入最大值。

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;
4

1 回答 1

0

尝试以下操作,而不是SELECT MAX(...)出现错误的行:

PREPARE S1 FROM 'SET ? = (SELECT MAX(' || vrows.NAME || ') FROM ' || vrows.TBNAME || ')';
EXECUTE S1 INTO maxval;
于 2019-10-17T05:43:15.803 回答