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

时间:2019-05-04 06:19:47

标签: oracle function plsql sequence procedure

  1. 在我的模式中,我的结算中有一个参考号列 空值为varchar2类型的表,我想对其进行连续更新。
  2. 然后我使用内置函数创建了一个名为ref_seq_num的序列。
  3. 我想在我的函数ref_seq_num中使用它(get_ref_num)来更新序列引用。编号到我的结算表, 返回类型也是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),该如何解决?

2 个答案:

答案 0 :(得分:2)

根据您的代码,似乎有一个名称为SETTLEMENT的表,但其中不包含REF_NR列。

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

SQL> create sequence ref_seq_num;

Sequence created.

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

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>

答案 1 :(得分:1)

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

此外,如果您使用Oracle 12c版本,则无需创建这样的额外功能,只需更改表,以使列的默认设置为序列:

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