12c with语句增强功能

创建测试环境

SQL> conn loge/china@pdb1;
已连接。
SQL> drop table t1 purge;

表已删除。

SQL> create table t1 as
  2  select 1 as id from dual
  3  connect by level <=1000;

表已创建。
说明:在12c中使用ctas创建表示后不需要在收集信息(EXEC DBMS_STATS.gather_table_stats('LOGE','T1');),将自动收集,可以查询(select * from user_tab_statistics)

在with中使用function

SQL> edit
已写入 file afiedt.buf

  1   with
  2      function w_function(p_id in number) return number is
  3      begin
  4        return p_id;
  5      end;
  6  select w_function(1)
  7  from t1
  8* where rownum=1
  9  /

W_FUNCTION(1)
-------------
            1

在with中使用procedure

SQL> edit
已写入 file afiedt.buf

  1   with
  2      procedure w_procedure (id in number) is
  3      begin
  4     dbms_output.put_line('id='||id);
  5      end;
  6      function w_function(p_id in number) return number is
  7      begin
  8        w_procedure(p_id);
  9        return p_id;
 10      end;
 11  select w_function(id)
 12  from t1
 13* where rownum=1
SQL> /

W_FUNCTION(ID)
--------------
             1

SQL> set serveroutput on
SQL> /

W_FUNCTION(ID)
--------------
             1

id=1
PLSQL的支持,此示例比较两个函数性能

  1  CREATE OR REPLACE FUNCTION n_function(p_id IN NUMBER) RETURN NUMBER IS
  2  BEGIN
  3    RETURN p_id;
  4* END;
SQL> /

函数已创建。
-- SET SERVEROUTPUT ON
DECLARE
  l_time    PLS_INTEGER;
  l_cpu     PLS_INTEGER;
  l_sql     VARCHAR2(32767);
  l_cursor  SYS_REFCURSOR;
  TYPE t_tab IS TABLE OF NUMBER;
  l_tab t_tab;
BEGIN
  l_time := DBMS_UTILITY.get_time;
  l_cpu  := DBMS_UTILITY.get_cpu_time;
  l_sql := 'WITH
              FUNCTION w_function(p_id IN NUMBER) RETURN NUMBER IS
              BEGIN
                RETURN p_id;
              END;
            SELECT w_function(id)
            FROM   t1';
  OPEN l_cursor FOR l_sql;
  FETCH l_cursor
  BULK COLLECT INTO l_tab;
  CLOSE l_cursor;
  DBMS_OUTPUT.put_line('W_FUNCTION  : ' ||
                       'Time=' || TO_CHAR(DBMS_UTILITY.get_time - l_time) || ' hsecs ' ||
                       'CPU Time=' || (DBMS_UTILITY.get_cpu_time - l_cpu) || ' hsecs ');
  l_time := DBMS_UTILITY.get_time;
  l_cpu  := DBMS_UTILITY.get_cpu_time;
  l_sql := 'SELECT n_function(id)
            FROM   t1';
  OPEN l_cursor FOR l_sql;
  FETCH l_cursor
  BULK COLLECT INTO l_tab;
  CLOSE l_cursor;
  DBMS_OUTPUT.put_line('N_FUNCTION: ' ||
                       'Time=' || TO_CHAR(DBMS_UTILITY.get_time - l_time) || ' hsecs ' ||
                       'CPU Time=' || (DBMS_UTILITY.get_cpu_time - l_cpu) || ' hsecs ');
END;
/

结果:

W_FUNCTION  : Time=1 hsecs CPU Time=2 hsecs
N_FUNCTION: Time=8 hsecs CPU Time=3 hsecs

PL/SQL 过程已成功完成。
WITH_PLSQL提示,大小写不敏感

SQL> update /*+ WITH_PLSQl */ t1 a
  2  set a.id=(with
  3             function w_function(p_id in number) return number is
  4             begin
  5                     return p_id;
  6             end;
  7             select w_function(a.id)
  8             from dual);
  9  /

已更新 1000 行。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
Oracle 12c中的错误消息 "resource busy and acquire with" 表示尝试访问或操作的资源当前正在被其他会话占用。这可能发生在并发访问数据库对象时。 这个错误可能出现在多个场景下。例如,当一个会话正在尝试修改或删除一个被其他会话锁定的对象时,就会产生这个错误。同样地,如果一个会话正在等待其他会话释放它所需的资源,但超时未成功,也会导致这个错误。 为了解决这个问题,可以采取以下几个步骤: 1. 确认资源是否真正被占用。可以通过查询 `v$locked_object` 视图来查看被锁定的对象,或者查询 `v$session` 视图来确定当前会话的状态。这些查询可以帮助你确定是哪个会话在占用资源。 2. 等待占用资源的会话释放资源。如果资源正在被其他会话使用,可以等待该会话完成操作后再尝试访问。 3. 主动释放资源锁定。如果你确定资源没有被其他会话使用,你可以手动释放锁定。可以使用 `alter system kill session` 命令来终止持有资源的会话,或者使用 `alter system kill session '<sid>, <serial#'` 命令终止指定的会话。 4. 修改数据访问的方式。如果你经常遇到 "resource busy and acquire with" 错误,在设计数据访问逻辑时可以考虑使用更合理的锁定策略或隔离级别,以减少并发访问导致的冲突。 总结来说,当出现 "resource busy and acquire with" 错误时,我们应该先确定资源是否真正被其他会话占用,然后根据具体情况采取适当的措施,包括等待会话释放资源、释放资源锁定或者重新设计数据访问方式。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

朝闻道-夕死可矣

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值