我在阅读pl sql的一些博客时发现了这个角色<< some text >>.
我在以下博客http://www.oracle-base.com/articles/8i/collections-8i.php中找到了这个角色
正如其他人所说,<<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就是这么错...... ..)
分享和享受.
它通常用于标记循环,游标等。
您可以在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)