-1
CREATE OR REPLACE PACKAGE BODY BAS_NUMB_UPD AS
PROCEDURE BAS_NUM_UPDN AS
CURSOR cur IS
    SELECT DISTINCT o.obj_id,LTRIM(substr(convert_171_to_711(cp.T_C_CP),1,7),'0')  bas_n
      FROM t_obj o, mat_tea_rel mpr, coorg_tea cp
     WHERE o.obj_type = 'Resin' 
       AND o.obj_id = mpr.obj_id
       AND mpr.p_k_id = cp.p_k_id;

    l_b_num_attr_id  number(10) := get_attribute_id('Ba Nu');
    flag1 VARCHAR2(10);

    BEGIN
        FOR x IN cur LOOP
            dbms_output.put_line(x.obj_id||'contains b n'||x.bas_n);
            SELECT flag INTO flag1
              FROM t_xc_s_values
             WHERE attr_id = l_b_num_attr_id 
               AND Obj_id = x.obj_id
               AND VALUE = x.bas_n;

            EXCEPTION 
               WHEN NO_DATA_FOUND THEN 
                  flag1 :='Nothing'; 
               WHEN OTHERS THEN
                   raise_application_error(-20011,'Unknown Exception in PROCEDURE');
            END;

            IF flag1 = 1 THEN 
                dbms_output.put_line('flag equal to one');
            ELSE
                INSERT INTO t_xc_s_values (obj_id, at_id, VALUE,)
                VALUES (x.obj_id, l_b_num_attr_id, x.bas_n);
            END IF;
        END LOOP;
    END;
    END BAS_NUM_UPDN;
END BAS_NUMB_UPD;

これらはエラーです

エラー(28,1): PLS-00103: 次のいずれかを予期しているときに、シンボル「EXCEPTION」が検出されました: begin case 宣言 end exit for goto if loop mod null pragma raise return select update while with << close current delete fetch lock insert open rollback
savepoint set sql execute commit forall マージ パイプ

エラー (35,1): PLS-00103: 次のいずれかを予期しているときに、シンボル "IF" が検出されました: end not pragma final instanceiable order オーバーライド静的メンバー コンストラクター マップ

エラー(47,3): PLS-00103: 次のいずれかを予期しているときに、記号「END」が検出されました: ;

4

2 に答える 2

2

コードが正しくネストされていません:

  • EXCEPTION 部分がある場合は、BEGIN / EXCEPTION / END のトリプルを同じレベルに配置する必要があります。したがって、おそらく LOOP の後に BEGIN を挿入する必要があります。

  • 各 END は BEGIN と一致する必要があります。前に BEGIN の記述がないことに加えて、最後に END ステートメントが多すぎます。最後から 3 行目にあるものを削除します。

これらは単なる構文エラーです。手順が意図したとおりに機能するかどうかを確認しませんでした。

于 2012-07-27T09:55:34.470 に答える
1

あなたが得るエラーは非常に簡単です。がありますがEXCEPTION ... END、一致するものはありませんBEGIN。フラグ選択の no_data_found をトラップしたいので、そのブロックをBEGIN

(なぜ WHEN OTHERS を使用するのですか?なぜそれをトラップしてから「不明」と言うのですか?エラーは決して不明ではありません。)

BEGIN
     FOR x IN cur LOOP
         dbms_output.put_line(x.obj_id||'contains b n'||x.bas_n);
         BEGIN -- added here
           SELECT flag INTO flag1
             FROM t_xc_s_values
            WHERE attr_id = l_b_num_attr_id
              AND Obj_id = x.obj_id
              AND VALUE = x.bas_n;
          EXCEPTION
             WHEN NO_DATA_FOUND THEN
                flag1 :='Nothing';
             WHEN OTHERS THEN
                raise_application_error(-20011,'Unknown Exception in PROCEDURE');
         END;

次のエラー: insert ステートメントにコンマが 1 つ多すぎます:

INSERT INTO t_xc_s_values (obj_id, at_id, VALUE,)

次のエラー: 1 つEND多すぎます

    END LOOP;
    END;  -- this will END your procedure block
    END BAS_NUM_UPDN; -- this will complain it has to match the procedure begin

PLSQLコードも不要です。ロジックを SQL ステートメントとして記述して、パフォーマンスを向上させることができます。

PROCEDURE BAS_NUM_UPDN AS 
IS
   l_b_num_attr_id  number(10) := get_attribute_id('Ba Nu');
BEGIN
   INSERT INTO t_xc_s_values (obj_id, at_id, VALUE)
   SELECT DISTINCT o.obj_id,
                   l_b_num_attr_id,
                   LTRIM(substr(convert_171_to_711(cp.T_C_CP),1,7),'0') bas_n
     FROM t_obj o, mat_tea_rel mpr, coorg_tea cp
    WHERE o.obj_type = 'Resin'
      AND o.obj_id = mpr.obj_id
      AND mpr.p_k_id = cp.p_k_id;
      AND NOT EXISTS (SELECT flag
                        FROM t_xc_s_values
                       WHERE attr_id = l_b_num_attr_id
                         AND Obj_id = o.obj_id
                         AND VALUE = LTRIM(substr(convert_171_to_711(cp.T_C_CP),1,7),'0'));           
END;
于 2012-07-27T10:00:05.933 に答える