動的 SQL を使用する小さな関数があります。ストアド プロシージャの実行時に Viewname と Where_clause を取得するため、動的 SQL も必要です。
create or replace FUNCTION Costs_MK(VIEWNAME IN VARCHAR2,
WHERE_Clause IN VARCHAR2)
RETURN VARCHAR2
IS
v_Costs VARCHAR2(3000);
BEGIN
EXECUTE IMMEDIATE 'Select Listagg(Costs, ' || '''' || ';' || '''' || ' )
WITHIN GROUP (ORDER BY Costs)
from (select distinct (Costs)
from ' || Viewname || ' where ' || where_Clause || ')'
INTO v_Costs;
dbms_output.put_line(length(v_Costs));
RETURN v_Costs;
END Costs_MK;
出力:
ORA-06502: PL/SQL: numeric or value error: character string buffer too small
ORA-06512: in Line 9
1600
変数 v_Costs の長さは 1600 で、既に長さを 3000 に設定しています。ただし、毎回このエラーが発生し、これを解決するために何ができるかわかりません。
行 9 は次のとおりです。
Line 8: BEGIN
Line 9:
Line 10: EXECUTE IMMEDIATE
匿名ブロック:
DECLARE
VIEWNAME VARCHAR2(200);
WHERE_Clause VARCHAR2(200);
v_Return VARCHAR2(200);
BEGIN
VIEWNAME := 'Orders';
WHERE_BEDINGUNG := 'Orders.key like ' || '''' || ' B01 230/01/123456%' || '''';
v_Return := Costs_MK(
VIEWNAME => VIEWNAME,
WHERE_Clause => WHERE_Clause
);
/* Legacy output:
DBMS_OUTPUT.PUT_LINE('v_Return = ' || v_Return);
*/
:v_Return := v_Return;
--rollback;
END;
そして今、私はエラーを見つけました。は 200 しかないためv_Return VARCHAR2(200)
です。たとえば 4000 に上げると、目的の結果が得られます。さて、私はこれを解決する方法を知っていると思います。