оракул - как создать тип объекта для уже существующей таблицы - PullRequest
0 голосов
/ 25 октября 2018

У нас есть требование, когда мы должны передавать имя таблицы объекту pl / SQL во время выполнения.

Ниже приведен пример

create or replace FUNCTION ABC
(P_TABLE VARCHAR2) RETURN NUMBER IS 
C_REFERENCE SYS_REFCURSOR;
V_TABLE VARCHAR2(50):=P_TABLE;
V_C_REF v_table%rowtype;
BEGIN
OPEN C_REFERENCE FOR 'SELECT * FROM '||V_TABLE||;
LOOP
FETCH C_REFERENCE INTO V_C_REF;
EXIT WHEN C_REFERENCE%NOTFOUND;
/*some processing*/
END LOOP;
return(1);
END;

Приведенный выше код даст мнеошибка.Есть ли обходной путь для этого?Имя таблицы может различаться, и разные таблицы будут иметь разную структуру.

1 Ответ

0 голосов
/ 25 октября 2018

Объявление типа строки должно быть статическим (если это не так, компилятор не может определить, действительны ли поля, на которые ссылаются из него).

Возможные решения:

  • Поместите разделенный запятыми список переменных в предложении INTO:

    FETCH C_REFERENCE INTO var1, var2, var3;
    
  • Создайте свою собственную запись

     TYPE  V_C_REF IS RECORD ( col1 VARCHAR2(20), col2 VARCHAR2(25) ); 
    
  • Используйте таблицу с ожидаемой структурой

    vc_ref table1%ROWTYPE;
    
  • , напишите функцию PL / SQL для запроса dba_tab_columns и получите размер столбца и определение типа.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...