-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. 您不能在 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;
/
于 2012-06-14T20:43:36.673 回答