2016-04-28 56 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;