PLS-00357:在此上下文中不允许使用表,视图或序列引用“ CHEM_PHYSICAL_PROPERTIES”

时间:2019-04-28 12:50:24

标签: java oracle

我正在尝试执行动态查询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;

1 个答案:

答案 0 :(得分:1)

绑定变量不能在这种情况下使用。
只需删除USING子句并不要使用它,而是将表名直接连接到SQL字符串,就像:

v_stmt_str := ''SELECT ...... SELECT * FROM ' || p_table_name  || ' WHERE ..... 
       ......
       ...... T CREATED_DATE FROM ' || p_table_name || ' WHERE obj .....