Oracle 19c:使用表宏时如何从DBMS_TF.TABLE_T获取VARCHAR2类型表名
Oracle 19c表宏中获取目标表名称的方法
在Oracle 19c使用表宏时,DBMS_TF.TABLE_T结构体里并没有直接提供表名字段,导致无法像示例代码里那样直接通过t.name判断表名。不过可以通过以下方式间接获取:
解决方案:从列元数据中提取表名
DBMS_TF.TABLE_T中的column属性是TABLE_COLUMNS_T类型(即COLUMN_METADATA_T的集合),而每个COLUMN_METADATA_T都包含table_name字段,我们可以通过任意一列的元数据拿到目标表名。
修改后的示例代码如下:
CREATE FUNCTION take (n NUMBER, t DBMS_TF.TABLE_T) RETURN VARCHAR2 SQL_MACRO IS v_table_name VARCHAR2(128); BEGIN -- 从第一列的元数据中获取表名 v_table_name := t.column(1).table_name; -- 根据表名执行自定义逻辑 IF v_table_name = 'FOO' THEN RETURN 'SELECT * FROM t FETCH FIRST take.n ROWS ONLY'; ELSE RETURN 'SELECT * FROM t'; END IF; END; /
注意事项
- 确保传入的表至少包含一列,否则
t.column(1)会抛出下标越界错误,可提前通过t.column.COUNT > 0做判断; - Oracle默认会将未加双引号的表名转为大写,所以判断时要使用大写表名(如果创建表时用了双引号区分大小写,则需匹配原大小写)。
内容的提问来源于stack exchange,提问作者Stsje
相关产品推荐
相关产品推荐

