【发布时间】:2011-08-08 22:52:05
【问题描述】:
我在网上搜索了一个post,它使用以下sn-p来检查是否存在存储过程:
select *
from USER_SOURCE
where type='PROCEDURE'
and name='my_stored_procedure.'
有没有其他方法可以检查一个过程是否存在?
编辑添加:
在发布SQL Server方式之前,请先寻找ORACLE方式。
【问题讨论】:
我在网上搜索了一个post,它使用以下sn-p来检查是否存在存储过程:
select *
from USER_SOURCE
where type='PROCEDURE'
and name='my_stored_procedure.'
有没有其他方法可以检查一个过程是否存在?
编辑添加:
在发布SQL Server方式之前,请先寻找ORACLE方式。
【问题讨论】:
替代方案:
USER_PROCEDURES:
SELECT *
FROM USER_PROCEDURES
WHERE object_name = 'MY_STORED_PROCEDURE'
USER_OBJECTS:
SELECT *
FROM USER_OBJECTS
WHERE object_type = 'PROCEDURE'
AND object_name = 'MY_STORED_PROCEDURE'
【讨论】:
ALL_OBJECTS、DBA_OBJECTS(如果您有该权限)。 _PROCEDURES 也一样。
USER_OBJECTS和ALL_OBJECTS中是listet,但在USER_PROCEDURES和ALL_PROCEDURES中没有列出。
对我有用的东西!
SELECT text
FROM all_source
WHERE name = 'MY_SP_NAME'
ORDER BY line;
您也可以尝试像这样调用 SP:
CALL MY_SP_NAME();
你可能会出现这样的错误,但这证实你已经在那里定义了 SP:
OCI Statement Execution failure.ORA-06553: PLS-306: wrong number or types of arguments in call to 'MY_SP_NAME'
【讨论】:
查看数据库中是否存在过程的唯一方法是查询DBA_OBJECTS。这里的缺点是只有 dba 才能访问此视图。第二好的是使用 all_objects。 ALL_OBJECTS 向您显示您拥有某种特权的对象。 USER_OBJECTS 只显示你自己的对象。
【讨论】:
在 SQL*PLUS、ODBC 测试中执行下面的查询,...
SELECT text FROM all_source WHERE name='MY_PROCEDURE' ORDER BY line
其中 MY_PROCEDURE 是存储过程名称。
以下是示例输出:
获取所有数据:
“文本”
“程序 Usp_Get_Blob
"(
"P_DOC_ID INT,
"P_DOC_TEXT OUT BLOB)
“作为
“开始
" 选择 B1
进入 p_doc_text
" 来自 blobtest
" 其中 ID = p_doc_id;
“结束;”
【讨论】:
我无法使用上述任何方法找到存储过程。
原因:存储过程在包内。 Oracle 使用包将多个存储过程收集到一个模块中。
【讨论】:
选择 * 来自 USER_SOURCE 其中 type='PROCEDURE' 和 name='my_stored_procedure。'
【讨论】: