如何在 PLSQL 的函数中使用序列?
How to use sequence in a function in PLSQL?
- 在我的架构中,我的结算中有一个参考编号列
table varchar2 类型的空值,我想不断更新它。
- 然后我使用内置函数创建了一个名为
ref_seq_num
的序列。
我想在我的函数 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)
)。我更喜欢使用 number
或 int
等数字类型来保存 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');
- 在我的架构中,我的结算中有一个参考编号列 table varchar2 类型的空值,我想不断更新它。
- 然后我使用内置函数创建了一个名为
ref_seq_num
的序列。 我想在我的函数
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)
)。我更喜欢使用 number
或 int
等数字类型来保存 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');