在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]。您的例程属于数据库test
,the 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/