我正在尝试执行动态查询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;
答案 0 :(得分:1)
绑定变量不能在这种情况下使用。
只需删除USING
子句并不要使用它,而是将表名直接连接到SQL字符串,就像:
v_stmt_str := ''SELECT ...... SELECT * FROM ' || p_table_name || ' WHERE .....
......
...... T CREATED_DATE FROM ' || p_table_name || ' WHERE obj .....