Oracle过程不返回结果[已关闭]

wz3gfoph  于 2023-10-16  发布在  Oracle
关注(0)|答案(1)|浏览(154)

**已关闭。**此问题需要debugging details。它目前不接受回答。

编辑问题以包括desired behavior, a specific problem or error, and the shortest code necessary to reproduce the problem。这将帮助其他人回答这个问题。
关闭7天前。
Improve this question
我在Oracle中有一个主过程,它调用其他较小的过程,即使它们中的每一个在单独运行时都能正常工作,但当我试图运行主过程时,什么也没有发生。没有错误,但没有结果枯萎。我想知道我是否在代码中遗漏了一些东西:

  1. create or replace PROCEDURE ADMIN.sp_league_pool_users_master AS
  2. v_SEASON_NUMBER_DERIVED NUMBER;
  3. v_LEAGUE_COUNTRY VARCHAR2(100);
  4. v_LEAGUE_LEVEL NUMBER;
  5. v_ALPHA2CODE_DERIVED VARCHAR2(2);
  6. v_count NUMBER;
  7. BEGIN
  8. -- Step 1: Derive the Season Number
  9. ADMIN.sp_deriveSeasonNumber(v_SEASON_NUMBER_DERIVED);
  10. -- Step 2: Scan the LEAGUE_POOL table
  11. FOR r IN (SELECT lp.LEAGUE_POOL_ID, lp.LEAGUE_COUNTRY, lp.LEAGUE_LEVEL FROM LEAGUE_POOL lp) LOOP
  12. v_LEAGUE_COUNTRY := r.LEAGUE_COUNTRY;
  13. v_LEAGUE_LEVEL := r.LEAGUE_LEVEL;
  14. -- Step 3: Derive ALPHA2CODE_DERIVED and check for existing records
  15. CASE r.LEAGUE_COUNTRY
  16. WHEN 'Rest of Africa' THEN v_ALPHA2CODE_DERIVED := 'BJ';
  17. WHEN 'Rest of Asia and Oceania' THEN v_ALPHA2CODE_DERIVED := 'AF';
  18. WHEN 'Rest of North America' THEN v_ALPHA2CODE_DERIVED := 'AG';
  19. WHEN 'Rest of South America' THEN v_ALPHA2CODE_DERIVED := 'FK';
  20. ELSE
  21. -- Fetch from the COUNTRIES table
  22. SELECT ct.ALPHA2CODE INTO v_ALPHA2CODE_DERIVED
  23. FROM COUNTRIES ct WHERE ct.LEAGUE_COUNTRY = r.LEAGUE_COUNTRY;
  24. END CASE;
  25. SELECT COUNT(*) INTO v_count FROM LEAGUE_POOL_USERS lpu
  26. WHERE lpu.LEAGUE_POOL_ID = r.LEAGUE_POOL_ID AND lpu.SEASON_NUMBER = v_SEASON_NUMBER_DERIVED;
  27. IF v_count > 0 THEN
  28. SELECT COUNT(*) INTO v_count
  29. FROM LEAGUE_POOL_USERS
  30. WHERE LEAGUE_POOL_ID = r.LEAGUE_POOL_ID AND SEASON_NUMBER = v_SEASON_NUMBER_DERIVED + 1;
  31. IF v_count = 0 THEN
  32. -- Step 4: Call the appropriate level procedure based on LEAGUE_LEVEL
  33. CASE r.LEAGUE_LEVEL
  34. WHEN 1 THEN
  35. ADMIN.sp_handleLeagueLevel1(v_SEASON_NUMBER_DERIVED, v_LEAGUE_COUNTRY);
  36. WHEN 2 THEN
  37. ADMIN.sp_handleLeagueLevel2(v_SEASON_NUMBER_DERIVED, v_LEAGUE_COUNTRY);
  38. WHEN 3 THEN
  39. ADMIN.sp_handleLeagueLevel3(v_SEASON_NUMBER_DERIVED, v_LEAGUE_COUNTRY);
  40. WHEN 4 THEN
  41. ADMIN.sp_handleLeagueLevel4(v_SEASON_NUMBER_DERIVED, v_LEAGUE_COUNTRY);
  42. END CASE;
  43. END IF;
  44. ELSE
  45. -- If the LEAGUE_POOL_ID doesn't exist in LEAGUE_POOL_USERS, call the insert procedure
  46. ADMIN.sp_insertLeaguePoolUsers(v_SEASON_NUMBER_DERIVED, v_LEAGUE_COUNTRY, v_LEAGUE_LEVEL, r.LEAGUE_POOL_ID);
  47. END IF;
  48. END LOOP;
  49. EXCEPTION
  50. WHEN OTHERS THEN
  51. DBMS_OUTPUT.PUT_LINE('An error occurred in sp_league_pool_users_master: ' || SQLERRM);
  52. END sp_league_pool_users_master;
