Я пытаюсь выполнить динамический запрос SQL «EXECUTE IMMEDIATE», но сталкиваюсь с проблемой как «PLS-00357: ссылка на таблицу, представление или последовательность CHEM_PHYSICAL_PROPERTIES не разрешена в этом контексте», где «CHEM_PHYSICAL_PROPERTIES» - это имя моей динамической таблицы. Пожалуйста, предложите решение по этому вопросу.
Первоначально пытался выполнить то же самое, используя 'SYS_REFCURSOR', но не смог сделать это для динамического имени таблицы типа% rowtype. т.е.
код 1:
CREATE OR REPLACE PROCEDURE updateTargetVal(rowNumber VARCHAR2,p_table_name VARCHAR2, p_object_Id VARCHAR2)
IS
v_my_object_record chem_physical_properties%ROWTYPE;
cur_records SYS_REFCURSOR;
BEGIN
--This procedure modified afterwards without SYS_REFCURSOR
Pr_get_result(p_table_name,p_object_Id,cur_records);
IF (cur_records IS NOT NULL)
THEN
LOOP
FETCH cur_records INTO v_my_object_record;
EXIT WHEN cur_records%NOTFOUND;
DBMS_OUTPUT.PUT_LINE('----'||v_my_object_record.min_value);
END LOOP;
CLOSE cur_records;
END IF;
END updateTargetVal;
Код 2: Тогда Чтобы решить проблему с динамическим именем таблицы «% rowtype», перейдите к приведенному ниже решению, но получите решение выше. поэтому, пожалуйста, предложите путь вперед.
CREATE OR replace PROCEDURE Pr_get_result (p_table_name VARCHAR2,p_object_Id VARCHAR2)
IS
p_prop_code VARCHAR2(50) := 'pH';
BEGIN
EXECUTE IMMEDIATE
'DECLARE ' ||
' TYPE ObjCurTyp IS REF CURSOR; ' ||
' v_obj_cursor ObjCurTyp; ' ||
' v_stmt_str VARCHAR2(1000); ' ||
' v_obj_record ' || p_table_name || '%rowtype; '||
'BEGIN ' ||
' v_stmt_str := ''SELECT * FROM (SELECT * FROM :p_table_name where CREATED_DATE<= (SELECT CREATED_DATE FROM :p_table_name WHERE object_id='||p_object_Id||' AND PROPERTY_CODE='||p_prop_code||') Order By CREATED_DATE DESC) WHERE ROWNUM <= 5'';' ||
' OPEN v_obj_cursor ' ||
' FOR v_stmt_str USING ' ||
p_table_name || ';' ||
' LOOP ' ||
' FETCH v_obj_cursor INTO v_obj_record; ' ||
' EXIT WHEN v_obj_cursor %NOTFOUND; ' ||
' END LOOP; ' ||
'END;';
EXCEPTION
WHEN OTHERS THEN
DBMS_OUTPUT.PUT_LINE(SQLERRM);
END;