發生了一些我不明白的事情。
這是宣告的型別:
type my_type is record (
amount number(18,2),
my_date date
)
my_variable my_type
...
for my_variable in (select sum(table_amount), table_date from table group by table_date)
loop
dbms_output.put_line(my_variable.my_date);
dbms_output.put_line(my_variable.amount)
end loop;
my_variable.my_date 效果很好,但 my_variable.amount 會觸發我不理解的 PLS00302 錯誤。
table structure:
table_date date,
table_amount number(10,2)
uj5u.com熱心網友回復:
回圈宣告了一個隱藏先前宣告的區域變數my_variable。您需要參考列名而不是記錄的屬性:
DECLARE
type my_type is record (
amount number(18,2),
my_date date
);
my_variable my_type;
BEGIN
for my_variable in (select table_amount, table_date from table_name)
loop
dbms_output.put_line(my_variable.table_date);
dbms_output.put_line(my_variable.table_amount);
end loop;
END;
/
這與以下內容相同:
DECLARE
type my_type is record (
amount number(18,2),
my_date date
);
my_variable my_type;
BEGIN
for not_my_variable in (select table_amount, table_date from table_name)
loop
dbms_output.put_line(not_my_variable.table_date);
dbms_output.put_line(not_my_variable.table_amount);
end loop;
END;
/
(但稍微清楚一點,因為您沒有游標回圈變數遮蔽宣告的變數。)
db<>在這里擺弄
uj5u.com熱心網友回復:
您似乎對顯式記錄型別和隱式游標 for-loop 記錄型別感到困惑。您宣告的my_typeand從未使用過。my_variable游標回圈中的my_variablein 是一個完全獨立的構造,您恰好給它起了相同的名稱。從檔案中可以看出:
游標 FOR LOOP 陳述句隱式宣告為游標或select_statement回傳型別的 %ROWTYPE 記錄變數的回圈索引的名稱。
記錄對于游標 FOR LOOP 陳述句是本地的。回圈內的陳述句可以參考記錄及其欄位。他們只能通過別名參考虛擬列。回圈外的陳述句不能參考記錄。游標 FOR LOOP 陳述句運行后,記錄未定義。
所以在這樣的結構中:
for my_variable in (select sum(table_amount), table_date from table group by table_date)
具有游標查詢投影的my_variable行型別,以及對應于列運算式或其別名的欄位。
您需要為 命名sum(),然后參考該別名,例如:
for my_variable in (
select sum(table_amount) as amount, table_date
from my_table
group by table_date
)
loop
dbms_output.put_line(my_variable.table_date);
dbms_output.put_line(my_variable.amount);
end loop;
db<>fiddle更改了一些名稱以與您所描述的內容更加一致。請注意,不需要記錄型別和變數宣告。
轉載請註明出處,本文鏈接:https://www.uj5u.com/qiye/488352.html
