我可以在调用相同过程后立即将 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
= 并发
是谁造成的?我自己。所以是的 - 我们遇到了敌人,他们是我们。
看起来你不能按照你想要的方式做,而是单独做:
- 先调用程序
- 完成后,放下它
但是,多么奇怪的要求……您为什么要删除一个程序?你会在 明天 再次创建它吗?如果是这样,为什么要完全放弃它?说“客户需要它”——客户到底知道些什么?让他们三思;如果这还不够,请再考虑一下。
我创建了一个 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
= 并发
是谁造成的?我自己。所以是的 - 我们遇到了敌人,他们是我们。
看起来你不能按照你想要的方式做,而是单独做:
- 先调用程序
- 完成后,放下它
但是,多么奇怪的要求……您为什么要删除一个程序?你会在 明天 再次创建它吗?如果是这样,为什么要完全放弃它?说“客户需要它”——客户到底知道些什么?让他们三思;如果这还不够,请再考虑一下。