我在 Oracle 中有一个主程序,它调用其他较小的程序,尽管它们每个单独运行时都工作正常,但当我尝试运行主程序时,什么也没有发生。没有错误,但没有结果枯萎。我想知道我是否在代码中遗漏了一些东西:
create or replace PROCEDURE ADMIN.sp_league_pool_users_master AS
v_SEASON_NUMBER_DERIVED NUMBER;
v_LEAGUE_COUNTRY VARCHAR2(100);
v_LEAGUE_LEVEL NUMBER;
v_ALPHA2CODE_DERIVED VARCHAR2(2);
v_count NUMBER;
BEGIN
-- Step 1: Derive the Season Number
ADMIN.sp_deriveSeasonNumber(v_SEASON_NUMBER_DERIVED);
-- Step 2: Scan the LEAGUE_POOL table
FOR r IN (SELECT lp.LEAGUE_POOL_ID, lp.LEAGUE_COUNTRY, lp.LEAGUE_LEVEL FROM LEAGUE_POOL lp) LOOP
v_LEAGUE_COUNTRY := r.LEAGUE_COUNTRY;
v_LEAGUE_LEVEL := r.LEAGUE_LEVEL;
-- Step 3: Derive ALPHA2CODE_DERIVED and check for existing records
CASE r.LEAGUE_COUNTRY
WHEN 'Rest of Africa' THEN v_ALPHA2CODE_DERIVED := 'BJ';
WHEN 'Rest of Asia and Oceania' THEN v_ALPHA2CODE_DERIVED := 'AF';
WHEN 'Rest of North America' THEN v_ALPHA2CODE_DERIVED := 'AG';
WHEN 'Rest of South America' THEN v_ALPHA2CODE_DERIVED := 'FK';
ELSE
-- Fetch from the COUNTRIES table
SELECT ct.ALPHA2CODE INTO v_ALPHA2CODE_DERIVED
FROM COUNTRIES ct WHERE ct.LEAGUE_COUNTRY = r.LEAGUE_COUNTRY;
END CASE;
SELECT COUNT(*) INTO v_count FROM LEAGUE_POOL_USERS lpu
WHERE lpu.LEAGUE_POOL_ID = r.LEAGUE_POOL_ID AND lpu.SEASON_NUMBER = v_SEASON_NUMBER_DERIVED;
IF v_count > 0 THEN
SELECT COUNT(*) INTO v_count
FROM LEAGUE_POOL_USERS
WHERE LEAGUE_POOL_ID = r.LEAGUE_POOL_ID AND SEASON_NUMBER = v_SEASON_NUMBER_DERIVED + 1;
IF v_count = 0 THEN
-- Step 4: Call the appropriate level procedure based on LEAGUE_LEVEL
CASE r.LEAGUE_LEVEL
WHEN 1 THEN
ADMIN.sp_handleLeagueLevel1(v_SEASON_NUMBER_DERIVED, v_LEAGUE_COUNTRY);
WHEN 2 THEN
ADMIN.sp_handleLeagueLevel2(v_SEASON_NUMBER_DERIVED, v_LEAGUE_COUNTRY);
WHEN 3 THEN
ADMIN.sp_handleLeagueLevel3(v_SEASON_NUMBER_DERIVED, v_LEAGUE_COUNTRY);
WHEN 4 THEN
ADMIN.sp_handleLeagueLevel4(v_SEASON_NUMBER_DERIVED, v_LEAGUE_COUNTRY);
END CASE;
END IF;
ELSE
-- If the LEAGUE_POOL_ID doesn't exist in LEAGUE_POOL_USERS, call the insert procedure
ADMIN.sp_insertLeaguePoolUsers(v_SEASON_NUMBER_DERIVED, v_LEAGUE_COUNTRY, v_LEAGUE_LEVEL, r.LEAGUE_POOL_ID);
END IF;
END LOOP;
EXCEPTION
WHEN OTHERS THEN
DBMS_OUTPUT.PUT_LINE('An error occurred in sp_league_pool_users_master: ' || SQLERRM);
END sp_league_pool_users_master;
正如您问题的评论中所提到的,很难为您提供帮助,因为我们没有任何示例数据来运行上述过程,因此我们无法说出为什么它没有按您的预期工作。也许问题出在其他地方,在它调用的过程中?
但是,通过将循环内的 select 语句合并到游标中,您可以使过程的调试变得更加容易(并且可能同时提高性能!)。这样,您可以单独运行查询(根据需要修改季节详细信息)以查看该过程应该在一组数据中执行哪些操作,而不必逐行调试该过程。
我已经花时间重写了你的程序,尽管它显然未经测试!它应该能让您了解如何继续:
CREATE OR REPLACE PROCEDURE admin.sp_league_pool_users_master AS
v_season_number_derived NUMBER;
BEGIN
-- Derive the Season Number
admin.sp_deriveseasonnumber(v_season_number_derived);
-- Scan the LEAGUE_POOL table
FOR r IN (WITH country_codes AS (SELECT 1 qry_num, 'Rest of Africa' league_country, 'BJ' alpha2code_derived FROM dual UNION ALL
SELECT 1 qry_num, 'Rest of Asia and Oceania' league_country, 'AF' alpha2code_derived FROM dual UNION ALL
SELECT 1 qry_num, 'Rest of North America' league_country, 'AG' alpha2code_derived FROM dual UNION ALL
SELECT 1 qry_num, 'Rest of South America' league_country, 'FK' alpha2code_derived FROM dual
UNION ALL
SELECT 2 qry_num, league_country, alpha2code
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.
lpu AS (SELECT league_pool_id,
season_number,
COUNT(CASE WHEN season_number = v_season_number_derived THEN 1 END) lpu_season_count,
COUNT(CASE WHEN season_number = v_season_number_derived + 1 THEN 1 END) lpu_season_count_plus_1
FROM league_pool_users
WHERE season_number IN (v_season_number_derived, v_season_number_derived + 1))
SELECT lp.league_pool_id,
lp.league_country,
lp.league_level,
cc.alpha2code_derived, -- is this even needed? it doesn't seem to be used in the procedure!
lpu.lpu_season_count,
lpu.lpu_season_count_plus_1
FROM league_pool lp
LEFT OUTER JOIN country_codes cc ON lp.league_country = cc.league_country
LEFT OUTER JOIN lpu ON lp.league_pool_id = lpu.league_pool_id;)
LOOP
-- If the LEAGUE_POOL_ID exists in LEAGUE_POOL_USERS for the derived season but not the following season,
-- call the appropriate level procedure based on LEAGUE_LEVEL
IF lpu_season_count > 0 AND lpu_season_count_plus_1 = 0
THEN
CASE r.league_level
WHEN 1 THEN
admin.sp_handleleaguelevel1(v_season_number_derived, r.league_country);
WHEN 2 THEN
admin.sp_handleleaguelevel2(v_season_number_derived, r.league_country);
WHEN 3 THEN
admin.sp_handleleaguelevel3(v_season_number_derived, r.league_country);
WHEN 4 THEN
admin.sp_handleleaguelevel4(v_season_number_derived, r.league_country);
END CASE;
-- Otherwise, If the LEAGUE_POOL_ID doesn't exist in LEAGUE_POOL_USERS, call the insert procedure
ELSIF lpu_season_count = 0
THEN
admin.sp_insertleaguepoolusers(v_season_number_derived, r.league_country, r,league_level, r.league_pool_id);
END IF;
END LOOP;
/*EXCEPTION
WHEN OTHERS THEN
dbms_output.put_line('An error occurred in sp_league_pool_users_master: ' || SQLERRM);*/
END sp_league_pool_users_master;
/
注意是否需要围绕 alpha2code_衍生国家/地区代码的逻辑?它似乎没有在您的程序中的任何地方使用!