0
DECLARE
PROCEDURE create_rule(
      p_rule_type_key   IN VARCHAR2,
      p_key             IN VARCHAR2,
      p_activation      IN DATE,
      p_termination     IN DATE,
      p_description     IN VARCHAR2
    )
IS
   CURSOR cur_rules (pc_rule_type_key IN VARCHAR2, pc_key IN VARCHAR2)
   IS
      SELECT rule_type_key
      FROM ino_offers.rules
      WHERE rule_type_key = pc_rule_type_key
      AND key             = pc_key;
BEGIN
   OPEN cur_rules (p_rule_type_key, p_key);
   p_description2     IN VARCHAR2;
   FETCH cur_rules INTO p_description2;
   IF (cur_rules%NOTFOUND) THEN
      INSERT
      INTO rules
         (
            RULE_TYPE_KEY,
            KEY,
            ACTIVATION,
            TERMINATION,
            DESCRIPTION,
            CHANGED
         )
         VALUES
         (
            p_rule_type_key,
            p_key,
            p_activation,
            p_termination,
            p_description,
            SYSDATE
         );
   END IF;
   CLOSE cur_rules;
END;
BEGIN
   create_rule(?, ?, ?, ?, ?);
END;

しかし、私は得る:

PLS-00103: Encountered the symbol "IN" when expecting one of the following:

   := . ( @ % ;
The symbol ":= was inserted before "IN" to continue.

問題はここにあります:

OPEN cur_rules (p_rule_type_key, p_key);
       p_description2     IN VARCHAR2;

正しい方法は何ですか?

4

2 に答える 2

1

こんにちは、開始後に p_description2 IN VARCHAR2 を宣言しました。以下のエラーが発生しました。カーソル レコードを p_description2 変数にフェッチしたため、cur_rules タイプである必要があります。この p_description2 cur_rules%ROWTYPE のように使用してみてください。

DECLARE
PROCEDURE create_rule(
      p_rule_type_key   IN VARCHAR2,
      p_key             IN VARCHAR2,
      p_activation      IN DATE,
      p_termination     IN DATE,
      p_description     IN VARCHAR2
    )
IS
   CURSOR cur_rules (pc_rule_type_key IN VARCHAR2, pc_key IN VARCHAR2)
   IS
      SELECT rule_type_key
      FROM ino_offers.rules
      WHERE rule_type_key = pc_rule_type_key
      AND key             = pc_key;
 p_description2 cur_rules%ROWTYPE;
BEGIN
   OPEN cur_rules (p_rule_type_key, p_key);
   FETCH cur_rules INTO p_description2;
   IF (cur_rules%NOTFOUND) THEN
      INSERT
      INTO rules
         (
            RULE_TYPE_KEY,
            KEY,
            ACTIVATION,
            TERMINATION,
            DESCRIPTION,
            CHANGED
         )
         VALUES
         (
            p_rule_type_key,
            p_key,
            p_activation,
            p_termination,
            p_description,
            SYSDATE
         );
   END IF;
   CLOSE cur_rules;
END;
BEGIN
   create_rule(?, ?, ?, ?, ?);
END;
于 2013-02-12T04:06:02.760 に答える
0
 p_description2     IN VARCHAR2;

その行で正確に何をしたいですか?variable を宣言したい場合は、 .の直前p_description2の part 内で行う必要があります。宣言するときは、を使用せずに を使用してください。これが pl/sql が強力な理由です。DECLAREBEGINVARCHAR2CUR_RULES%ROWTYPE

于 2013-02-11T16:15:35.263 に答える