我可以在调用相同过程后立即将 PL/SQL 过程放在匿名块中吗?

Can I drop PL/SQL procedure in Anonymous block just after called the same procedure?

我创建了一个 PL/SQL 存储过程,用于将行插入相关 table,然后在另一个 PL/SQL 匿名块中,我可以单独调用和删除它。但是,当将这两个语句放在一起时,Sql 开发人员就一直 运行 永远在那里。以下是三个代码片段:

-- 下面的代码运行良好

BEGIN
  MyProcedure1 (1,70,'Tommy'); 
END;  

-- 下面的代码运行良好

BEGIN
  EXECUTE IMMEDIATE 'drop procedure MyProcedure1';
END;

-- 下面的代码永远卡在那里

BEGIN
  MyProcedure1 (1,70,'Tommy'); 
  EXECUTE IMMEDIATE 'drop procedure MyProcedure1';
END;

David,我仍然看不出为什么在插入数据后需要立即删除程序....如果明天要插入更多数据怎么办?如果只是一次性的东西,为什么不能事后手动删除它?

但是如果你真的必须这样做...

BEGIN
  MyProcedure1 (1,70,'Tommy'); 
END;
/
drop procedure MyProcedure1;

然后单击 运行 作为 SqlDeveloper 中的脚本按钮...运行没有问题,查看会话管理器正在发生的事情是匿名块将过程放入缓存/固定它(没有别的意思可以编译/删除它)直到该块完成。这就是为什么将 drop 移动到 Begin / End 之外允许代码工作。

如果你查询v$session,这是你可以看到的(当然,匿名PL/SQL块仍然是“运行” - 实际上,它是正在等待):

SQL> select
  2    a.blocking_session,
  3    b.username blocking_username,
  4    b.osuser blocking_osuser,
  5    a.sid,
  6    a.serial#,
  7    a.seconds_in_wait,
  8    a.username,
  9    a.wait_class,
 10    a.state
 11  from v$session a join v$session b on a.blocking_session = b.sid;

BLOCKING_SESSION BLOCKING_USERNAME BLOCKING_OSUSER  SID  SERIAL# SECONDS_IN_WAIT USERNAME WAIT_CLASS  STATE
---------------- ----------------- --------------- ---- -------- --------------- -------- ----------- -------
             707 SCOTT             littlefoot       707     1245             329 SCOTT    Concurrency WAITING

SQL>

注意最后两列:

  • state = 等待
  • wait_class = 并发

是谁造成的?我自己。所以是的 - 我们遇到了敌人,他们是我们

看起来你不能按照你想要的方式做,而是单独做:

  • 先调用程序
  • 完成后,放下它

但是,多么奇怪的要求……您为什么要删除一个程序?你会在 明天 再次创建它吗?如果是这样,为什么要完全放弃它?说“客户需要它”——客户到底知道些什么?让他们三思;如果这还不够,请再考虑一下。