2013-11-11 5 views
0

Я пытаюсь использовать курсор с предложением where. Он не должен сильно отличаться от простого курсора, который я предполагаю. В моем случае я попробовал следующее, но, похоже, не печатал какой-либо вывод.Курсор с предложением where

Declare 
     BG_TOTAL number; 
    SDO_GEOM varchar2 ; 

     cursor c1 is 
     select 
     SDO_GEOM.SDO_AREA(GEOMETRY, 0.005,'unit = SQ_MILE') 
      from <tablename> 
      where SITE_ID= 8; 

     Type SITE_TAB_TYPE is table of c1%ROWTYPE; 

     SITE_LIST SITE_TAB_TYPE; 

    Begin 
     open c1; 
     FETCH c1 BULK COLLECT INTO SITE_LIST; 

     close c1; 


     DBMS_OUTPUT.PUT_LINE(SITE_LIST(1).SDO_GEOM); 

    Exception 
     When others then 
     DBMS_OUTPUT.PUT_LINE(sqlerrm); 
    End; 



[Error] Execution (3: 11): ORA-06550: line 3, column 11: 
PLS-00215: String length constraints must be in range (1 .. 32767) 
ORA-06550: line 7, column 5: 
PLS-00487: Invalid reference to variable 'SDO_GEOM' 
ORA-06550: line 7, column 5: 
PLS-00487: Invalid reference to variable 'SDO_GEOM' 
ORA-06550: line 22, column 40: 
PLS-00302: component 'SDO_GEOM' must be declared 
ORA-06550: line 22, column 6: 
PL/SQL: Statement ignored 
+1

Что фактическая ** базы данных ** вы используете? SQL - это всего лишь язык запросов .... пожалуйста, обновите свои теги соответственно! –

+0

Любое сообщение об ошибке? Что означает ? –

+0

имя таблицы, на которой будет выполняться запрос выбора. Я только что заменил этот тег на tablename. – Nathan

ответ

0

Проблема заключается в том, что вы пытаетесь вывести весь объект таблицы на стандартный вывод, в то время как вы должны итерацию через него. Вместо того, чтобы:

DBMS_OUTPUT.PUT_LINE(SITE_LIST.SDO_GEOM); 

использовать что-то вроде этого:

FOR v_i IN 1..SITE_LIST.LAST 
LOOP 
    dbms_output.put_line(SITE_LIST(v_i).SOME_COLUMN_NAME); 
END LOOP; 

Заменить SOME_COLUMN_NAME с именем столбца, выбранного в курсором.

Редактировать

Вы должны обеспечить индекс элемента коллекции, к которому вы хотите обратиться к:

dbms_output.put_line(site_list(1).SDO_GEOM); 

Edit # 2

Да .. вы не указали псевдоним столбца для значения, выбранного в вашем запросе. Попробуйте этот курсор вместо:

cursor c1 is 
     select 
     SDO_GEOM.SDO_AREA(GEOMETRY, 0.005,'unit = SQ_MILE') AS my_value 
      from <tablename> 
      where SITE_ID= 8; 

А потом:

dbms_output.put_line(site_list(1).my_value); 
+0

Я не хочу перебирать петлю. Я просто хочу напечатать область выбранного идентификатора. – Nathan

+0

@Nathan Затем вы должны использовать: 'site_list (1) .SDO_GEOM'. –

+0

Я только что изменил блок SQL с сообщением об ошибке. – Nathan

Смежные вопросы