Oracle:不期望存储过程中的Begin语句?

时间:2012-08-24 15:12:18

标签: 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

任何人都可以帮忙吗? 干杯

1 个答案:

答案 0 :(得分: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,甚至不等于NULL。您需要使用IS NULL运算符。
  2. Oracle没有LEFT功能。您可能需要SUBSTR
  3. SET不是有效的PL / SQL运算符。您可以使用:=运算符将表达式的结果分配给变量。您可以使用SELECT ... INTO将SQL查询的结果分配给本地变量。
  4. 剩下的问题

    1. 您似乎使用相同的本地变量v_Node来分配您要搜索的Node字符串,并保留您选择的大概数字v_NodeId,这似乎很奇怪从表中。如果这确实是你的意图,你会想要单独的变量。
    2. 您编写的SELECT语句没有意义。如果v_NodeId是局部变量,正如命名约定所暗示的那样,从dbo.nodes表中选择它是没有意义的。您似乎更有可能选择NodeId(假设它是dbo.nodes中的列。)