簡體   English   中英

對於PL / SQL中的循環和列

[英]For loop and columns in PL/SQL

我是PL / SQL的新手。 我在這種語言中遇到循環問題。 我想像這樣循環:

FOR nr IN 1..102 
LOOP
  DBMS_OUTPUT.PUT_LINE(nr);
  IF rec.column_||nr IS NULL
    THEN
    DBMS_OUTPUT.PUT_LINE('test');
  END IF;
END LOOP;

我創建了一個游標。 如您所見,我想檢查列號為column_1到column_102的所有列。 不幸的是|| 運營商不適用於這種情況。 你知道我的問題的一些解決方案嗎?

您可以使用動態PL / SQL執行此操作。 使用EXECUTE IMMEDIATE語句將字符串參數作為PL / SQL執行,您可以使用|| 因為它是在問題中的意圖。

例:

BEGIN 
    FOR nr IN 1..102 
    LOOP
        DBMS_OUTPUT.PUT_LINE(nr);
        EXECUTE IMMEDIATE 
            'BEGIN ' || 
            'IF rec.column.' || nr ||' is null THEN ' ||
                'DBMS_OUTPUT.PUT_LINE(''test''); ' ||
            'END IF; ' || 
            'END; ';
    END LOOP;
END;

或者您也可以指定rec.column.' || nr ||' is null rec.column.' || nr ||' is null 變量rec.column.' || nr ||' is null並使PUT_LINE超出EXECUTE IMMEDIATE部分:

更新 :似乎無法綁定BOOLEAN變量,所以我修改了示例以使用NUMBER

更新2:可能的效率提高,盡管可能不適合這種情況。 對動態SQL使用常量VARCHAR ,並使用綁定變量傳入nr 如果在大型循環中,這比使用本機SQL更有效。 我不認為'rec.column.:arg is null將執行,因為'rec.column.1 is null

 DECLARE
    isnull NUMBER;
 BEGIN 
    FOR nr IN 1..102 
    LOOP
        DBMS_OUTPUT.PUT_LINE(nr);
        EXECUTE IMMEDIATE 
            'BEGIN ' || 
                'IF rec.column.' || nr ||' IS NULL THEN ' || 
                    ':x:=1; ' || 
                'ELSE ' ||
                    ':x:=0; ' ||
                'END IF; ' ||
            'END; ' 
            USING OUT isnull;
        IF isnull = 1 THEN 
            DBMS_OUTPUT.PUT_LINE('test');
        END IF;
    END LOOP;
END;

更新3 :看到:

  • 無法在動態SQL語句中訪問rec ,因為它未定義(超出范圍),

  • 似乎不可能將非sql類型作為參數傳遞給動態語句(記錄,游標)

一種可能的解決方法是將一些id列(SQL Type)綁定到dynamic語句,並使用select子句來查找當前列是否為null:

DECLARE
        isnull NUMBER;
        rec_id NUMBER; -- Identifier of the fetched record
     BEGIN 
        rec_id := rec.id;
        FOR nr IN 1..102 
        LOOP
            DBMS_OUTPUT.PUT_LINE(nr);
            EXECUTE IMMEDIATE 
                'SELECT 1 FROM my_table WHERE id = :idarg ' ||
                   ' AND column_' || nr || ' IS NULL'
              INTO isnull USING rec_id;
            IF isnull = 1 THEN 
                DBMS_OUTPUT.PUT_LINE('test');
            END IF;
        END LOOP;
    END;

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM