您好,我是小DAI,专注于数据库管理员相关的技术问答,请问有什么可以帮您?

::CURRENT_OBJECT_NAME and ::CURRENT_OBJECT_SCHEMA

要确定当前运行的过程或函数的名称,可以使用以下两个系统变量:

::CURRENT_OBJECT_NAME返回当前过程或函数的名称::CURRENT_OBJECT_SCHEMA返回当前过程或函数的模式的名称。 

两者都返回 NVARCHAR(256) 类型的字符串。

以下示例说明了系统变量的用法。

CREATE FUNCTION RETURN_NAME ()

RETURNS name nvarchar(256),

schema_name nvarchar(256)

AS

BEGIN

name = ::CURRENT_OBJECT_NAME;

schema_name = ::CURRENT_OBJECT_SCHEMA;

END;

例如,通过调用该函数。

SELECT RETURN_NAME().schema_name, RETURN_NAME().name from dummy

然后,该函数的结果是 函数的名称和 schema_name:

SCHEMA_NAME       NAME 

----------------------------------------

MY_SCHEMA RETURN_NAME

下一个示例显示,也可以将两个系统变量作为参数传递给过程或函数调用。

CREATE FUNCTION GET_FULL_QUALIFIED_NAME (schema_name nvarchar(256),name nvarchar(256))

RETURNS fullname nvarchar(256)

AS

BEGIN

fullname = schema_name || '.' || name ;

END;

CREATE PROCEDURE MAIN_PROC (IN INPUT_VALUE INTEGER)

AS

BEGIN

DECLARE full_qualified_name NVARCHAR(256);

DECLARE error_text NVARCHAR(256);

full_qualified_name = get_full_qualified_name (::CURRENT_OBJECT_SCHEMA,

::CURRENT_OBJECT_NAME);

IF :input_value > 1 OR :input_value < 0 THEN

SIGNAL SQL_ERROR_CODE 10000 SET MESSAGE_TEXT = 'ERROR IN '

|| :full_qualified_name || ': invalid input value ';

END IF;

END;

备注请注意,在匿名块中,两个系统变量的值均为 NULL

两个系统变量将始终返回模式名称,以及过程或函数的名称。在过程或函数之上创建同义词并使用同义词调用它仍会返回原始名称,如下一示例所示。

我们在上面的 RETURN_NAME 函数上创建同义词,并将使用同义词对其进行查询:

CREATE SYNONYM SYN_FOR_FUNCTION FOR RETURN_NAME;

SELECT SYNONYM_FOR_FUNCTION().schema_name, SYNONYM_FOR_FUNCTION().name FROM dummy;

结果如下:

SCHEMA_NAME NAME

MY_SCHEMA RETURN_NAME