2

これは、役に立たないエラー メッセージが Oracle から返される状況の 1 つです。

私の状況は次のとおりです。PL/SQL でビューを動的に作成しています。文字列を作成し、EXECUTE IMMEDIATE を使用してビューを作成します。文字列が非常に長いので、CLOB を使用して格納します。

以下のコードを TOAD で実行すると、役に立たない

ORA-00907: missing right parenthesis error. 

TOAD で (EXECUTE IMMEDIATE を使用せずに) ビューを手動で作成しても問題はありません。私の感じでは、短い文字列を使用してビューを正常に作成できたため (また、dbms_lob.substr() の代わりに to_char() を使用しましたが、to_char() は小さな CLOB でのみ機能します)。

文字列の合計の長さは 13775 です (明らかに、文字列を作成する以下の行を編集しました)。これは Linux 上の Oracle 10g データベースです。

declare
lv_sql CLOB;

begin
lv_sql := ' CREATE OR REPLACE FORCE VIEW my_view.....';

EXECUTE IMMEDIATE dbms_lob.substr(lv_sql, 14765, 1 );    
end;
4

1 に答える 1

4

Klas が言ったように、変数宣言に VARCHAR2(32767) を使用できるはずですが、これでは不十分であることがわかった場合は、複数の VARCHAR2 変数を使用してビューステートメントのさまざまな部分を保持し、それらをEXECUTE IMMEDIATEステートメントに発行します。

ここでのAskTomの回答は、次のことを示しています。

http://asktom.oracle.com/pls/asktom/f?p=100:11:0::::P11_QUESTION_ID:6161200355268

言います:

即時実行の最大文字列長が 32K であることを示しました。

生成されたパッケージを作成するために即時実行を使用しており、現在それを渡しています> 35000文字

即時 v_myvc1 || を実行することによって my_vc2

vc1 と vc2 は 32k の varchar2 変数です。合計の長さは現在

35000

すべて 8.1.7 で

私の質問は、すぐに実行する文字列の最大長はどれくらいかということです。32k だと心配していたのですが、すでにそれを超えており、いつ壁にぶつかるかわかりません。

Tom Kyte 氏は次のように答えています。

フォローアップ 2003 年 3 月 5 日 - 午後 6 時 中部時間帯:

興味深いことに、そのようにするとは思いもしませんでした。

それは機能しているように見えます-それは壁にぶつかりますか? よくわかりませんが、32k を超えることはありませんでした。

かなり大きくなる可能性があるようです:

ops$tkyte@ORA817DEV> declare   
2          l_str1 long := 'select /* ' || rpad( '*', 20000, '*' ) || ' */ * '; 
3          l_str2 long := 'from /* '   || rpad( '*', 15000, '*' ) || ' */ dual';
4          l_str3 long := '/* '   || rpad( '*', 32000, '*' ) || ' */ ';   
5          l_result dual.dummy%type;   
6  begin   
7          execute immediate l_str1||l_str2||l_str3||l_str3||l_str3||' d' into l_result; 
8          dbms_output.put_line( l_result );   
9  end;  
10  / 

PL/SQL プロシージャが正常に完了しました。

これは Oracle 8i データベース インスタンス上にありましたが、VARCHAR2 変数をデイジー チェーン接続する機能が後のリビジョンで削除されていたら、私は非常に驚かれることでしょう。残念ながら、現時点では 10g のインスタンスが手元にないため、テストできません。

于 2011-10-03T13:58:37.900 に答える