Oracle 过程不返回结果

问题描述 投票:0回答:1

我在 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;
oracle procedure
1个回答
0
投票

正如您问题的评论中所提到的,很难为您提供帮助,因为我们没有任何示例数据来运行上述过程,因此我们无法说出为什么它没有按您的预期工作。也许问题出在其他地方,在它调用的过程中?

但是,通过将循环内的 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_衍生国家/地区代码的逻辑?它似乎没有在您的程序中的任何地方使用!

© www.soinside.com 2019 - 2024. All rights reserved.