2016-04-15 6 views
0

これは私を夢中にしています!シーケンス名でPL/SQLファンクションのパラメータ置換を実行する方法は?

私はPL/SQLファンクションGetNextValを呼び出して、変数「ProgCode」(「SLC」など)を渡しています。 この関数は多くの一致する既存のシーケンスの1つを呼び出します。この場合はSLC_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; 
/

Aクイックルーピングテストスクリプト:

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
  • それはSQL * Plusでの排他的な機能であるため、まず、あなたがPL/SQLでsubstituion変数(&)を使用することはできません。したがって、あなたは第二に、あなたが関数やプロシージャ内の値を設定するために持っていけない、それはあなたが最初のシーケンスの次の値を取得している理由である、代わりに:

  • をバインディング変数を使用する必要があります。関数をコンパイルすると、ProgCodeを 'KLY'に設定するからです。パラメータはブロック内にあるように使用する必要があります。

  • これを試してみてください:

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; 
+0

ブリリアント!完璧に働いた! Thx @ brenners1302 –

関連する問題