mctunoxg

mctunoxg1#

正如在对您的问题的评论中提到的,很难帮助您,因为我们没有任何样本数据来运行上述过程,所以我们不能说为什么它不像您期望的那样工作。也许问题出在其他地方,在它所要求的程序中?
但是,您可以使调试过程更加容易(也许同时还可以提高性能!),方法是将循环内的select语句合并到游标中。这样,您就可以单独运行查询(适当地修改季节细节),以查看该过程应该在单个数据集中执行什么操作,而不必逐行调试该过程。
我花时间重写了你的程序,虽然它显然是未经测试的!它应该给给予你一个如何继续的想法:

  1. CREATE OR REPLACE PROCEDURE admin.sp_league_pool_users_master AS
  2. v_season_number_derived NUMBER;
  3. BEGIN
  4. -- Derive the Season Number
  5. admin.sp_deriveseasonnumber(v_season_number_derived);
  6. -- Scan the LEAGUE_POOL table
  7. FOR r IN (WITH country_codes AS (SELECT 1 qry_num, 'Rest of Africa' league_country, 'BJ' alpha2code_derived FROM dual UNION ALL
  8. SELECT 1 qry_num, 'Rest of Asia and Oceania' league_country, 'AF' alpha2code_derived FROM dual UNION ALL
  9. SELECT 1 qry_num, 'Rest of North America' league_country, 'AG' alpha2code_derived FROM dual UNION ALL
  10. SELECT 1 qry_num, 'Rest of South America' league_country, 'FK' alpha2code_derived FROM dual
  11. UNION ALL
  12. SELECT 2 qry_num, league_country, alpha2code
  13. FROM countries) -- if the first four rows above override rows in the countries table, update the subquery to return the 1st row based on qry_num. Otherwise the qry_num column can be removed from this subquery.
  14. lpu AS (SELECT league_pool_id,
  15. season_number,
  16. COUNT(CASE WHEN season_number = v_season_number_derived THEN 1 END) lpu_season_count,
  17. COUNT(CASE WHEN season_number = v_season_number_derived + 1 THEN 1 END) lpu_season_count_plus_1
  18. FROM league_pool_users
  19. WHERE season_number IN (v_season_number_derived, v_season_number_derived + 1))
  20. SELECT lp.league_pool_id,
  21. lp.league_country,
  22. lp.league_level,
  23. cc.alpha2code_derived, -- is this even needed? it doesn't seem to be used in the procedure!
  24. lpu.lpu_season_count,
  25. lpu.lpu_season_count_plus_1
  26. FROM league_pool lp
  27. LEFT OUTER JOIN country_codes cc ON lp.league_country = cc.league_country
  28. LEFT OUTER JOIN lpu ON lp.league_pool_id = lpu.league_pool_id;)
  29. LOOP
  30. -- If the LEAGUE_POOL_ID exists in LEAGUE_POOL_USERS for the derived season but not the following season,
  31. -- call the appropriate level procedure based on LEAGUE_LEVEL
  32. IF lpu_season_count > 0 AND lpu_season_count_plus_1 = 0
  33. THEN
  34. CASE r.league_level
  35. WHEN 1 THEN
  36. admin.sp_handleleaguelevel1(v_season_number_derived, r.league_country);
  37. WHEN 2 THEN
  38. admin.sp_handleleaguelevel2(v_season_number_derived, r.league_country);
  39. WHEN 3 THEN
  40. admin.sp_handleleaguelevel3(v_season_number_derived, r.league_country);
  41. WHEN 4 THEN
  42. admin.sp_handleleaguelevel4(v_season_number_derived, r.league_country);
  43. END CASE;
  44. -- Otherwise, If the LEAGUE_POOL_ID doesn't exist in LEAGUE_POOL_USERS, call the insert procedure
  45. ELSIF lpu_season_count = 0
  46. THEN
  47. admin.sp_insertleaguepoolusers(v_season_number_derived, r.league_country, r,league_level, r.league_pool_id);
  48. END IF;
  49. END LOOP;
  50. /*EXCEPTION
  51. WHEN OTHERS THEN
  52. dbms_output.put_line('An error occurred in sp_league_pool_users_master: ' || SQLERRM);*/
  53. END sp_league_pool_users_master;
  54. /

注意:是否需要围绕alpha2code_derived国家代码的逻辑?在你的手术中似乎没有用到它!

展开查看全部

相关问题