Sql cte或变量首先出现的是什么

Sql cte或变量首先出现的是什么,sql,oracle,Sql,Oracle,所以我试着写一个查询,它将声明两个变量(“开始”和“结束”编号),然后通过一个循环插入到cte中,下面开始和结束之间的每个值都是我到目前为止得到的,我在做什么傻事吗 编辑:我试图插入1-100到cte记录每个插入通过打印语句。 我试图从中获得的是在同一个特别脚本中使用变量和cte的经验 WITH growing AS ( SELECT 1 variable FROM dual

所以我试着写一个查询,它将声明两个变量(“开始”和“结束”编号),然后通过一个循环插入到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;

这些根本没有关系

CTE附加到
SELECT
语句。这是在
SELECT
中命名子查询的一种方法。其余的代码是脚本代码,在Oracle中称为PL/SQL。脚本代码不同于
SELECT
语句


您不能插入到CTE中。它实际上只是子查询的简写。我想你需要一张临时桌子或是一套。如果您需要帮助解决一个问题,我建议您再问一个问题,说明您想做什么、样本数据和期望的结果。

这些根本不相关

CTE附加到
SELECT
语句。这是在
SELECT
中命名子查询的一种方法。其余的代码是脚本代码,在Oracle中称为PL/SQL。脚本代码不同于
SELECT
语句


您不能插入到CTE中。它实际上只是子查询的简写。我想你需要一张临时桌子或是一套。如果您需要帮助解决一个问题,我建议您再问一个问题,提供您想要做的事情、示例数据和所需结果的解释。

您不能插入CTE,也不能挂起CTE上的PL/SQL块-只能挂起一个查询。(尽管您可以从12c将PL/SQL嵌入CTE)

如果要生成某个范围内的值,可以使用分层查询:

with growing (variable) as (
  select <start_point> + level - 1
  from dual
  connect by level <= <end_point>
)
不过,当然,你也希望能用生成的数字做一些更有用的事情。如果您已经在模式级别创建了一个临时表,那么您可以(通过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;
/

这实际上取决于您需要对生成的数字执行什么操作以及存储它们的内容(如果有的话)。

您不能插入CTE,也不能将PL/SQL块挂起CTE—只能挂起查询。(尽管您可以从12c将PL/SQL嵌入CTE)

如果要生成某个范围内的值,可以使用分层查询:

with growing (variable) as (
  select <start_point> + level - 1
  from dual
  connect by level <= <end_point>
)
不过,当然,你也希望能用生成的数字做一些更有用的事情。如果您已经在模式级别创建了一个临时表,那么您可以(通过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;
/

这实际上取决于您需要对生成的数字执行什么操作以及存储它们的内容(如果有的话)。

您所说的“插入CTE”是什么意思?您以一种奇怪的方式混合了INF SQl和PL/SQl。。。您能否编辑问题,解释您实际想要实现的目标,包括您想要获得的输出/结果?您所说的“插入CTE”是什么意思?您以一种奇怪的方式混合了INF SQl和PL/SQl。。。你能编辑这个问题吗?解释一下你实际上想要实现什么,包括你想要得到什么输出/结果?我无法创建临时表,因为在我当前的环境中无法创建/删除表,也无法创建数据库进行实验,正如我被告知的,临时表必须以其他方式删除,它们是否会在模式中持久化?我想CTE可能是个不错的选择。虽然我可能完全不理解临时表在oracle中的工作原理。我无法创建临时表,因为在我当前的环境中无法创建/删除表,也无法创建数据库进行实验,因为我被告知必须以其他方式删除临时表,因为它们在架构中保持不变?我想CTE可能是个不错的选择。尽管我可能完全不理解临时表在oracle中是如何工作的。
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.
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;
/
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;
/