如何在过程中正确调用DBMS_WM.GOTOWORKSPACE

时间:2018-07-13 18:00:16

标签: oracle plsql oracle12c

对于这个相对简单的问题,我深表歉意,但是我是Oracle和DBMS Workspace Manager的新手。我有一个存储过程,用于检查当前工作空间,如果它与传入的工作空间不同,它将执行DBMS_WM.GOTOWORKSPACE。所有示例都显示了在调用DBMS_WM.GOTOWORKSPACE时使用EXEC,但是当我在TOAD中使用以下语法时,如果我将EXEC取消显示的任何错误,它将表示其无效。

哪个是正确的?

 //Toad Does not like this synatx
 IF UPPER(l_current_workspace) != UPPER(i_workspace) THEN
        EXEC DBMS_WM.GOTOWORKSPACE (i_workspace); 
    END IF;

OR

//TOAD is fine with this
IF UPPER(l_current_workspace) != UPPER(i_workspace) THEN
        DBMS_WM.GOTOWORKSPACE (i_workspace); 
    END IF;

1 个答案:

答案 0 :(得分:2)

我想这些示例的形式类似于EXEC DBMS_WM.GOTOWORKSPACE(<>); and not between a conditional IF ... END IF;`

EXEC不是PLSQL保留字。它是客户端(而不是数据库服务器)中的宏/快捷方式,它进行扩展以将其前面的语句包装到BEGIN ... END;块中。

它在命令行(SQLPlus和SQLcl)和Toad和SQLDeveloper等编辑器上得到了广泛的使用。通常支持它,但是仅作为一个整体命令(EXEC作为该块的前奏)而不是在该块内部(不支持嵌套EXEC,另一个内部的EXEC)也支持它BEGIN...END;阻止)。

由于它不是保留字,所以当它在另一个块中时将其扩展是一个问题。对其进行解析变得模棱两可-可以定义自己的名为EXEC的函数,并且在PLSQL块中运行将是完全有效的。然后,编辑人员需要不确定遇到该单词时该怎么做。如果扩展EXEC而不是在PLSQL块中将其识别为过程,则以下示例将中断:

CREATE PROCEDURE EXEC(PARAM_1 IN VARCHAR2)
IS
  BEGIN
    DBMS_OUTPUT.PUT_LINE(UTL_LMS.FORMAT_MESSAGE('Param is:[%s]',PARAM_1));
  END EXEC;
/

BEGIN
  EXEC('VOLTRON');
END;
/

因此,第二个示例是正确的(假定它位于另一个BEGIN...END;块中),并且由于不需要被客户端拦截和修改,因此是通用兼容的。