-1

以下のコードブロックはエラーをスローしています..

DECLARE
  TYPE dbadaptor IS VARRAY (9) OF VARCHAR2(20);
  min_date DATE;
  max_date DATE;
  db       dbadaptor := dbadaptor('wsf_ds_11765_c', 'wsf_ds_11750_c',
                                  'wsf_ds_11756_c', 'wsf_ds_11759_c',
                                  'wsf_ds_11706_c', 'wsf_ds_11709_c', 
                                  'wsf_ds_11751_c', 'wsf_ds_11708_c',
                                  'wsf_ds_11762_c');
BEGIN
  FOR i IN 1..9 LOOP
    SELECT
      from_sf_date(max(start_time)),
      from_sf_date(min(start_time))
    INTO max_date, min_date
    FROM db(i);
  END LOOP;
END;

8 行目で「PL/SQL: ORA-00933: SQL コマンドが正しく終了していません」というエラーが表示されます。これは db(i) が原因です…. 助けてくれませんか

4

1 に答える 1

2

コードにはさまざまな問題があります。

  1. PL/SQL で定義されたデータ型に SQL 文でアクセスすることはできません。
  2. from 句で配列にアクセスするには、関数を使用する必要がありtableます。
  3. 配列から選択しようとしてstart_timeいますが、そのような列が定義されていません。あなたが持っている唯一の列は、未定義の名前を持つ文字列です (これは として参照されますcolumn_value)。

以下は、問題 1 と 2 で参照されている手法を示す例です (問題 3 の解決策を提供するのに十分な情報がありません)。

CREATE TYPE dbadaptor AS VARRAY(9) OF VARCHAR2(20);

DECLARE
   min_date DATE;
   max_date DATE;
   db       dbadaptor
               := dbadaptor('wsf_ds_11765_c',
                            'wsf_ds_11750_c',
                            'wsf_ds_11756_c',
                            'wsf_ds_11759_c',
                            'wsf_ds_11706_c',
                            'wsf_ds_11709_c',
                            'wsf_ds_11751_c',
                            'wsf_ds_11708_c',
                            'wsf_ds_11762_c');
BEGIN    
   FOR db_value IN (SELECT COLUMN_VALUE AS CV FROM TABLE(db)) LOOP
      DBMS_OUTPUT.put_line(db_value.CV);
   END LOOP;    
END;
/

ただし、これは配列をループする非効率的な方法です。それだけの場合は、ループを使用する方がよいでしょう:

DECLARE
   type dbadaptor is VARRAY(9) OF VARCHAR2(20);
   min_date DATE;
   max_date DATE;
   db       dbadaptor
               := dbadaptor('wsf_ds_11765_c',
                            'wsf_ds_11750_c',
                            'wsf_ds_11756_c',
                            'wsf_ds_11759_c',
                            'wsf_ds_11706_c',
                            'wsf_ds_11709_c',
                            'wsf_ds_11751_c',
                            'wsf_ds_11708_c',
                            'wsf_ds_11762_c');
   i number;
BEGIN
   FOR i IN 1..9 LOOP
      DBMS_OUTPUT.put_line(db(i));
   END LOOP;
END;
/
于 2012-06-14T20:43:36.673 に答える