SQL(Oracle)中的感叹号是什么意思?

11

查看我的数据库中的V$SQL,我刚刚发现了一个看起来很奇怪的查询:

UPDATE "MYTABLE" "A1" SET "SOMECOLUMN" = (
    SELECT "A2"."ANOTHERCOLUMN" 
    FROM "ANOTHERTABLE"@! "A2" 
    WHERE "A2".ROWID=:B1
)

有人知道 @! 语法的含义吗?我以前在 Oracle 中从未见过这样的东西。谢谢。


当查询V$sql时,我在Oracle 9i上看到了这个序列"@!"。通常情况下,它出现在语句的末尾。我认为这是某种错误。 - ibre5041
嗯,我猜如果它相当于一个换行符,那么就不会有任何问题。我的猜测是,在“ANOTHERTABEL”后面加上一个换行符的查询被翻译为“ANOTHERTABEL”@! - dbza
相关:https://dev59.com/42bWa4cB1Zd3GeqPYJEK - isalgueiro
2个回答

3
这是一个关于IT技术的查询,源自一个远程数据库。你在V$SQL中看到了这个查询所在的数据库是通过@DB_NAME语法引用远程数据库中的查询。
远程数据库向你的数据库推送查询以供执行,但要回答查询,你的数据库需要从远程数据库中取回一些信息。这就是@!的作用,它实际上是一个对查询来源数据库的引用。
例如,创建一个测试数据库链接,即使链接到同一个数据库,然后运行此命令:
alter system flush shared_pool;
select sysdate from dual@myself;
select sql_text from gv$sql where sql_fulltext like '%@!%';

SQL_TEXT
--------
SELECT SYSDATE@! FROM "DUAL" "A1"

那听起来很有趣。你有相关的参考资料吗? - user330315
@a_horse_with_no_name 我添加了一个简单的例子。奇怪的是,我找不到任何关于这种行为的参考资料。即使我可以访问许多数据库链接,但在我可以访问的300个数据库中,我也找不到任何真实世界的例子。 - Jon Heller
1
这在asktom的一篇文章中提到,位于底部附近https://asktom.oracle.com/pls/apex/f?p=100:11:0::::P11_QUESTION_ID:633023740029 ,但正如Tom所提到的,它是未记录和不支持的(如果不是由Oracle自己使用)。此外,他没有描述它被用作我上面描述的方式 - 我从同事那里听到上面的解释是一个轶事,因此根据asktom文章所说可能是错误的。我会做更多的研究。 - James

-1

在数据库中,@符号通常与数据库链接相关。例如,在Oracle中,我使用以下命令创建公共数据库链接:

create public database link mylink connect to remote_username identified by mypassword using 'tns_service_name';

如果用户(remote_username)在此之后有一个名为ANOTHERTABLE的表,则可以使用以下命令:

SELECT "A2"."ANOTHERCOLUMN" FROM "ANOTHERTABLE"@mylink "A2" WHERE "A2".ROWID=1

对于我来说,感叹号的用法不太清楚。通常情况下,感叹号是用来访问运行数据库客户端的shell。

希望这能帮到你。祝你好运!


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接