ref_seq_num
的序列。我想在我的函数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)
,该如何解决?
答案 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
)引起的。我更喜欢使用数字类型,例如number
或int
来保存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');