这让我发疯了!
我正在调用PL / SQL函数GetNextVal
,传入变量ProgCode(如“SLC”)。
该函数调用许多匹配的预先存在的序列之一,在本例中为SLC_seq.NextVal
。在下一次调用时,传递另一个ProgCode
(比如说“KLY”),但该函数返回第一个nextval
序列的ProgCode
?
功能:
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
答案 0 :(得分:0)
首先,您不能在PL / SQL中使用替换变量(
&
),因为它是SQL * Plus的独有功能。因此,您必须使用绑定变量:
其次,你不必在函数或过程中设置一个值,这就是你得到第一个序列的下一个值的原因,因为当你编译函数时,你将ProgCode设置为' KLY&#39 ;.您必须使用块内的参数。
试试这个:
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;