【问题标题】:Select nextval from a sequence with a variable name从具有变量名的序列中选择 nextval
【发布时间】:2013-10-09 01:50:36
【问题描述】:

我正在一个应用程序中工作,其中每个用户都有一个 Id,它是一个序列中的连续数字,序列并不总是相同的。

假设您有序列 A 的 nextval 设置为 8,序列 B 的 nextval 设置为 5。应用程序必须根据一组规则告诉要使用哪个序列,因此下一个条目的 id 可以是 5 或8(它不会有任何约束问题,因为主键在另一个字段中)。我想使用单个查询,例如

SELECT NEXTVAL FROM ALL_SEQUENCES WHERE SEQUENCE_NAME = "";

但我不知道这是否可能。

我不想在我的应用代码中连接序列名称,因为它破坏了我用于其余查询的模式。

【问题讨论】:

  • 您需要编写一个函数来传递序列名称。然后该函数可以使用动态 SQL 来查询序列并返回值。

标签: oracle sequence


【解决方案1】:

正如 a_horse_with_no_name 建议的那样,您可以创建一个函数来获取下一个值,例如,

CREATE OR REPLACE 
FUNCTION next_val(
         sequence_name IN VARCHAR2
         )RETURN VARCHAR2 
IS
     v_nextval INTEGER;
     v_select VARCHAR2(100);

BEGIN
     v_select := 'select '||sequence_name||'.nextval from dual';
     EXECUTE IMMEDIATE v_select INTO v_nextval;

     RETURN v_nextval;
END;

【讨论】:

  • 但是有没有办法使用 作为变量,所以它可以是 A.nextval 或 B.nextval 在同一个查询中? case 语句不是一个选项,因为我不能保证 sequence_name 将保持不变(它由用户定义)。
  • 在这种情况下,您可以创建一个函数来执行此操作,请查看我更新的答案。
猜你喜欢
  • 2018-09-05
  • 2012-11-07
  • 2021-10-24
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2017-07-07
  • 1970-01-01
相关资源
最近更新 更多