2016-11-17 7 views
-2

Я очень новичок в PL/SQL, и недавно я создал новую процедуру, которая, кажется, компилируется правильно, но когда я выполняю процедуру, она ничего не отображает.PLSQL BETWEEN процедура не работает

То, что я пытаюсь выполнить, - это выбрать почтовый индекс с максимальным количеством домов, затронутых между двумя входами, в процедуру, которая является timestamp outage_start_time, временной меткой outage_end_time.

Таблица: OUTAGE_ID, OUTAGE_START, OUTAGE_END, OUTAGE_ZIPCODE, OUTAGE_STATUS, HOUSES_AFFECTED

Процедура:

create or replace procedure start(outage_start_time timestamp, outage_end_time timestamp) 
as 
    Cursor test is 
    select outage_zipcode 
    from outage 
    where HOUSES_AFFECTED in (select max(HOUSES_AFFECTED)from outage) 
    and outage_start_time between outage_start and outage_end 
    and outage_end_time between outage_start and outage_end; 
average varchar(256); 
BEGIN 
    Open test; 
    Loop 
    fetch test into average; 
    exit when test%notfound; 
    dbms_output.put_line(average); 
end loop; 
end; 
+0

Процедура, которую вы написали, не заполнена. Просьба представить полный текст. – Dmitry

+0

обновлен всей процедурой – user2402107

+0

Вы бежите от sqlplus, а вы «УСТАНАВЛИВАЙТЕ СЕРВЕРУТУ» перед запуском? (т. е. попробуйте написать процедуру, которая просто выписывает «hello world» и убедитесь, что она работает для вас, а затем убедитесь, что ваш запрос действительно возвращает результаты ...) – Glenn

ответ

0

Принимая во внимание ваши комментарии, я считаю, что ваша average переменная содержит NULL значение. В SQL * Plus это будет выглядеть как пустая строка. Для того, чтобы убедиться, что вы можете добавить что-то к выходу:

dbms_output.put_line('average value is: ' || average); 

или даже

dbms_output.put_line('average value is: ''' || average || ''''); 

Последний один очень хорошо, когда вам нужно различать NULL значение из пространства символа (ов).

average переменная может быть нулевой, поскольку ваш запрос не возвращает строк. Почему - это вопрос к вашим данным.

+0

Я думал, что то же самое, но в этом есть что-то еще странное, у меня есть другие курсоры (не показаны выше) в той же процедуре, и когда я добавляю этот курсор, они больше не выводятся. Это похоже на то, что один курсор разбивает его. Без «тестового» курсора они работают так, как ожидалось. – user2402107

+0

@ user2402107 Если вам нужна другая помощь, вы должны предоставить информацию о том, как воспроизвести это поведение. Теперь я ничего не могу сказать. С этой новой информацией это другой вопрос. Возможно, у вас есть разделы «exception», которые скрывают ошибки? Может быть, результат запроса зависит от результата ранее выполненного? – Dmitry

+0

Я предполагаю, что мой лучший вопрос будет таким, как вы думаете, синтаксически правильный запрос выше, и должен делать желаемое поведение на основе логики? – user2402107

0

Ваш запрос не возвращает никаких строк. Запустить:

select outage_start, outage_end 
    from outage 
where HOUSES_AFFECTED in (select max(HOUSES_AFFECTED)from outage) 

и проверьте, есть ли какая-либо запись, для которых как outage_start_time и outage_end_time, которые вы передаете вашу процедуру, попадающей между outage_start и outage_end. Я почти уверен, что таких записей нет. Помните, что если outage_start или outage_end равно null, то условие WHERE не выполняется.

0

без данных образца и ожидаемого результата/выхода практически невозможно узнать, что вы действительно ищете.

Сначала я разработал соответствующий запрос. Возможно, это поможет:

SELECT DISTINCT 
     outage_zipcode 
FROM (
      SELECT 
        MAX(HOUSES_AFFECTED) over(partition by 1) as MX 
       , HOUSES_AFFECTED 
       , outage_zipcode 
      FROM outage 
     AND ( %1 BETWEEN outage_start AND outage_end 
      OR %2 BETWEEN outage_start AND outage_end 
      ) 
    ) 
WHERE HOUSES_AFFECTED = MX 
; 
+0

То, что я пытаюсь сделать, - это выбрать почтовый индекс с максимальным количеством домов, затронутых между двумя входами, в процедуру, которая является timestamp outage_start_time, timestamp outage_end_time. – user2402107

+0

Я изменил wuery выше. Пункт моего предложения состоит в том, чтобы вы могли написать запрос, который работает и дает правильный результат, и выполните процедуру. Одна из проблем, которые у вас есть в вашем существующем запросе, заключается в том, что максимальный расчет inst фильтруется по датам, поэтому вы можете иногда встречаться только иногда. Сначала работайте над wuery. Правильно. Затем сделайте процедуру. –

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