Возникли проблемы с переменными в Oracle оратор SQL - PullRequest
2 голосов
/ 21 декабря 2010

Хочу отметить, что я новичок в использовании sql developer и пытаюсь заполнить временную таблицу двумя значениями, найденными в двух переменных, но я не могу сделать это правильно.Я надеюсь, что, возможно, один из вас, ребята, мог бы иметь лучшую идею.Вот что я пробовал:

DECLARE
     x NUMBER;
     y NUMBER;
BEGIN
EXEC SELECT COUNT(*) INTO :x FROM (select * from view2 where restituita=1);
EXEC SELECT COUNT(*) INTO :y FROM (select * from view2 where restituita=0);
create global temporary table dateRest (rest number,nerest number);
insert into dateRest values(x,y);
select * from dateRest;
END;

Ответы [ 4 ]

3 голосов
/ 21 декабря 2010

Исходя из окончательных результатов, запрос слишком сложен - он должен быть следующим:

SELECT SUM(CASE WHEN restituita = 1 THEN 1 ELSE 0 END),
       SUM(CASE WHEN restituita = 0 THEN 1 ELSE 0 END)
  FROM view2;
3 голосов
/ 21 декабря 2010

Боюсь, у вас больше ошибок и проблем, чем строк кода.Это смесь операторов SQL, PL / SQL и привязки переменных других языков.

Поскольку вы используете блок Declare / begin / end , вы находитесь в мире PL / SQL,В мире PL / SQL:

  • Вы не можете использовать EXEC , потому что это короткая рука для begin / end , если вы не в PL /SQL.
  • Вам не нужно использовать двоеточия для привязки переменных
  • Вы не можете выполнить инструкцию SELECT , не поместив результат куда-либо
  • Вы не можетевыполнять операторы DDL (CREATE TABLE ...) напрямую.
  • Обычно вы не можете ссылаться на таблицы, которые не существуют, когда начинается блок begin / end .

И не забудьте зафиксировать.

Так что решение, вероятно, таково: не используйте PL / SQL.

create global temporary table dateRest (rest number,nerest number);
insert into dateRest(x, y)
  select (select count(*) from view2 where restituita=1),
    (select count(*) from view2 where restituita=0)
  from dual;
commit;
0 голосов
/ 21 декабря 2010

Исправленный анонимный блок OMG будет:

DECLARE
   var1 Number;
   var2 Number;
BEGIN
SELECT SUM(CASE WHEN restituita = 1 THEN 1 ELSE 0 END),
     SUM(CASE WHEN restituita = 0 THEN 1 ELSE 0 END)
   INTO var1, var2
FROM view2;

END;
0 голосов
/ 21 декабря 2010

Вы должны потерять : для параметров в (анонимных) процедурах.

[править]

Нет, я не прав: не нужны, если вы не используете EXEC.Я думаю, что ваша проблема заключается в создании таблицы.Это невозможно, так как PLSQL не поддерживает оператор CREATE TABLE.Вы должны использовать:

EXECUTE IMMEDIATE 'CREATE TABLE ....';
...