2016-08-16 101 views
2

我有一个SQL脚本,根据某些条件更新数据库过程或更改表。如果程序或表在运行时不存在,则脚本也应该工作(在这种情况下,应该更新)。什么是SQL Server的SET NOEXEC或NOPARSE的Oracle等价物?

在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 

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

+1

没有,这是不可能的AFAIK。你可以得到会使用'DBMS_SQL最接近的一次。因为你必须使用动态的sql + cursor,但是它对于DDL语句无论如何都不适用(比如你的'alter procedure'语句),因为它也会执行语句,这与你想要的相反。 – sstan

+1

[动态SQL - 检查语法和语义]的可能重复(http://stackoverflow.com/questions/36713444/dynamic-sql-check-syntax-and-semantics) – sstan

回答

0

感谢您的意见大家。 不幸的是Oracle不为MSSQL NOEXEC :( 与dbms_sql.parse()EXPLAIN PLAN建议并不完全符合我的需求的解决方法有相当的命令。

0

这可以被改写为PL/SQL块,但任何DDL语言如ALTER过程是一定要做的执行直接

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; 
+0

谢谢但使用EXECUTE IMMEDIATE语句执行动态SQL语句 – Yarix

+0

@Yarix即使它们都符合ANSI SQL标准Oracle!= Sql Server – kevinsky

相关问题