什么是oracle中的<< some text >>

Nis*_*sar 3 sql oracle plsql

我在阅读pl sql的一些博客时发现了这个角色<< some text >>.

我在以下博客http://www.oracle-base.com/articles/8i/collections-8i.php中找到了这个角色

Bob*_*ica 6

正如其他人所说,<<some_text>>是一个名为"some_text"的标签.标签通常不用于PL/SQL,但可以在各种环境中使用.

例如,假设您有几个嵌套循环,执行已达到最内层,代码需要从所有嵌套循环退出并在最外层循环之后继续.这里的标签可以按以下方式使用:

<<outer_most_loop>>
LOOP
  ...
  <<next_inner_loop>>
  LOOP
    ...
    <<inner_most_loop>>
    LOOP
      ...
      IF something <> something_else THEN
        EXIT outer_most_loop;
      END IF;
      ...
    END LOOP inner_most_loop;
    ...
  END LOOP next_inner_loop;
  ...
END LOOP outer_most_loop;

-- Execution continues here after EXIT outer_most_loop;

something := something_else;
...
Run Code Online (Sandbox Code Playgroud)

接下来,假设您已经有一些嵌套块的代码,每个嵌套块都声明了一个同名的变量,因此您需要指示编译器您打算使用哪个相同名称的变量.在这种情况下,您可以使用这样的标签:

<<outer>>
DECLARE
  nNumber  NUMBER := 1;
BEGIN
  <<inner>>
  DECLARE
    nNumber  NUMBER := 2;
  BEGIN
    DBMS_OUTPUT.PUT_LINE('outer.nNumber=' || outer.nNumber);
    DBMS_OUTPUT.PUT_LINE('inner.nNumber=' || inner.nNumber);
  END inner;
END outer;
Run Code Online (Sandbox Code Playgroud)

如果您坚持要求变量与表中的列具有相同的名称,则标签也很有用.例如,假设您有一个名为PEOPLE的表,其中包含一个名为LASTNAME的非可空列,并且您希望删除LASTNAME ='JARVIS'的所有人.以下代码:

DECLARE
  lastname VARCHAR2(100) := 'JARVIS';
BEGIN
  DELETE FROM PEOPLE
    WHERE LASTNAME = lastname;
END;
Run Code Online (Sandbox Code Playgroud)

不会做你想要的 - 相反,它会删除PEOPLE表中的每一行.发生这种情况是因为在名称可能不明确的情况下,PL/SQL将选择使用表中的列而不是局部变量或参数 ; 因此,以上解释为

DECLARE
  lastname VARCHAR2(100) := 'JARVIS';
BEGIN
  DELETE FROM PEOPLE p
    WHERE p.LASTNAME = p.lastname;
END;
Run Code Online (Sandbox Code Playgroud)

和繁荣!表中的每一行都是再见.:-)标签可用于限定变量名称,如下所示:

<<outer>>
DECLARE
  lastname VARCHAR2(100) := 'JARVIS';
BEGIN
  DELETE FROM PEOPLE p
    WHERE p.LASTNAME = outer.lastname;
END;
Run Code Online (Sandbox Code Playgroud)

执行此操作,只有LASTNAME ='JARVIS'的人才会消失.

是的 - 正如别人所说,你可以GOTO贴上标签:

FUNCTION SOME_FUNC RETURN NUMBER
IS
  SOMETHING       NUMBER := 1;
  SOMETHING_ELSE  NUMBER := 42;
BEGIN
  IF SOMETHING <> SOMETHING_ELSE THEN
    GOTO HECK;
  END IF;

  RETURN 0;

  <<HECK>>

  RETURN -1;
END;
Run Code Online (Sandbox Code Playgroud)

(Ewwwww!Code就是这么错...... ..)

分享和享受.


Pat*_*man 5

它通常用于标记循环,游标等。

您可以在goto语句中使用该标签。否则,这只是“评论”。

来自Oracle的示例:

DECLARE
  p        VARCHAR2(30);
  n        PLS_INTEGER := 37; -- test any integer > 2 for prime
BEGIN
  FOR j in 2..ROUND(SQRT(n)) LOOP
    IF n MOD j = 0 THEN -- test for prime
      p := ' is not a prime number'; -- not a prime number
      GOTO print_now; -- << here is the GOTO
    END IF;
  END LOOP;
  p := ' is a prime number';
<<print_now>> -- << and it executes this
  DBMS_OUTPUT.PUT_LINE(TO_CHAR(n) || p);
END;
/
Run Code Online (Sandbox Code Playgroud)

  • “否则,这只是'评论'。”标签不是评论。是的,人们可能会以一种或另一种方式将其用作一种标记,但是这并不适用。标签是PL / SQL范围和可见性标识符,也是执行无条件分支的手段(如您所演示的)。 (2认同)