2016-04-28 50 views
0

我試圖將模式名稱作爲參數傳遞給execute immediate命令。無法在立即執行中傳遞模式名稱

DECLARE 
    sql_stmt VARCHAR2(200); 
BEGIN 
    sql_stmt := 'DROP INDEX :owner.".MY_INDEX"'; 
    EXECUTE IMMEDIATE sql_stmt using &owner_name ; 
EXCEPTION 
    WHEN OTHERS THEN 
     IF SQLCODE != -942 THEN 
     RAISE; 
     END IF; 
END; 

上面加註以下Oracle錯誤: ORA-06550:第5行,列38: PLS-00201:標識符 'USER_X' 必須被聲明

我試圖也嘗試連接sql_stmt但沒有成功。我收到與上面完全相同的錯誤:

DECLARE 
    sql_stmt VARCHAR2(200); 
BEGIN 
    sql_stmt := 'DROP INDEX ' || &owner. || '".MY_INDEX";'; 
    EXECUTE IMMEDIATE sql_stmt ; 
EXCEPTION 
    WHEN OTHERS THEN 
     IF SQLCODE != -942 THEN 
     RAISE; 
     END IF; 
END; 

任何有關將用戶名作爲變量傳遞給execute語句的建議嗎?

回答

0

我發現下面的作品。我錯過了一個點'。':

DECLARE 
    sql_stmt VARCHAR2(200); 
BEGIN 
    sql_stmt := 'DROP INDEX &owner_name.."MY_INDEX"'; 
    EXECUTE IMMEDIATE sql_stmt; 
EXCEPTION 
    WHEN OTHERS THEN 
     IF SQLCODE != -942 THEN 
     RAISE; 
     END IF; 
END; 
0

一種更好的方法是通過變量而不是直接賦值給execute immediate。如果你使用變量,那麼這個塊也可以用於其他目的。總是試圖使塊可以重複使用。希望在下面的代碼片幫助。

SET define ON; 
DECLARE 
    sql_stmt VARCHAR2(200); 
    lv_chema_nm VARCHAR2(100):='&Enter_schema_name'; 
    lv_obj_type VARCHAR2(100):='&Enter_obj_type'; 
    lv_obj_name VARCHAR2(100):='&Enter_obj_name'; 
BEGIN 
    sql_stmt := 'DROP '||lv_obj_type ||' '|| lv_chema_nm||'.'||lv_obj_name; 
    EXECUTE IMMEDIATE sql_stmt ; 
EXCEPTION 
WHEN OTHERS THEN 
    IF SQLCODE != -942 THEN 
    RAISE; 
    END IF; 
END;