【问题标题】:Oracle: Begin statement in stored procedure not expected?Oracle:不希望在存储过程中使用 Begin 语句?
【发布时间】:2012-08-24 23:22:36
【问题描述】:

我是 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

有人可以帮忙吗? 干杯

【问题讨论】:

    标签: oracle


    【解决方案1】:

    我怀疑你想要类似的东西

    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 语句没有意义。如果v_NodeId 是一个局部变量,正如命名约定所暗示的那样,从dbo.nodes 表中选择它是没有意义的。您似乎更有可能选择NodeId(假设这是dbo.nodes 中的一列)。

    【讨论】:

      猜你喜欢
      • 2011-04-29
      • 1970-01-01
      • 1970-01-01
      • 2019-01-24
      • 1970-01-01
      • 2014-03-04
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多