1

一部のテーブルからMAXを選択する手順がありますが、何らかの理由でこれらのテーブルを見つけることができません。誰か助けてもらえますか?

declare
varible1 varchar2 (255);
temp varchar2 (255);
last_val number(9,0);
 cursor c1 is Select distinct table_name from user_tab_cols order by table_name;
begin
FOR asd in c1
LOOP
temp := asd.table_name;
varible1  := '"'||temp||'"';
select max("id") into last_val from varible1 ;
END LOOP;
end;

たとえば、最初のテーブル名はacceptance_formであり、selectには「acceptance_form」を使用する必要があります。

編集後のコード:

declare
varible1 varchar2 (255);
temp varchar2 (255);
last_val number(9,0);
 cursor c1 is Select distinct table_name from user_tab_cols where column_name = 'id';
begin
FOR asd in c1
LOOP
temp := asd.table_name;
execute immediate 'select NVL(max('||'id'||'),0) from "'||varible1||'"' into last_val;
END LOOP;
end;

大文字と小文字を区別するOracleExpress10gテーブルと行は次のように作成されました。

CREATE TABLE "ADMINMME"."acceptance_form"
(
    "group_id" NUMBER(9, 0), 
    "id" NUMBER(4, 0) DEFAULT '0' NOT NULL , 
    "is_deleted" NUMBER(4, 0), 
    "name" NVARCHAR2(30) NOT NULL 
);

例外シーケンスを処理する方法を教えてもらえますか?これには存在しません。例外が間違ったブロックにあったことを気にしないでください:)

declare
temp varchar2 (255);
last_val number(9,0);
 cursor c1 is Select distinct table_name from user_tab_cols where column_name = 'id';
begin
FOR asd in c1
LOOP
temp := asd.table_name;
execute immediate 'select NVL(max("id"),0)+1 from "'||temp||'"' into last_val;
begin
EXECUTE IMMEDIATE 'drop sequence "seq_'|| temp||'"';
EXECUTE IMMEDIATE 'create SEQUENCE "seq_'|| temp ||'" MINVALUE '||last_val||'MAXVALUE                 999999999999999999999999999 INCREMENT BY 1 NOCACHE';
EXECUTE IMMEDIATE 'select '||temp||'.nextval from dual';
EXECUTE IMMEDIATE 'ALTER SEQUENCE "seq_'||temp||'" INCREMENT BY 1';
exception when others then
null;
end;
END LOOP;
end;
4

2 に答える 2

3

動的SQLはそのようには機能しません。

declare
varible1 varchar2 (255);
temp varchar2 (255);
last_val number(9,0);
 cursor c1 is Select distinct table_name from user_tab_cols order by table_name;
begin
  FOR asd in c1
  LOOP
  temp := asd.table_name;
  begin
    execute immediate 'select max(id) from '||temp into last_val;
    dbms_output.put_line('max(id) for table: ' ||temp||' = '||last_val);
  exception when others then
     dbms_output.put_line('Failed to get max(id) for table: ' ||temp);
  end;
  END LOOP;
end;
于 2012-04-26T07:20:51.493 に答える
0

テーブル名に変数を使用することはできません。

できることは、完全なSQLステートメントを文字列として作成し、executeimmediateを使用することです。

これを行う方法の例を次に示します。http://docs.oracle.com/cd/B19306_01/appdev.102/b14261/dynamic.htm#CHDGJEGD

于 2012-04-26T07:21:14.813 に答える