你emp_rec
變量是本地的PL/SQL記錄。當您這樣做時,即使使用靜態字段名稱參考:
execute immediate 'begin :x := emp_rec.emp_no; end;'
動態SQL在調用它的塊的單獨上下文中運行。然後在該上下文中運行一個新的匿名PL/SQL塊。
來自外部匿名塊的任何變量(特別是emp_rec
)都超出了動態SQL上下文的範圍。它們只存在於試圖將值賦給:x
的代碼中。
你可能做dbms_sql
東西,使這個充滿活力的,但如果你知道表的列會更容易做到:
declare
l_data varchar2(4000); -- long is deprecated; how big does this really need to be?
emp_rec EMP%rowtype;
begin
select * INTO emp_rec from EMP A WHERE A.EMP_NO = '001322';
for x in (
select column_name, data_type
from user_tab_columns
where table_name = 'EMP'
)
loop
case x.column_name
when 'EMP_NO' then
l_data := emp_rec.emp_no;
-- when clauses for each column in your real table
when 'FIRST_NAME' then
l_data := emp_rec.first_name;
when 'LAST_NAME' then
l_data := emp_rec.last_name;
-- list other columns and assignments
-- else ...
end case;
dbms_output.put_line(x.column_name || ' = ' || l_data);
end loop;
end;
/
雖然作爲@APC指出,循環現在有點沒有意義,因爲你可以這樣做:
declare
emp_rec EMP%rowtype;
begin
select * INTO emp_rec from EMP A WHERE A.EMP_NO = '001322';
dbms_output.put_line('EMP_NO = ' || emp_rec.emp_no);
dbms_output.put_line('FIRST_NAME = ' || emp_rec.first_anme);
dbms_output.put_line('LAST_NAME = ' || emp_rec.last_name);
-- ... any other columns you want to show
end;
/
如果我們要在循環體中對列名進行硬編碼,幾乎不需要查詢USER_TAB_COLUMNS在所有 – APC