繁体   English   中英

在Oracle序列中生成相同的正数和负数

[英]generating same positive and negative number in Oracle sequence

如何在oracle中通过序列生成以下数字

2
-2
2
-2
2
-2

等等。 我可以通过循环产生1,2,1,2,1,2但是上面我不能使用逻辑。

这似乎是一个奇怪的序列要求,但如果你真的想要那么你可以这样做:

create sequence weird_seq
start with 2
increment by 4
maxvalue 2
minvalue -2
cycle
nocache;

select weird_seq.nextval from dual
connect by level <= 10;

   NEXTVAL
----------
         2
        -2
         2
        -2
         2
        -2
         2
        -2
         2
        -2

increment 4是从-2到+2的步长。 maxval 2是下一个调用cycle s round到minval -2 它需要从+/- 2开始。 nocache是不幸的但是必要的,否则你会得到“ORA-04013:CACHE的数字必须小于一个周期”。

如果您只是将这些数字用作查询的一部分,那么您可以使用分层查询来代替:

select 2 * (2 * mod(level, 2) - 1)
from dual
connect by level <= 10;

2*(2*MOD(LEVEL,2)-1)
--------------------
                   2
                  -2
                   2
                  -2
                   2
                  -2
                   2
                  -2
                   2
                  -2

但是多次运行总是从+2开始,这可能不是你想要的。 (取决于它将如何使用......)

您可能还可以使用分析查询从现有数据中动态生成数字,但同样,它取决于您将使用此数据。

这是使用CASEMOD做同样的简单方法

SELECT CASE WHEN mod(level, 2) = 1 THEN 2 ELSE -2 END sequence 
FROM dual
CONNECT BY LEVEL <= 10;

在update语句中使用rownumber选择。

UPDATE yourtable
SET yourfield = yourfield*-1
WHERE yourfield IN
(SELECT yourfield FROM 
(SELECT rownum rn, y."yourfield" yourfield FROM yourtable y)
WHERE MOD(rn, 2) = 0)

我可以使用PL / SQL建议一个方法:

SQL> set serveroutput on;
SQL> Create sequence my_seq start with 2 minvalue -4;     
Sequence created

SQL> Create or Replace Procedure Pr_Get_MySeq( o_val out pls_integer ) is
  2     i_seq_name varchar2(35):= 'my_seq';
  3  begin
  4      execute immediate 'select '||i_seq_name||'.nextval from dual' INTO o_val;
  5      execute immediate 'alter sequence '||i_seq_name||' increment by ' ||to_char(-2*o_val) || ' minvalue -4';
  6  end;     
  7  /     
Procedure created

SQL> var o_val number;
SQL> begin
  2    Pr_Get_MySeq( :o_val );
  3  end;
  4  /

PL/SQL procedure successfully completed
o_val
---------
2

SQL> /

PL/SQL procedure successfully completed
o_val
---------
-2

SQL> /

PL/SQL procedure successfully completed
o_val
---------
2

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM