为提高效率,提问时请提供以下信息,问题描述清晰可优先响应。
【DM版本】:DM8
【操作系统】:WIN11
【CPU】:
【问题描述】*:
我们通过create or replace procedure xx方式创建的函数过程,可以通过 user_procedures中查找,不过,是使用 object_name='xx'方式查找,不是使用 procedure_name like 'xx'查找.
比如:
SQL> set schema sch_factory;
操作已执行
已用时间: 0.582(毫秒). 执行号:0.
SQL>
SQL>
SQL> CREATE OR REPLACE PROCEDURE P_TEST ()
2 IS
3 BEGIN
4 NULL;
5 END;
6 /
操作已执行
已用时间: 13.329(毫秒). 执行号:34302.
SQL> select object_Name,procedure_name,object_id,OBJECT_TYPE
2 from user_PROCEDURES
3 where object_name='P_TEST';
行号 OBJECT_NAME PROCEDURE_NAME OBJECT_ID OBJECT_TYPE
1 P_TEST NULL 83887123 PROCEDURE
已用时间: 3.499(毫秒). 执行号:34305.
你看上面的 PROCEDURE_NAME 为null,反而是 OBJECT_NAME 为这个名字。
我后面查看了一下 user_procedures,发现视图定义predure_name 就为 null,为什么这样设计呢?
SELECT
O.NAME AS "OBJECT_NAME",
NULL AS "PROCEDURE_NAME",
O.ID AS "OBJECT_ID",
1 AS "SUBPROGRAM_ID",
NULL AS "OVERLOAD",
(
CASE O.INFO1 & 0x01
WHEN 1 THEN
'PROCEDURE'
WHEN 0 THEN
'FUNCTION'
ELSE
'UNKNOWN'
END) AS "OBJECT_TYPE",
(
CASE O.INFO2
WHEN 65 THEN
'YES'
ELSE
'NO'
END) AS "AGGREGATE",
(
CASE O.INFO1 & 0x10
WHEN 0 THEN
'NO'
ELSE
'YES'
END) AS "PIPELINED",
CLS_SCH.NAME AS "IMPLTYPEOWNER",
CLS_O.NAME AS "IMPLTYPENAME",
'YES' AS "PARALLEL",
'NO' AS "INTERFACE",
(
CASE O.INFO1 & 0x40
WHEN 0 THEN
'NO'
ELSE
'YES'
END) AS "DETERMINISTIC",
(
CASE O.INFO1 & 0x20
WHEN 0 THEN
'DEFINER'
ELSE
'CURRENT_USER'
END) AS "AUTHID"
FROM
TSYSOBJECTS AS O
LEFT JOIN TSYSOBJECTS AS CLS_O ON CLS_O.ID = CAST(O.INFO3 AS INT)
LEFT JOIN TSYSOBJECTS AS CLS_SCH ON CLS_O.SCHID = CLS_SCH.ID
WHERE
(O."TYPE$" = 'SCHOBJ'
AND O."SUBTYPE$" = 'PROC'
AND O.PID = SYS_CONTEXT('USERENV', 'CURRENT_USERID'))
UNION ALL
SELECT
O_PKG.NAME AS "OBJECT_NAME",
I.NAME AS "PROCEDURE_NAME",
I.PKGID AS "OBJECT_ID",
I.MTDID + 1 AS "SUBPROGRAM_ID",
OVERLOAD,
'PACKAGE' AS "OBJECT_TYPE",
AGGREGATE,
PIPELINED,
IMPLTYPEOWNER,
IMPLTYPENAME,
PARALLEL,
INTERFACE,
DETERMINISTIC,
(
CASE O_PKG.INFO1 & 0x20
WHEN 0 THEN
'DEFINER'
ELSE
'CURRENT_USER'
END) AS "AUTHID"
FROM
SYS.SYSPKGPROCINFOS AS I,
TSYSOBJECTS AS O_PKG,
TSYSOBJECTS AS O_SCH
WHERE
(I.PKGID = O_PKG.ID
AND O_SCH.ID = O_PKG.SCHID
AND SYS_CONTEXT('USERENV', 'CURRENT_USERID') = O_SCH.PID);
视图的OBJECT_NAME
为对象名称,即存储过程或者包等名称,PROCEDURE_NAME
为包内的过程名称。
因此,按您的方式创建过程,在DBA/USER_PROCEDURES
视图应该查OBJECT_NAME
,如果是包内过程则查PROCEDURE_NAME
以下是系统自带的包过程信息截取,PROCEDURE_NAME
并非都是null
OWNER OBJECT_NAME PROCEDURE_NAME
----- ----------- ------------------------
SYS UTL_RAW CAST_TO_INT
SYS UTL_RAW CAST_FROM_INT
SYS UTL_RAW CAST_TO_BINARY_INTEGER
SYS UTL_RAW CAST_FROM_BINARY_INTEGER
是由于元数据管理机制对独立存储过程与包内过程的区分。