请求将指定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
相关产品推荐
相关产品推荐

