[英]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.