一个过程属于什么?

qacovj5a  于 2021-06-24  发布在  Mysql
关注(0)|答案(1)|浏览(246)

在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最忠实的实现。)
请注意,我之前问过一个相关的问题:一旦创建,是否所有类型的过程代码都存储在服务器端?它们是如何储存的?
谢谢。

ndh0cuux

ndh0cuux1#

你不去查 INFORMATION_SCHEMA 因为它属于那里,但是因为 INFORMATION_SCHEMA 是显示有关当前数据库中所有项的信息,而不考虑“模式”。
请注意,对“模式”的解释因数据库而异,但一般来说,层次结构是“示例”、“服务器”或“集群”包含多个“数据库”,“数据库”包含多个“模式”(或者“模式”,如果您喜欢拉丁文复数形式)。
称为 INFORMATION_SCHEMA 在sql标准中指定,自动存在于每个数据库中,并包含有关该数据库中所有信息的信息。这通常作为一组视图来实现,这些视图将特定于实现的“系统目录”格式化为标准指定的格式。
在mysql中,“数据库”和“模式”的概念在很大程度上是结合在一起的,所以 INFORMATION_SCHEMA 显示为数据库,包含示例上所有其他数据库的信息[参考文献]。你的程序属于数据库 test ,和 INFORMATION_SCHEMA.ROUTINES 表格将在 ROUTINE_SCHEMA 列。
您可以访问中的任何视图 INFORMATION_SCHEMA 而不是通过限定其名称来切换数据库。要将对象仅过滤到当前数据库,可以使用 database() 函数,该函数返回当前数据库名称。例如:

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

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

相关问题