0

集計値を含む列を持つ VIEW を作成しました (varchar2 データ型で出力を格納します)。一部のレコードは最大制限を超えています (varchar2(4000) など)。長さをチェックし、必要に応じて文字列を作成する PL/SQL 関数が提案されました。

チェックして、構文エラーを修正しようとしましたが、

CREATE OR REPLACE
FUNCTION SUBURL(col1 IN VARCHAR2, col2 IN varchar2)
RETURN varchar2
IS
v_result_string varchar2(4000);
v_length varchar2(4000);
BEGIN
IF (length (col1) + length (col2) ... <= 4000) then return col1 || col2 || ...
END IF; 
-- build the string and check the length for every column you contatenate
v_result_string := col1;
if (length(v_result_string) + length (col2) > 4000) THEN
   -- add as much of col2 as you can up to a total of 4000
   v_length := 4000 - length(v_result_string);
   v_result_string := v_result_string  + substr(col2, 1, v_length);
   return v_result_string;
end if;
end suburl;

今回は2つのエラー、

エラー(7,35): PLS-00103: 記号「.」が見つかりました。次のいずれかを期待する場合: . ( ) , * % & = - + </> at in is mod 剰余 not rem => <> or != or ~= >= <= <> and or like like2 like4 likec as between || member submultiset 記号「.」無視されました。

エラー(7,76): PLS-00103: 記号「.」が見つかりました。次のいずれかを予期する場合: ( - + case mod new null continue avg count current max min before sql stddev sum difference execute forall merge time timestamp interval date pipe

4

1 に答える 1

1

コードに多数の構文エラーがあります。

  • まず、あなたの関数は引数を受け入れることになっていますか? 関数名の後に開いた括弧がFUNCTION suburl(あります。これは、パラメーターを渡すことを期待していることを意味します。ただし、パラメーターを宣言するのではなく、関数の本体から始めます。その開き括弧を削除するか、渡したいパラメータの宣言を追加してください。
  • 次に、ローカル変数を使用しv_lengthていて、v_result_stringそれが宣言されていません。それらを宣言する必要があります。v_resultl_stringのスペルミスではなく、3 番目の変数であると思われる場合はv_result_string、それも宣言する必要があります。
  • 第三に、関数の本体を開始および終了するBEGINandがありませんEND

関数宣言のスケルトンは次のようなものです

CREATE OR REPLACE FUNCTION name_of_function( parameter_list )
IS
  variable_declarations;
BEGIN
  body_of_function;
END;

さらに、コードの本文には、括弧が一致しない構文エラーが多数あります。

if (length(v_result_string) + length (col2) > 4000 THEN

たとえば、THEN

if (length(v_result_string) + length (col2) > 4000)
then

コード内の省略記号は何を表しているのですか? col1列と列以外を連結してcol2いますか? 列を連結すると 4000 バイトを超える文字列になる場合にたどるコード パスは、現状ではほとんど意味がありません。2 つの列のみを連結しようとしている場合は単純化できますが、さらに列がある場合は、それらも考慮する必要があります。

複数の異なる列ではなく、複数の異なるからデータを結合することを意味する「集計」という言葉を使用しました。それが実際に達成しようとしているものである場合は、ループを使用するか、ユーザー定義の集計関数を作成できます。

于 2012-12-18T19:39:20.370 に答える