如何在 PLSQL 的函数中使用序列?

How to use sequence in a function in PLSQL?

  1. 在我的架构中,我的结算中有一个参考编号列 table varchar2 类型的空值,我想不断更新它。
  2. 然后我使用内置函数创建了一个名为 ref_seq_num 的序列。
  3. 我想在我的函数 get_ref_num 中使用它 (ref_seq_num) 来更新序列引用。我的定居点号码 table, return 类型也是 varchar2,我有一个如下所示的函数

    CREATE OR REPLACE FUNCTION get_ref_num RETURN settlement.ref_nr %TYPE IS
      v_ref_seq settlement.ref_nr%TYPE;
    BEGIN
      v_ref_seq := to_char(sysdate, 'YYYYMMDD')||LPAD(ref_seq_num.nextval, 8,'0');
      RETURN v_ref_seq; 
    END get_ref_num;
    

但是,我遇到了这个错误消息 1/55 PLS-00302: component 'ref_nr' must be declared。我还尝试将数据类型更改为 varchar2,错误消息是 PLS-00215: String length constraints must be in range (1 .. 32767) 我该如何解决?

根据您的代码,似乎有一个名为 SETTLEMENT 的 table,但它不包含 REF_NR 列。

以下示例显示了如何执行此操作:

SQL> create sequence ref_seq_num;

Sequence created.

确实包含 REF_NR 列(然后在函数中使用)的 table:

SQL> create table settlement (ref_nr varchar2(20));

Table created.

您的代码,未修改:

SQL> CREATE OR REPLACE FUNCTION get_ref_num RETURN settlement.ref_nr %TYPE IS
  2    v_ref_seq settlement.ref_nr%TYPE;
  3  BEGIN
  4    v_ref_seq := to_char(sysdate, 'YYYYMMDD')||LPAD(ref_seq_num.nextval, 8,'0');
  5    RETURN v_ref_seq;
  6  END get_ref_num;
  7  /

Function created.

测试:

SQL> select get_ref_num from dual;

GET_REF_NUM
--------------------------------------------------------------------------------
2019050400000001

SQL>

如果您在 settlement table 中有一个名为 ref_nr 的列,您的代码必须正常工作。我认为第二种情况的问题是由于缺少将变量定义为 v_ref_seq varchar2 的数据精度部分(应该是 varchar2(16) )。我更喜欢使用 numberint 等数字类型来保存 ref_nr 的值,因为它们都是数字,并且此数据类型保护数据保持为数字。每当您需要查询时,您可以使用 to_char 函数防止指数显示( select to_char(ref_nr) from settlement )。

此外,如果你使用 Oracle 12c 版本,你不需要创建这样一个额外的功能,只需改变你的 table 以便作为列的默认顺序 :

alter table settlement 
modify ref_nr default to_char(sysdate, 'yyyymmdd')||lpad(ref_seq_num.nextval, 8,'0');