引用模块中定义的对象

可在模块内部或外部引用模块中定义的对象。能否引用模块中定义的对象还取决于模块中的这些对象是否已发布。

可通过由三个部分、两个部分或有时是一个部分组成的名称来引用模块对象。名称引用的解析是以确定性方式完成的,并且取决于名称引用及使用名称引用的上下文(在模块外部还是内部)。

  • 在模块内部:
    • 模块内定义的对象(已发布的和未发布的模块对象)可使用由三个部分、两个部分和一个部分组成的名称引用来引用。
  • 在模块外部:
    • 只有已发布模块对象才能通过使用由三个部分和两个部分组成的名称引用来引用。

解析由三个部分组成的名称引用的对象

由三个部分组成的名称引用是最明确的;它们的格式为 <SCHEMA-NAME>.<MODULE-NAME>.<OBJECT-NAME>。此类型的引用始终解析为唯一模块对象。

以下是模式 schema 中模块 mod 的定义:
CREATE MODULE schema.mod@

ALTER MODULE schema.mod 
  PUBLISH PROCEDURE proc1 (a integer) 
            BEGIN      
            END@

以下是使用由三个部分组成的名称引用来引用过程的 CALL 语句示例:

CALL schema.mod.proc1@ 
以下嵌入式示例显示使用由三个部分组成的名称来调用存储过程:
// Assume that the  server has following package and procedure defined
CREATE OR REPLACE PACKAGE MyPackage IS
  PROCEDURE MyProcedure(INOUT a INTEGER);
END;

CREATE OR REPLACE PACKAGE BODY MyPackage IS
  PROCEDURE MyProcedure(INOUT a INTEGER) IS
    a := a + 100;
  END;
END;

// Embedded SQL C program snippet
EXEC SQL  BEGIN DECLARE SECTION;
  sqlint32 inout_val;
EXEC SQL END DECLARE SECTION;                                        

EXEC SQL CALL MySchema.MyPackage.MyProcedure(:inout_val);

解析由两个部分组成的名称引用的对象

由两个部分组成的名称引用的格式为 <MODULE-NAME>.<OBJECT-NAME>。

由两个部分组成的名称引用格式可能会有歧义,因为由两个部分组成的名称(格式为 <SCHEMA-NAME>.<OBJECT-NAME>)可以引用非模块对象。第一个限定符可引用模式或模块。用于解析由两个部分组成的名称引用的确定性方法将按如下方式解析对象引用:
  • 如果引用的上下文在模块中,并且限定词的第一部分与模块名称相匹配,那么数据库管理器会搜索该对象,对该对象类型应用适当的解析以在已发布和未发布模块中查找匹配项。如果找不到匹配项,那么搜索会按下一个项目符号继续。
  • 然后会假定由两个部分组成的名称引用的第一个部分是模式名。如果具有该名称的模式存在,那么会在该模式内执行对象解析。
  • 如果由两个部分组成的名称引用的第一个部分不是现有模式,或者在与限定符相匹配的模式中找不到该对象,并且限定符与上下文模块名称不匹配,请在 SQL 路径上的模式中搜索与该限定符相匹配的第一个模块。如果已具有对匹配模块的权限,请解析至该模块中的对象(仅考虑已发布模块对象)。
  • 如果在 SQL 路径上找不到作为模块的限定符,并且该限定符与上下文模块名称不匹配,请检查与该限定符相匹配的模块公共同义词。如果找到该限定符,请解析模块公共同义词标识的模块中的对象(仅考虑已发布模块对象)。
以下 SQL 语句定义多个模块对象以及对模块对象的引用。注释指示每个由两个部分组成的对象名称引用将解析至的模块对象:
CREATE PROCEDURE S.proc1 (a integer) 
        BEGIN END@

CREATE MODULE schema.S@

ALTER MODULE schema.S 
  PUBLISH PROCEDURE proc1 (a integer) 
            BEGIN END@

CALL S.proc1(5)@ 								-- This reference resolves to procedure S.proc1()

ALTER MODULE schema.S 
  PUBLISH PROCEDURE proc2 (a integer) 
            BEGIN      
              CALL S.proc1(5)		-- This reference resolves to procedure schema.S.proc1()
            END@

CREATE MODULE schema.M@

ALTER MODULE schema.M 
  PUBLISH PROCEDURE proc1 (a integer) 
            BEGIN END@

CALL M.proc1(5)@ 				         -- This reference resolves to procedure schema.M.proc1()

解析由一个部分组成的名称引用的对象

由一个部分组成的名称引用只能用于该模块上下文中的模块对象。只有模块中的对象才能使用由一个部分组成的名称引用来引用另一个模块对象。

下面定义由一个部分组成的对象名称引用的确定性解析:
  • 如果引用的上下文在模块中,那么会在该模块中搜索属于匹配类型的对象。如果找不到由一个部分组成的名称引用的匹配项,那么会假定该对象不是模块对象,而是模式对象。将在 SQL 路径上搜索第一个其中具有适当类型的对象的模式。如果找不到这样的对象,那么名称引用解析失败。
  • 以下 SQL 语句定义对象、模块和模块对象,注释指示:
CREATE PROCEDURE S.proc1 (a integer) 
         BEGIN      
         END@

CREATE MODULE schema.S@

ALTER MODULE schema.S 
  PUBLISH PROCEDURE proc1 (a integer) 
    BEGIN      
    END@

CALL proc1(5)@ 				-- will resolve to S.proc1()

ALTER MODULE schema.S 
  PUBLISH PROCEDURE proc2 (a integer) 
            BEGIN      
              CALL proc1(5)			-- will resolve to schema.S.proc1()
            END@

CREATE MODULE schema.M@

ALTER MODULE schema.M 
  PUBLISH PROCEDURE proc1 (a integer) 
            BEGIN      
              CALL proc1(5)			-- will resolve to S.proc1()
                                  -- (since no proc1() in module M)
            END@