INFORMATION_SCHEMA.ROUTINES
包含以下两列:
SPECIFIC_SCHEMA: Specific name of the schema.
ROUTINE_SCHEMA: Name of the schema that contains this function.
SPECIFIC_
和ROUTINE_
版本的CATALOG
和NAME
被定义为等效的(目录的特定名称。此名称与{{ 1}} .-),但SCHEMA-
ROUTINE_CATALOG
和SPECIFIC_SCHEMA
之间的区别是什么?
[编辑:显然3年多以后,这被标记为重复,所以我必须澄清。建议的副本是关于不同的字段,所以不,我不相信它是重复的。]
答案 0 :(得分:3)
这有点像向后兼容性。
INFORMATION_SCHEMA
本身仅用于更轻松地迁移服务器版本和简化。我将提供基于SQL Server的示例。
您可能希望(或可能需要)使用表sys.objects
,该表基本上提供INFORMATION_SCHEMA.ROUTINES
提供的几乎所有相同信息。事实上,如果你真的想知道一个程序的真实模式名称,你需要使用它 - 正如微软已经在他们自己的docs中说明的那样。但是如果你需要构建一个只需要一些基本信息的产品,比如一个例程是否存在或类似的东西,你就不会去sys.objects
它可能会从服务器版本变为服务器版本。这使得维护更加困难。 INFORMATION_SCHEMA
在许多版本中基本保持不变。只会进行少量更改,并且视图下方的工作将由Microsoft更改。这意味着您可以使用多年的稳定代码和许多不同的服务器版本。
这可能是因为有两列具有相同的定义,因此内容相同。它与SPECIFIC_NAME
和ROUTINE_NAME
或SPECIFIC_CATALOG
和ROUTINE_CATALOG
相同。它们基本上是相同的,正如微软在他们的文档中所说的那样。
它可能是一个遗留物,可能永远存在,只是为了兼容其他DBMS代码或旧版本的SQL Server本身。
顺便说一句,Postgres有两行,它们都包含相同的内容。
答案 1 :(得分:0)
这是为了重载。这个问题与this question here重复。
基本上,您可以在SQL规范中仅在一个模式中重载函数。
让我们以ST_Union
为例,您可以看到签名here和here
SELECT specific_catalog, specific_schema, specific_name, routine_catalog, routine_schema, routine_name
FROM information_schema.routines
WHERE routine_name = 'st_union';
specific_catalog | specific_schema | specific_name | routine_catalog | routine_schema | routine_name
------------------+-----------------+-----------------+-----------------+----------------+--------------
test | public | st_union_259584 | test | public | st_union
test | public | st_union_259621 | test | public | st_union
test | public | st_union_259622 | test | public | st_union
test | public | st_union_260448 | test | public | st_union
test | public | st_union_260450 | test | public | st_union
test | public | st_union_260452 | test | public | st_union
test | public | st_union_260454 | test | public | st_union
test | public | st_union_260456 | test | public | st_union
(8 rows)
您可以在此处看到st_union
超载8次。您无法看到的原因是:其中一些是聚合,其中一些是rasters
,另一些是geometry
。重点是,你打电话给st_union
取决于你所说的内容,你可能会st_union_260454
或st_union_259621
或其他任何人。
Catch是,SQL允许您根据您调用它的模式获得不同的。
SELECT current_schema;
返回public
。那是我search_path
中的第一个架构。我可以创建一个提供第9个ST_Union
的子,但只能在模式foobar
内工作。这样做会提供routine_name st_union
的第9次重载。这会使上面的回报像这样......
SELECT specific_catalog, specific_schema, specific_name, routine_catalog, routine_schema, routine_name
FROM information_schema.routines
WHERE routine_name = 'st_union';
specific_catalog | specific_schema | specific_name | routine_catalog | routine_schema | routine_name
------------------+-----------------+-----------------+-----------------+----------------+--------------
test | public | st_union_259584 | test | public | st_union
test | public | st_union_259621 | test | public | st_union
test | public | st_union_259622 | test | public | st_union
test | public | st_union_260448 | test | public | st_union
test | public | st_union_260450 | test | public | st_union
test | public | st_union_260452 | test | public | st_union
test | public | st_union_260454 | test | public | st_union
test | public | st_union_270456 | test | foobar | st_union
(9 rows)
search_path
只是foobar
,则签名更符合st_union_270456
search_path
为foobar,public
,则foobar
覆盖public
中的例程或提供例程public
未提供。{/ li>
CURRENT_SCHEMA
只是PostgreSQL search_path
中的第一个模式。 PostgreSQL通过允许您在多个模式中解决问题来扩展规范。