Вопрос по stored-procedures, plsql, oracle, rowtype – как передать имя таблицы в качестве параметра хранимой процедуре?

1

Можно ли создатьrowtype для имени таблицы, которая передается в качестве параметраStored-Procedure а также как я знаю столбцы для их решения вDBMS_OUUTPUT.PUT_LINE() заявление.

Конечный пользователь может дать любое имя пользователя (схему) и имя таблицы

Я хочу сделать что-то, как показано ниже, но это не работает.

 CREATE OR REPLACE PROCEDURE SP_PASS(USER_NAME VARCHAR2,TAB_NAME IN VARCHAR2)
 AS
    TYPE REF_CUR IS REF CURSOR;
    V_ARR REF_CUR;
    V_SQL VARCHAR(200);
    V_ROWTYPE USER_NAME.TAB_NAME%ROWTYPE;
 BEGIN
     V_SQL := 'SELECT * FROM '||USER_NAME||'.'||TAB_NAME;
     OPEN V_ARR FOR V_SQL;
     LOOP
     FETCH V_ARR INTO V_ROWTYPE;
     EXIT WHEN V_ARR%NOT FOUND;
     DBMS_OUTPUT.PUT_LINE(V_ROWTYPE.COL1||','||V_ROWTYPE.COL2||','||V_ROWTYPE.COL3);
     END LOOP;
     CLOSE V_ARR;
END;

Дайте мне знать, если это возможно.

Благодарю.

Ваш Ответ

1   ответ
6

Вы не можете создать%ROWTYPE переменная для неизвестной таблицы, и вы не можете статически обращаться к именам столбцов, если вы не знаете имя таблицы во время компиляции.

Вы можете использоватьпакет dbms_sql иметь дело с полностью динамическими операторами SQL. Вам нужно будет подготовить оператор SQL, описать столбцы, чтобы узнать количество столбцов и их типы данных, связать соответствующие переменные и затем извлечь данные. Это гораздо более громоздкий способ написания кода, чем пример, который вы опубликовали, но он дает вам чрезвычайную гибкость.

В документации, на которую я ссылаюсь, есть несколько примеров использования пакета dbms_sql. Вы также можете проверить Tom Kyteфункция dump_csv который записывает результат произвольного запроса в файл CSV, используяUTL_FILE, Если вы действительно хотите записать данные вDBMS_OUTPUTВы можете просто заменитьUTL_FILE звонки сDBMS_OUTPUT, Но я уверен, что вы хотите сделать что-то более полезное, чем просто записать данные вDBMS_OUTPUT буфер, так что процедура Тома, вероятно, ближе к тому, что вы действительно пытаетесь выполнить.

Похожие вопросы