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,甚至没有其他价值NULL。您需要使用IS NULL运算符。
  2. Oracle 没有LEFT函数。你可能想要SUBSTR.
  3. SET不是有效的 PL/SQL 运算符。您可以使用:=运算符将​​表达式的结果分配给变量。您可以使用SELECT ... INTO将 SQL 查询的结果分配给局部变量。

剩下的问题

  1. 您似乎使用相同的局部变量v_Node来分配Node要搜索的字符串并保存v_NodeId您从表中选择的大概数字,这似乎很奇怪。如果这确实是您的意图,您将需要单独的变量。
  2. 你写的SELECT声明没有意义。If是一个局部变量,正如命名约定所暗示的那样,从表v_NodeId中选择它是没有意义的。dbo.nodes您似乎更有可能选择NodeId(假设它是 中的一列dbo.nodes)。
于 2012-08-24T15:22:36.390 回答