2016-08-16 105 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

相關問題