为提高效率,提问时请提供以下信息,问题描述清晰可优先响应。
【DM版本】:V8版本
【操作系统】:
【CPU】:
【问题描述】*: 达梦数据库可以创建auto_increment和identity类型的序列器,那么我如何查询指定schema下面所有存在这两种序列器类型的表的表名和自增序列的列名?以及他们的序列器当前值(不往前推进)
DECLARE
-- 声明变量存储查询结果
v_table_name SYS.SYSOBJECTS.NAME%TYPE; -- 表名
v_column_name SYS.SYSCOLUMNS.NAME%TYPE; -- 列名
v_table_def VARCHAR2(4000); -- 表结构定义(TABLEDEF返回值)
v_auto_inc VARCHAR2(100); -- 提取的AUTO_INCREMENT值
v_ident_val NUMBER; -- IDENT_CURRENT返回值
v_result VARCHAR2(100); -- 最终结果(二选一)
V_OWNER VARCHAR2(100) := 'SYSDBA';
-- 声明游标,对应原SQL的查询逻辑
CURSOR c_col IS
SELECT
b.NAME AS TABLE_NAME,
a.NAME AS COLUMN_NAME
FROM
SYS.SYSCOLUMNS a,
SYS.SYSOBJECTS b
WHERE
a.INFO2 & 0x01 = 0x01 -- 筛选自增列(假设该条件有效)
AND a.ID = b.ID
AND b.NAME IN (SELECT TABLE_NAME FROM DBA_TABLES WHERE OWNER = V_OWNER);
BEGIN
-- 打开游标并遍历
OPEN c_col;
LOOP
FETCH c_col INTO v_table_name, v_column_name;
EXIT WHEN c_col%NOTFOUND; -- 退出循环条件
-- 1. 获取表结构定义(TABLEDEF函数)
v_table_def := TABLEDEF(V_OWNER, v_table_name);
-- 2. 提取AUTO_INCREMENT = X中的X
v_auto_inc := REGEXP_SUBSTR(v_table_def, 'AUTO_INCREMENT = (\d+)', 1, 1, 'i', 1);
-- 3. 条件判断:有AUTO_INCREMENT则用其值,否则用IDENT_CURRENT
IF v_auto_inc IS NOT NULL THEN
v_result := v_auto_inc;
ELSE
-- 动态SQL执行IDENT_CURRENT(表名是变量,需动态拼接)
EXECUTE IMMEDIATE
'SELECT IDENT_CURRENT('''||V_OWNER||'.' || v_table_name || ''') FROM DUAL'
INTO v_ident_val;
v_result := TO_CHAR(v_ident_val); -- 转为字符串统一格式
END IF;
-- 4. 输出结果(表名、列名、计算结果)
print(
'表名: ' || v_table_name ||
',列名: ' || v_column_name ||
',当前自增列值: ' || v_result
);
END LOOP;
CLOSE c_col;
EXCEPTION
WHEN OTHERS THEN
DBMS_OUTPUT.PUT_LINE('执行错误: ' || SQLERRM);
IF c_col%ISOPEN THEN
CLOSE c_col; -- 异常时确保游标关闭
END IF;
END;
/

查询SCHEMA QWE下存在auto_increment和identity两种自增属性的表语句如下:
查看一张表当前自增列的值可以通过函数来查询