2015-07-21 3 views
1

Я пытаюсь создать вспомогательную хранимую процедуру для сохранения повторного кода.ROWID как параметры в PL/SQL

Я написал следующую хранимую процедуру, которая принимает имя таблицы, status_id и ROWID.

PROCEDURE sp_update_stage_status(p_table_name IN VARCHAR2, 
           p_status_id IN NUMBER, 
           p_rowid IN ROWID) 
AS 
BEGIN  
    execute immediate 'UPDATE ' || p_table_name 
       || ' SET STATUS_ID = ' || p_status_id 
       || ' WHERE ROWID = ' || p_rowid;  
END; 

Однако всякий раз, когда я его выполняю, я получаю следующее.

ORA-00904: "AAATQEAAEAAAAHEAAB": invalid identifier 
ORA-06512: at "OBR_DEV.PKG_COMMON", line 32 
ORA-06512: at "OBR_DEV.PKG_DIRECTORY", line 449 

Что я здесь делаю неправильно?

+0

Чтобы быть более универсальным, вы должны использовать тип данных'UROWID' –

ответ

6

Вы отбрасываете содержимое rowid непосредственно без его цитирования.

Ваш запрос стал WHERE ROWID = AAATQEAAEAAAAHEAAB который сравнивает колонку rowid с колонкой AAATQEAAEAAAAHEAAB.
Это должно быть WHERE ROWID = 'AAATQEAAEAAAAHEAAB'. Добавьте некоторые цитаты в динамический SQL, и вы должны быть в порядке.

Или еще лучше, использовать переменные связывания и не беспокоиться о процитировать:

EXECUTE IMMEDIATE 
    'UPDATE ' || p_table_name || ' SET status_id = :status WHERE rowid = :seek_rowid' 
    USING p_status_id, p_rowid; 
+0

Ahhhh совершенны, спасибо так много, я снова, как PL/SQL – greyfox

-2

Вы объявляете p_rowid как rowid типа, вы должны объявить p_rowid в varchar2(18).

PROCEDURE sp_update_stage_status(
    p_table_name IN VARCHAR2, 
    p_status_id IN NUMBER, 
    p_rowid IN VARCHAR2(18) 
) AS 
BEGIN 
    execute immediate 'UPDATE ' || p_table_name || ' SET STATUS_ID = ' || p_status_id || ' WHERE ROWID = ' || p_rowid; 
END;