Shilpa_g2 Ответов: 1

Параметр в файле SQL


дорогие все

нужно вызвать sql-файл из пакетного файла и передать параметр .

если переданный параметр равен a, то выберите столбец sum(a)
если переданный параметр равен b, то выберите sum(b)
если переданный параметр равен c, то выберите sum(a+b)

и сохраните вывод в имя файла после передачи параметра.



это дает мне ошибку пожалуйста 00428

Что я уже пробовал:

set verify off

spool &&1


var param VARCHAR2(20);
begin
:param :=  '&&1';
end;
/

begin
if (:param = 'a9001') then
 :param := 'a233+a244';


else
if (:param = 'a9002') then
:param := 'a596+a561-a501';

end if;
end if;

DBMS_OUTPUT.PUT_LINE (:param);

select 
NVL(sum( case when yr=2017 and mon=3 then  :param end),0) MARCH17,
NVL(sum( case when yr=2018 and mon=3 then  :param end),0) MARCH18
from sales



end;
/
spool off

exit;

1 Ответов

Рейтинг:
1

CHill60

Эта ошибка означает, что "в этом выборе ожидается предложение INTO"

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

Взгляните на эти решения здесь[^], который был буквально первая ссылка отображается, когда я googled для "ошибку, пожалуйста 00428"

Например, (непроверенный)

select 
NVL(sum( case when yr=2017 and mon=3 then  :param end),0) INTO MARCH17
from sales
Однако код, который вы опубликовали, имеет лишь малейшее сходство с проблемой, как вы ее описали ... Я не понимаю, почему вы пытаетесь получить два возвращаемых значения и почему вы жестко кодируете год и месяц ... они должны быть параметрами, которые передаются.

[EDIT] - я пропустил использование SUM, поэтому OP теперь получает ORA-00934.

Если бы я подходил к этой проблеме с нуля, я бы, вероятно, сделал что-то вроде следующего (опять же непроверенный извините, у меня здесь нет экземпляра Oracle)
select sum(colA) totA, sum(colB) totB, sum(colA + colB) totC
into totA, totB, totC
FROM ... etc
вместо того, чтобы пытаться сделать какой-то умный динамический sql. Это должно переместить сумму групповой функции "в сторону" от INTO.


Shilpa_g2

спасибо что ответили

"Почему вы должны жестко кодировать год и месяц"

вот что такое следующее изменение .

ввод в эксплуатацию до 17 марта дает ошибку PL/SQL: ORA-00934

CHill60

Я обновил свое решение. К сожалению, в данный момент я не могу должным образом проверить эти предложения

Shilpa_g2

я должен выбрать столбец в зависимости от переданного параметра. все значения не должны быть показаны.

CHill60

Суммировав итоговые значения, вы затем решаете, какое значение возвращать на основе параметра, переданного с помощью оператора CASE.
Кстати, у вас действительно есть колонки "а596", "а561" и "а501"?