0

私はOracleを初めて使用するので、これについてはご容赦ください。できる限りのことをします。

私はストアドプロシージャを書いています。ステートメントが完了するASと、次のコードが得られます。

BEGIN
IF v_Node = NULL
    BEGIN
      SET v_Node = LEFT(v_Tag, INSTR('.', v_Tag)-1)
      SET v_Node = (SELECT v_NodeId FROM DBO.nodes WHERE Node = v_Node)
    END

私がコンパイルすると、次のエラーが吐き出されます。

Error(23,5): PLS-00103: Encountered the symbol "BEGIN" when expecting one of the following: * & - + / at mod remainder rem then <an exponent (**)> and or || multiset

誰でもこれを手伝ってもらえますか?乾杯

4

1 に答える 1

2

あなたは次のようなものが欲しいと思います

CREATE OR REPLACE PROCEDURE <<procedure name>>( <<parameter list>> )
AS
  <<variable declarations>>
BEGIN
  IF v_Node IS NULL
  THEN
    v_Node := substr( v_tag, 1, instr( '.', v_tag ) - 1 );
    SELECT v_NodeId -- Is v_NodeID really a column in dbo.nodes?  The naming 
                    -- convention would imply that it is a local variable in 
                    -- which case the SELECT statement doesn't make a lot of 
                    -- sense.
      INTO v_node
      FROM dbo.nodes
     WHERE node = v_node;
  END IF;

  <<more code>>
END;

説明

  1. NULLに等しい値はなく、別の にも等しくありませんNULLIS NULL演算子を使用する必要があります。
  2. Oracleには機能がありませんLEFT。あなたはおそらくしたいですSUBSTR
  3. SETは有効な PL/SQL 演算子ではありません。演算子を使用して:=、式の結果を変数に割り当てることができます。SELECT ... INTOまた、SQL クエリの結果をローカル変数に代入するために使用できます。

残りの問題

  1. v_Node検索する文字列を割り当てるためと、テーブルから選択しNodeたと思われる数値を保持するために、同じローカル変数を使用しているように見えるのは奇妙に思えます。v_NodeIdそれが本当にあなたの意図である場合は、別の変数が必要になります。
  2. あなたが書いたSELECT声明は意味がありません。がローカル変数である場合、命名規則が示すように、テーブルv_NodeIdから選択しても意味がありません。( が の列であると仮定して)dbo.nodesを選択する可能性が高くなります。NodeIddbo.nodes
于 2012-08-24T15:22:36.390 に答える