Plsql 如何对序列名执行PL/SQL函数参数替换?

Plsql 如何对序列名执行PL/SQL函数参数替换?,plsql,Plsql,这快把我逼疯了 我调用一个PL/SQL函数,GetNextVal,传入一个变量ProgCode(比如“SLC”)。 该函数调用许多匹配的、预先存在的序列中的一个,在本例中为SLC\u seq.NextVal。在下一次调用时,传递另一个ProgCode(说“KLY”),但函数返回第一个ProgCode序列的nextval? 职能: CREATE OR REPLACE FUNCTION getNextVal(ProgCode IN VARCHAR2) RETURN NUMBER IS next_va

这快把我逼疯了

我调用一个PL/SQL函数,
GetNextVal
,传入一个变量ProgCode(比如“SLC”)。 该函数调用许多匹配的、预先存在的序列中的一个,在本例中为
SLC\u seq.NextVal
。在下一次调用时,传递另一个
ProgCode
(说“KLY”),但函数返回第一个
ProgCode
序列的
nextval
? 职能:

CREATE OR REPLACE FUNCTION getNextVal(ProgCode IN VARCHAR2)
RETURN NUMBER
IS next_val NUMBER;
BEGIN
    SELECT &ProgCode._seq.NextVal INTO next_val FROM DUAL;
RETURN(next_val); 
END;
/
快速循环测试脚本:

  declare
  type table_varchars is table of varchar2(4);
  var_table_varchar table_varchars;
  begin
  var_table_varchar := table_varchars('KLY','LGC','NLC','SLC');
  for e in 1..var_table_varchar.count loop
   for j in 1..10 loop
   dbms_output.put_line(var_table_varchar(e) || ': ' ||
   getnextval(var_table_varchar(e)));
  end loop;
 end loop;
 end;
/
测试输出:

KLY: 201
KLY: 202
KLY: 203
KLY: 204
KLY: 205
KLY: 206
KLY: 207
KLY: 208
KLY: 209
KLY: 210
LGC: 211
LGC: 212
LGC: 213
LGC: 214
LGC: 215
LGC: 216
LGC: 217
LGC: 218
LGC: 219
LGC: 220
NLC: 221
NLC: 222
NLC: 223
NLC: 224
NLC: 225
NLC: 226
NLC: 227
NLC: 228
NLC: 229
NLC: 230
SLC: 231
SLC: 232
SLC: 233
SLC: 234
SLC: 235
SLC: 236
SLC: 237
SLC: 238
SLC: 239
SLC: 240
我做错了什么?是否需要在函数中取消设置
&ProgCode

Thx

  • 首先,不能在PL/SQL中使用替换变量(
    &
    ),因为它是SQL*Plus的专有功能。因此,必须使用绑定变量,

  • 其次,您不必在函数或过程中设置值,这就是为什么您要获取第一个序列的下一个值的原因,因为当您编译函数时,您将ProgCode设置为“KLY”。必须使用参数,因为它位于块内

  • 试试这个:


明亮的工作得很好!Thx@brenners1302
   create or replace FUNCTION getNextVal(ProgCode IN VARCHAR2) RETURN VARCHAR2

   IS 
   next_val VARCHAR2(200);
   v_sql VARCHAR2(2000);
   BEGIN

   v_sql := 'SELECT '||ProgCode||'_seq.nextval FROM DUAL';
   --dbms_output.put_line(v_sql);
    EXECUTE IMMEDIATE v_sql INTO NEXT_VAL;

   RETURN NEXT_VAL;
   END;