程序属于什么?

时间:2018-01-15 15:59:21

标签: mysql postgresql stored-procedures

在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?

感谢。

1 个答案:

答案 0 :(得分:1)

您不会在INFORMATION_SCHEMA中查找例程,因为它属于那里,但是因为INFORMATION_SCHEMA的目的是显示当前数据库中所有项目的信息,而不管" schema& #34;

请注意,什么构成了"架构"数据库之间存在差异,但通常情况下,层次结构是"实例","服务器"或"集群"包含几个"数据库"和一个"数据库"包含几个"架构" (或"图式",如果你喜欢拉丁文复数)。

在SQL标准中指定了名为INFORMATION_SCHEMA的特殊模式,它自动存在于每个数据库中,并包含有关该数据库中所有信息的信息。这通常被实现为一组视图,其格式化特定于实现的系统目录"进入标准规定的格式。

在MySQL中,"数据库"的概念和"架构"大部分是组合在一起的,因此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]。