Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/oracle/9.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Sql 随条件增加i_Sql_Oracle_For Loop_Plsql_Increment - Fatal编程技术网

Sql 随条件增加i

Sql 随条件增加i,sql,oracle,for-loop,plsql,increment,Sql,Oracle,For Loop,Plsql,Increment,每当v_id的值不同时,我想增加I乘以1 i = 1; for i in 1..10 loop SELECT subject_details.NEXTVAL INTO v_id FROM dual; INSERT INTO employee (id, subject) VALUES (i,v_id); i = i + 1; end loop; 它的作用是

每当v_id的值不同时,我想增加I乘以1

    i = 1;
   
    for i in 1..10 loop 
      SELECT subject_details.NEXTVAL 
        INTO v_id 
        FROM dual;
    
      INSERT INTO employee (id, subject) 
           VALUES (i,v_id);

      i = i + 1;
    end loop;
它的作用是

  id subject
    1  3647
    2  3647
    3  5678
    4  5678
    5  5678
但我想要的是,每当“v_id”的值发生变化时,将“I”的值增加1

试一试


我想你可以使用
densite\u rank()

如果这些值可以交错,则可以使用
lag()
和累积和:

select t.*,
       sum(case when prev_subject = subject then 0 else 1 end) over (order by id)
from (select t.*,
             lag(subject) over (order by id) as prev_subject
      from t
     ) t;

虽然有很多好的建议,但我认为它们大多都会错过你最大的错误。我认为这是对pl/sql范围规则的误解。在tour代码的某个地方(在发布之前),您定义了一个变量,然后我创建了一个i作为FOR循环的索引变量。您面临的问题是,由于作用域规则,这些变量不相同。根据:(另见)

对于索引名
隐式声明的整数变量的名称 本地到FOR循环语句。循环外的语句不能 参考索引。循环中的语句可以引用索引,但是 无法更改其值。在FOR循环语句运行之后,索引将被删除 未定义

您的流程还存在一些其他问题:

  • 在Oracle中,赋值运算符为:=not=;(我想这只是 打字错误)
  • 在每个循环迭代中运行“subject_details.NEXTVAL”,然后 随后将该结果插入表中。这样做将 每次递增该值。因此,你不能产生你想要的结果 输出-也不是您声称的输出

So
i=v_id-999
?这里的v_id值只是一个示例。它也可以是74685或36495。我想知道如何调用序列。nextval在连续迭代中返回相同的值Offtopic:why
SELECT subject\u details.nextval从dual到v\u id
而不是
v\u id:=subject\u details.nextval
?我会放弃这个循环,希望采用Gordon的稠密等级思想,并将其用于
插入。。。。改为选择…
语句。你可能也在循环一个光标,这会很慢。当您可以执行基于集合的处理(例如,单个SQL语句)时,不要执行逐行处理(例如,通过游标循环)。嗨,Zakaria,欢迎使用堆栈溢出。虽然您的代码可以回答这个问题,但您可以通过提供上下文来改进它:这是如何/为什么解决这个问题的?你所做的与提问者所做的有什么不同?但我希望将这些值插入表中。可以在insert语句中使用密集秩吗?@newintodev。对任何
select
语句都与
insert
一起使用。
j = 1;
v_id_copy = 0;
for i in 1..10 loop 
SELECT subject_details.NEXTVAL INTO v_id FROM dual;
if(v_id_copy==0) then
v_id_copy = v_id;
elseif (v_id_copy != v_id) then
j=j+1;
v_copy_id=v_id;
endif
insert into employee (id,subject) values (j,v_id)
end loop;
select t.*, dense_rank() over (order by subject) 
from t;
select t.*,
       sum(case when prev_subject = subject then 0 else 1 end) over (order by id)
from (select t.*,
             lag(subject) over (order by id) as prev_subject
      from t
     ) t;