Oracle中与SQL Server的SET NOEXEC或NOPARSE相当的是什么?

3

我有一个SQL脚本,根据某些条件更新db过程或更改表。如果在运行时过程或表不存在,则脚本也应该能够工作(在这种情况下不应更新任何内容)。

在MSSQL中,我可以通过NOEXEC实现这一点,如下所示:

IF NOT EXISTS (select * from sysobjects where name ='MY_PROC1')
  SET NOEXEC ON
GO 
--the following code will not be executed in the server 
ALTER PROCEDURE [MY_PROC1]
(
    code that alter the procedure
)
GO

SET NOEXEC OFF
GO

在Oracle中是否有类似于NOEXEC的等效命令?或者是否有一种优雅的方式来编写类似的脚本,但是不使用“动态SQL”?我不想用引号包装代码。


1
不,据我所知这是不可能的。最接近的方法可能是使用 dbms_sql.parse(),但您会讨厌它,因为您需要使用动态SQL和游标。但是它实际上也不适用于DDL语句(例如您的 alter procedure 语句),因为它将执行该语句,这与您想要的相反。 - sstan
1
可能是动态SQL-检查语法和语义的重复。 - sstan
3个回答

1
感谢大家的评论。 不幸的是,Oracle没有相当于MsSql NOEXEC的命令 :( 建议使用dbms_sql.parse()EXPLAIN PLAN来解决问题,但并不完全符合我的需求。

0

我做类似这样的事情

declare
c integer;
begin
select count(*) into c from xray where bar;

if c > 0 then
/* found, do something */
DBMS_OUTPUT.PUT_LINE('found, do something');
else
/* not found, do something else */
DBMS_OUTPUT.PUT_LINE('not found, do something else');
end if;
end;

0

这可以重写为PL/SQL块,但任何DDL语言(如alter procedure)必须作为execute immediate执行。

DECLARE
v_count NUMBER(9)
BEGIN
SELECT count(*)
INTO v_count
FROM all_objects
where owner = '<your schema name>'
and object_name = '<your object>';

IF v_count = 1 
THEN
--do something
ELSE
--do something else or remove the else
END IF;

END;

谢谢,但使用EXECUTE IMMEDIATE语句可以执行动态SQL语句。 - Yarix
@Yarix,尽管它们都有些符合ANSI SQL标准,但Oracle != Sql Server。 - kevinskio

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接