PLS-00357: ссылка на таблицу, представление или последовательность 'CHEM_PHYSICAL_PROPERTIES' не разрешена в этом контексте - PullRequest
0 голосов
/ 28 апреля 2019

Я пытаюсь выполнить динамический запрос 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 Ответ

1 голос
/ 28 апреля 2019

Переменные связывания не могут использоваться в этом контексте.
Просто удалите предложение USING и не используйте его, но вместо этого объедините имя таблицы непосредственно в строку SQL, например:

v_stmt_str := ''SELECT ...... SELECT * FROM ' || p_table_name  || ' WHERE ..... 
       ......
       ...... T CREATED_DATE FROM ' || p_table_name || ' WHERE obj .....
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...