Что стоит на первом месте или переменная - PullRequest
0 голосов
/ 26 октября 2018

Итак, я пытаюсь написать запрос, который объявит две переменные (число «начало» и «конец»), а затем вставит в cte через цикл, каждое значение между началом и концом ниже, это то, что я до сих пор я что-то делаю глупо?

РЕДАКТИРОВАТЬ: я пытаюсь вставить 1 - 100 в cte записи каждой вставки с помощью оператора печати. Что я пытаюсь извлечь из этого, так это опыт использования переменных и cte в одном и том же специальном скрипте.

    WITH growing AS 
                (
                    SELECT 1 variable
                    FROM dual
                )
DECLARE 
            Start_Point number  := 1;
            End_Point   number  := 100;
BEGIN
        LOOP
                INSERT INTO growing VALUES (Start_Point);
                Start_Point := (Start_Point + 1);
                dbms_output.put.line(Start_Point);
                IF (SELECT COUNT(variable) FROM Growing WHERE variable = End_Point) > 0  EXIT;
                END IF;
        END LOOP;
END;

Ответы [ 2 ]

0 голосов
/ 26 октября 2018

Вы не можете вставить в CTE и не можете повесить блок PL / SQL от CTE - только запрос.(Хотя вы можете встроить PL / SQL в CTE из 12c).

Если вы хотите сгенерировать значения в диапазоне, вы можете использовать иерархический запрос:

with growing (variable) as (
  select <start_point> + level - 1
  from dual
  connect by level <= <end_point>
)

, где <start_point> и <end_point> - это заполнители, которые необходимо заменить буквальными значениями или (в зависимости от того, как вы будете использовать это) переменную замены или связывания.Так что с вашим диапазоном в качестве фиксированных литералов:

with growing (variable) as (
  select 1 + level - 1
  from dual
  connect by level <= 100
)
select * from growing;

  VARIABLE
----------
         1
         2
         3
...
        99
       100

или используйте рекурсивный CTE:

with growing (variable) as (
  select <start_point> from dual
  union all
  select variable + 1
  from growing
  where variable < <end_point>
)

так:

with growing (variable) as (
  select 1 from dual
  union all
  select variable + 1
  from growing
  where variable < 100
)
select * from growing;

  VARIABLE
----------
         1
         2
         3
...
        99
       100

Если вы пытаетесь объединитьэто с переменными PL / SQL, тогда вы можете использовать CTE в цикле курсора, ссылаясь на локальные переменные PL / SQL в CTE:

set serveroutput on
declare
  start_point number := 1;
  end_point   number := 100;
begin
  for r in (
    with growing (variable) as (
      select 1 from dual
      union all
      select variable + start_point
      from growing
      where variable < end_point
    )
    select * from growing
  )
  loop
    dbms_output.put_line(r.variable);
  end loop;
end;
/

1
2
3
...
98
99

PL/SQL procedure successfully completed.

, но вам действительно нужно использовать CTE какчасть большого запроса, будь то простой SQL или часть блока PL / SQL.

Чтобы просто напечатать значения в PL / SQL, вам не нужен CTE, просто простой цикл:

declare
  start_point number := 1;
  end_point   number := 100;
begin
  for i in start_point..end_point loop
    dbms_output.put_line(i);
  end loop;
end;
/

но опять же вы, конечно, ожидаете, что будете делать что-то более полезное с сгенерированными числами.Если у вас уже была временная таблица, созданная на уровне схемы, вы можете вставить ее (с помощью PL / SQL или обычного SQL).(Они должны сохраняться; таблица постоянна, по крайней мере, для глобальных временных таблиц; данные являются временными. Подробнее ).Или вы можете заполнить коллекцию таблиц, например,

declare
  type t_tab is table of number;
  tab t_tab := t_tab();
  start_point number := 1;
  end_point   number := 100;
begin
  for i in start_point..end_point loop
    dbms_output.put_line(i);
    tab.extend();
    tab(tab.count) := i;
  end loop;
end;
/

Это действительно зависит от того, что вам нужно делать с сгенерированными числами и во что вы их сохраняете (если что).

0 голосов
/ 26 октября 2018

Они вообще не связаны.

CTE присоединяется к оператору SELECT. Это способ именования подзапроса в SELECT. Остальная часть вашего кода является скриптовым кодом, который в Oracle называется PL / SQL. Код сценария отличается от оператора SELECT.

Вы не можете вставить в CTE. Это действительно просто сокращение для подзапроса. Я предполагаю, что вы хотите временную таблицу или какой-то набор. Если вам нужна помощь в решении проблемы, я бы предложил задать другой вопрос с объяснением того, что вы хотите сделать, образцы данных и желаемые результаты.

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