无法在execute immediate中传递模式名称

时间:2016-04-28 06:06:31

标签: sql oracle plsql oracle11g

我试图将模式名称作为参数传递给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;

是否有任何建议将用户名作为变量传递给执行语句?

2 个答案:

答案 0 :(得分: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;

答案 1 :(得分:0)

更好的方法是通过变量将值分配给执行立即数。如果您使用变量,那么此块也可以重复用于其他目的。总是尝试以可以重复使用的方式制作块。希望在片段下方有所帮助。

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;