在MySQL中,我在包含表的数据库test下创建一个过程:

mysql> use test;

mysql> delimiter //;

mysql> CREATE PROCEDURE simpleproc (OUT param1 INT)
    -> BEGIN
    ->   SELECT COUNT(*) INTO param1 FROM CUSTOMERS1;
    -> END//
Query OK, 0 rows affected (0.00 sec)

mysql> delimiter ;

如果我想查找该过程,我必须将其视为属于表CUSTOMERS1
mysql> use information_schema;
Database changed

mysql> select * from routines where routine_name = "simpleproc";

如果我想调用过程,我必须像调用过程一样
属于我在其中创建过程的数据库:
mysql> call test.simpleproc(@a);
Query OK, 1 row affected (0.00 sec)

我对MySQL中的过程属于哪一个、创建该过程的数据库information_schema.routines或表test有点困惑?
在PostgreSQL中也是这样吗?(我想知道这个案例是否只针对MySQL,而不是标准SQL?PostgreSQL是标准SQL最可靠的实现。)
注意,我以前问过一个相关的问题:Are all kinds of procedural code stored on server side, once created? How are they stored?
谢谢。

最佳答案

您不会在INFORMATION_SCHEMA中查找该例程,因为它属于该例程,而是因为INFORMATION_SCHEMA的目的是显示当前数据库中所有项的信息,而不考虑“schema”。
请注意,对什么构成“模式”的解释因数据库而异,但通常,层次结构是“实例”、“服务器”或“群集”包含多个“数据库”,而“数据库”包含多个“模式”(如果您喜欢拉丁复数,则为“模式”)。
在SQL标准中指定了名为INFORMATION_SCHEMA的特殊模式,它自动存在于每个数据库中,并包含该数据库中所有信息的信息。这通常是作为一组视图实现的,这些视图将特定于实现的“系统目录”格式化为标准指定的格式。
在MySQL中,“database”和“schema”的概念在很大程度上结合在一起,因此INFORMATION_SCHEMA作为一个数据库出现,其中包含实例上所有其他数据库的信息。[Reference]。您的例程属于数据库testthe INFORMATION_SCHEMA.ROUTINES table将在ROUTINE_SCHEMA列中显示。
您可以访问INFORMATION_SCHEMA中的任何视图,而无需通过限定其名称来切换数据库。要将对象筛选到当前数据库,可以使用返回当前数据库名称的the database() function。例如:

SELECT *
FROM INFORMATION_SCHEMA.ROUTINES
WHERE ROUTINE_SCHEMA = DATABASE()
ORDER BY ROUTINE_NAME;

在PostgreSQL中,集群上的数据库之间没有通信,每个对象都属于特定数据库中的特定模式。INFORMATION_SCHEMA是自动出现在所有数据库中的架构,并显示该数据库中的所有对象。[Reference]。

关于mysql - 程序属于什么?,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/48266528/

10-10 13:47