PL/SQL中ROWID作为参数



我正在尝试创建一个辅助存储过程来保存重复的代码。

我编写了以下存储过程,它接受表名、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

我在这里做错了什么?

您直接删除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;

如果您将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;

最新更新