0

基本的な条件句に基づいて行を取得する基本的なクエリを実行していますが、複雑なことは何もありません。これはうまくいきます:

<cfquery name="courses" datasource="banner">
        SELECT *
        FROM tjucatalog
        WHERE (course_status = 'Active')
            AND CONCAT(subject,course_no) IN (#PreserveSingleQuotes(courselist)#)
            AND term IN ('Fall 2012')
            AND ((end_date > #now()#) OR (course_meeting_info IS NOT NULL))
        ORDER BY TYear, TSort, DayNum, start_date, time, title
</cfquery>

ただし、クエリから「AND term IN」行を削除すると失敗します。

<cfquery name="courses" datasource="banner">
        SELECT *
        FROM tjucatalog
        WHERE (course_status = 'Active')
            AND CONCAT(subject,course_no) IN (#PreserveSingleQuotes(courselist)#)
            AND ((end_date > #now()#) OR (course_meeting_info IS NOT NULL))
        ORDER BY TYear, TSort, DayNum, start_date, time, title
</cfquery>

私が得るエラーは次のとおりです: ORA-06502: PL/SQL: 数値または値のエラー: 文字列バッファが小さすぎます

これはおそらく、フィールド「用語」を含める必要があるビューですか、それとも私がまったく気付いていない他の何かがここにあるのでしょうか?

4

2 に答える 2

3

これは、おそらくビューから、内部で呼び出されているパッケージのエラーのようです。に対してクエリを実行しtjucatalogていますが、返された列の1つが実際には関数呼び出しであるビューである可能性があります。

問題になるのは必ずしもterm列ではありません。その条件を削除することにより、より多くの行が返され、条件が設定されているときに存在しない行の列値に対して関数が呼び出されます。ただし、現在表示されている行の1つにある任意の列である可能性があります。

何が起こっているのかについての単純で不自然な例として:

create table t42 (id number, foo varchar2(20));

insert into t42 (id, foo) values (1, 'Short');
insert into t42 (id, foo) values (2, 'More than 10');

create package p42 as
function func(p_id in number) return varchar2;
end p42;
/

create package body p42 as
function func(p_id in number) return varchar2 is
    l_bar varchar2(10);
begin
    select foo into l_bar from t42 where id = p_id;
    return l_bar;
end func;
end p42;
/

create view v42 as select id, p42.func(id) as bar from t42;

したがって、2行のテーブルがあります。1つfooは10文字未満、もう1つは10文字を超えています。id値を取得して検索しfoo、それを返す(愚かな)パッケージ関数があります。そして、その機能を使用するビュー。

これは機能します:

select * from v42 where id = 1;

        ID BAR
---------- --------------------
         1 Short

ただし、条件を削除すると失敗します。

select * from v42;

ERROR:
ORA-06502: PL/SQL: numeric or value error: character string buffer too small
ORA-06512: at "SCOTT.P42", line 5

パッケージ本体の5行目はですが、問題は、としてselect foo into l_bar from t42 where id = p_id;宣言したことです。これは、の値に対して小さすぎます。私はそれを、またはさらに良いと宣言すべきでした。l_barvarchar2(10)fooid=2varchar2(20)t42.foo%TYPE

問題のある関数が何をしているのかを確認するには、ソースコードを調べてください。ソースコードがない場合は、データベースから取得できます(ラップされていない場合)。

select line, text from all_source
where owner = 'BANINST1'
    and name = 'TJUCATALOG_PACK'
    and type = 'PACKAGE BODY'
order by line;
于 2012-07-02T16:26:40.043 に答える
2

Oracleの達人が戻ってきて、フィールドタイプをvarchar2(4000)からCLOBに変更する必要があると教えてくれました。フィルタ句としての用語フィールドの欠如は、赤ニシンのエラーでした。クエリ内のどのフィールドを許可された長さまで増やす必要があるかはわかりませんが、機能するので満足しています。

于 2012-07-03T13:32:51.237 に答える