Oracle 12.2中如何从VARCHAR2(30)迁移至VARCHAR2(128)长表名?
Oracle 12.2标识符长度扩容后的代码适配困扰
从Oracle 12.2开始,表名及诸多其他标识符的最大长度从VARCHAR2(30)变更为VARCHAR2(128)了。
我们这边有大量涉及表名、列名的脚本、存储过程和业务表,主要用于日常维护操作——比如复制表、删除分区这类工作。
补充说明:只要出现第一个超长名称的对象,现有这些代码就得修改才能正常运行。虽然大家都习惯了短名称,适应起来可能需要点时间,但这种情况迟早会来的。
针对存储过程,我已经想到了合适的修改方式:
原来的写法是:
CREATE OR REPLACE PROCEDURE myprocedure(pname VARCHAR2) IS tabname VARCHAR2(30); colname VARCHAR2(30); idxname VARCHAR2(30); BEGIN tabname := pname; END myprocedure; /
现在改成用数据字典的%TYPE来定义变量,这样就能自动适配标识符的长度变化:
CREATE OR REPLACE PROCEDURE myprocedure(pname VARCHAR2) IS tabname USER_TABLES.TABLE_NAME%TYPE; colname USER_TAB_COLUMNS.COLUMN_NAME%TYPE; idxname USER_INDEXES.INDEX_NAME%TYPE; BEGIN tabname := pname; END myprocedure; /
但现在遇到个难题:如果是表里面要存储这类标识符(比如表名),该怎么处理呢?我能想到的唯一办法是用禁用的外键关联数据字典表,但感觉这办法不太妥当,而且我还拿不到对应的权限:
CREATE TABLE mytable ( table_name REFERENCES USER_TABLES(TABLE_NAME) DISABLE );
有没有大佬能给我支个招呀?
内容的提问来源于stack exchange,提问作者wolφi
相关产品推荐
相关产品推荐

