7

PL/SQL では、以下のコードは失敗します。varchar2 パラメータのサイズの定義は許可されていません。なぜなのかご存知ですか?どうすれば修正できますか?

create or replace function logMessage(msg varchar2(2000))
return number as
begin
    null;    
    return 1;
end logMessage;
/

エラーメッセージは

1/33 PLS-00103: 次のいずれかを想定しているときに、記号「(」が検出されました:

:= . ) , @ % デフォルト文字 ":=" 記号が "(" に置き換えられて続行されました。

4

2 に答える 2

10

サイズの制約を取り除くことで修正します。必要ありません:

create or replace function logMessage (msg in varchar2)
return number is
begin
    null;    
    return 1;
end logMessage;
/

あなたの機能はこれより少し複雑だと思いますか?

ドキュメントcreate functionのステートメントの完全な構文は次のとおりです。

CREATE [OR REPLACE] FUNCTION [Owner.]FunctionName 
     [(arguments [IN|OUT|IN OUT][NOCOPY] DataType [DEFAULT expr][,...])]
     RETURN DataType [InvokerRightsClause] [DETERMINISTIC]
     {IS|AS} 

詳細については、興味があればたくさんの情報がありますが、ネット上の TECH の方が便利かもしれません。


なぜわからないのか、答えが見つからないのかというあなたの最初の質問への答えです。しかし、APCを引用するには

これは面倒ですが、これが PL/SQL の仕組みなので、我慢しなければなりません。

簡単に言えば、実行時に何かがどれくらい長く続くかを知り、それに対処できるようにする必要があります。ただし、考慮できるオプションがいくつかあります。

メッセージの長さがわかっている場合は、変数を定義できます。そのデフォルト値はsubstrパラメーターの a です。

create or replace function logmessage ( msg in varchar2 ) return number is

   l_msg varchar2(2000) := substr(msg,1,2000);

begin
   return 1;
end;

または、関数自体で長さを確認できます。

create or replace function logmessage ( msg in varchar2 ) return number is

begin

   if length(msg) > 2000 then
      return 0;
   end if;

   return 1;
end;
于 2012-07-01T14:25:23.257 に答える
3

パラメーターはデータ型で宣言されますが、データ型の長さや精度はありません。つまり、パラメーターは VARCHAR2 として宣言できますが、長さコンポーネントで宣言することはできません (VARCHAR2(30) は無効になります)。

于 2012-07-01T14:27:27.710 に答える