我有一個邏輯來實現我必須使用動態sql(列名和where子句決定在飛)。因此,在這裏我的遊標()具有動態sql,並且有3個遊標字段(emp_id,emp_name,dept
)。ORACLE:與動態查詢光標 - 拋出錯誤「無效標識符」的遊標字段
在WHERE
子句中使用這些遊標字段我試圖在循環內執行另一個動態sql .Bt oracle無法識別遊標字段並拋出錯誤,如「ORA-00904:"EMP_REC"."EMP_ID": invalid identifier"
雖然我能夠輸出emp_rec.emp_id
通過DBMS_OUTPUT
注意:請不要對代碼質量,這是不實際的代碼 這只是用來說明問題發表意見,我不能實際的代碼後,由於 一些合規相關的東西。
DECLARE
emp_ref_cursor sys_refcursor;
v_sql varchar2(3900);
TYPE emp_rec_type IS RECORD (emp_id number,emp_name varchar2(100),dept_id varchar2(100));
emp_rec emp_rec_type;
v_dept_id number:='1234';
v_dob varchar2(100);
v_desig varchar2(100);
x_dynamic_col_1 varchar2(100):='dob'; --dynamic column(based on some condition)
x_dynamic_col_2 varchar2(100):='designation'; --dynamic column(based on some condition)
x_dynamic_col_3 varchar2(100):='emp_id'; --dynamic column(based on some condition)
BEGIN
v_sql:='SELECT emp_id,emp_name,dept FROM employee WHERE dept_id=' || v_dept_id;
OPEN emp_ref_cursor FOR v_sql;
LOOP
FETCH emp_ref_cursor INTO emp_rec;
exit WHEN emp_ref_cursor%NOTFOUND;
stmt:='SELECT ' || x_dynamic_col_1 || ',' || x_dynamic_col_2 || '
FROM employee A
WHERE emp_id=emp_rec.' || x_dynamic_col_3;
DBMS_OUTPUT.PUT_LINE(stmt);
--Prints the SQL query as expected
DBMS_OUTPUT.PUT_LINE('emp_rec.emp_id:'||emp_rec.emp_id);
--Displays the value!!!
execute immediate stmt into v_dob, v_desig;
--But why is it saying emp_rec.emp_id is invalid identifier??
END LOOP;
END;
非常感謝,它確實有效。 – AnonymousCoder