在MySQL中,我在数据库test
下创建了一个包含表CUSTOMERS1
的过程:
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 ;
如果我想查找该过程,我必须这样做,就好像该过程属于表information_schema.routines
:
mysql> use information_schema;
Database changed
mysql> select * from routines where routine_name = "simpleproc";
如果我想调用该程序,我必须像程序那样进行
属于我创建过程的数据库test
:
mysql> call test.simpleproc(@a);
Query OK, 1 row affected (0.00 sec)
我对MySQL中的程序属于哪个,我在其下创建过程的数据库test
或表information_schema.routines
感到有点困惑?
PostgreSQL也是这样吗? (我想知道这个案例是否适用于MySQL,而不是标准SQL?PostgreSQL是标准SQL最忠实的实现。)
请注意,我之前询问过相关问题:Are all kinds of procedural code stored on server side, once created? How are they stored?
感谢。
答案 0 :(得分:1)
您不会在INFORMATION_SCHEMA
中查找例程,因为它属于那里,但是因为INFORMATION_SCHEMA
的目的是显示当前数据库中所有项目的信息,而不管" schema& #34;
请注意,什么构成了"架构"数据库之间存在差异,但通常情况下,层次结构是"实例","服务器"或"集群"包含几个"数据库"和一个"数据库"包含几个"架构" (或"图式",如果你喜欢拉丁文复数)。
在SQL标准中指定了名为INFORMATION_SCHEMA
的特殊模式,它自动存在于每个数据库中,并包含有关该数据库中所有信息的信息。这通常被实现为一组视图,其格式化特定于实现的系统目录"进入标准规定的格式。
在MySQL中,"数据库"的概念和"架构"大部分是组合在一起的,因此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]。