2012-06-14 99 views
-1

下面的代碼塊拋出錯誤使用VARRAY ..如何PLSQL

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)...。 能否請你幫我出

回答

2

有各種各樣的與您的代碼的問題:

  1. 無法訪問的SQL語句在PL/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; 
/