You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

请求将指定PL/SQL代码封装为Procedure并解决调用报错问题

PL/SQL代码封装为存储过程及报错解决

报错原因分析

你遇到的ORA-06550和PLS-00306错误,核心问题是调用名为RANDOM_UUID_1的程序时参数数量或类型不匹配,但你提供的原始代码中并没有这个函数/过程的调用。大概率是封装存储过程时,误将自定义UUID生成逻辑替换成了RANDOM_UUID_1的调用,或者过程定义的参数与实际调用要求不一致。

正确的存储过程实现

以下是将你提供的逻辑封装为存储过程的完整代码:

CREATE OR REPLACE PROCEDURE populate_test_uuid
IS
BEGIN
  FOR c IN (SELECT id FROM test WHERE uuid IS NULL)
  LOOP
      UPDATE test
      SET uuid = (
          SELECT lower(
                trim(to_char(floor(dbms_random.value(0, power(16, 8))), '0XXXXXXX')) || '-' ||
                trim(to_char(floor(dbms_random.value(0, power(16, 4))), '0XXX')) || '-' ||
                trim(to_char(floor(dbms_random.value(0, power(16, 4))), '0XXX')) || '-' ||
                CASE floor(dbms_random.value(0, 4))
                  WHEN 0 THEN '8'
                  WHEN 1 THEN '9'
                  WHEN 2 THEN 'A'
                  WHEN 3 THEN 'B'
                END ||
                trim(to_char(floor(dbms_random.value(0, power(16, 3))), '0XX')) || '-' ||
                trim(to_char(floor(dbms_random.value(0, power(16, 12))), '0XXXXXXXXXXX'))
               )
               FROM dual
           )
      WHERE id = c.id;
  END LOOP;
  COMMIT; -- 可根据业务需求选择是否自动提交事务
END populate_test_uuid;
/

存储过程调用方式

创建完成后,通过以下语句调用:

BEGIN
  populate_test_uuid;
END;
/

性能优化建议

原始代码采用逐行循环更新的方式,当表中数据量较大时,执行效率会很低。可以改为批量更新逻辑,直接一次性处理所有uuid为空的记录:

CREATE OR REPLACE PROCEDURE populate_test_uuid
IS
BEGIN
  UPDATE test t
  SET t.uuid = (
      SELECT lower(
            trim(to_char(floor(dbms_random.value(0, power(16, 8))), '0XXXXXXX')) || '-' ||
            trim(to_char(floor(dbms_random.value(0, power(16, 4))), '0XXX')) || '-' ||
            trim(to_char(floor(dbms_random.value(0, power(16, 4))), '0XXX')) || '-' ||
            CASE floor(dbms_random.value(0, 4))
              WHEN 0 THEN '8'
              WHEN 1 THEN '9'
              WHEN 2 THEN 'A'
              WHEN 3 THEN 'B'
            END ||
            trim(to_char(floor(dbms_random.value(0, power(16, 3))), '0XX')) || '-' ||
            trim(to_char(floor(dbms_random.value(0, power(16, 12))), '0XXXXXXXXXXX'))
           )
           FROM dual
       )
  WHERE t.uuid IS NULL;
  COMMIT;
END populate_test_uuid;
/

内容的提问来源于stack exchange,提问作者Samir Araar Akalay

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.23 11:16:00