在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最忠实的实现。)
请注意,我之前问过一个相关的问题:一旦创建,是否所有类型的过程代码都存储在服务器端?它们是如何储存的?
谢谢。
1条答案
按热度按时间ndh0cuux1#
你不去查
INFORMATION_SCHEMA
因为它属于那里,但是因为INFORMATION_SCHEMA
是显示有关当前数据库中所有项的信息,而不考虑“模式”。请注意,对“模式”的解释因数据库而异,但一般来说,层次结构是“示例”、“服务器”或“集群”包含多个“数据库”,“数据库”包含多个“模式”(或者“模式”,如果您喜欢拉丁文复数形式)。
称为
INFORMATION_SCHEMA
在sql标准中指定,自动存在于每个数据库中,并包含有关该数据库中所有信息的信息。这通常作为一组视图来实现,这些视图将特定于实现的“系统目录”格式化为标准指定的格式。在mysql中,“数据库”和“模式”的概念在很大程度上是结合在一起的,所以
INFORMATION_SCHEMA
显示为数据库,包含示例上所有其他数据库的信息[参考文献]。你的程序属于数据库test
,和INFORMATION_SCHEMA.ROUTINES
表格将在ROUTINE_SCHEMA
列。您可以访问中的任何视图
INFORMATION_SCHEMA
而不是通过限定其名称来切换数据库。要将对象仅过滤到当前数据库,可以使用database()
函数,该函数返回当前数据库名称。例如:在postgresql中,集群上的数据库之间没有通信,每个对象都属于特定数据库中的特定模式。
INFORMATION_SCHEMA
是自动存在于所有数据库中的架构,并显示该数据库中的所有对象[参考文献]。